Merge pull request #97 from Strikingwolf/string-koan

String koan
This commit is contained in:
Colin Jones 2015-10-02 19:08:41 -05:00
commit b64b17fc51
26 changed files with 334 additions and 51 deletions

202
.gitignore vendored
View File

@ -1,11 +1,203 @@
*~ *~
bin bin
classes
lib
releases releases
target
*.jar *.jar
.DS_Store
# Created by https://www.gitignore.io/api/clojure,osx,linux,windows,leiningen,intellij,eclipse,sublimetext
### Clojure ###
pom.xml
pom.xml.asc
*jar
/lib/
/classes/
/target/
/checkouts/
.lein-deps-sum .lein-deps-sum
.lein-plugins
.lein-repl-history .lein-repl-history
.lein-plugins/
.lein-failures
.nrepl-port
### OSX ###
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Linux ###
*~
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
### Windows ###
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msm
*.msp
# Windows shortcuts
*.lnk
### Leiningen ###
pom.xml
pom.xml.asc
*jar
/lib/
/classes/
/target/
/checkouts/
.lein-deps-sum
.lein-repl-history
.lein-plugins/
.lein-failures
.nrepl-port
### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
*.iml
## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml
# Gradle:
# .idea/gradle.xml
# .idea/libraries
# Mongo Explorer plugin:
# .idea/mongoSettings.xml
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
### Eclipse ###
*.pydevproject
.metadata
.gradle
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
# Eclipse Core
.project
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# JDT-specific (Eclipse Java Development Tools)
.classpath
# Java annotation processor (APT)
.factorypath
# PDT-specific
.buildpath
# sbteclipse plugin
.target
# TeXlipse plugin
.texlipse
### SublimeText ###
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# workspace files are user-specific
*.sublime-workspace
# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project
# sftp configuration file
sftp-config.json

View File

@ -3,7 +3,6 @@ Concepts / Language Features
Quoting Quoting
strings & character literals
new record syntax new record syntax
Agents Agents
Vars Vars
@ -27,4 +26,3 @@ map-indexed
partition-all partition-all
partition-by partition-by
repeatedly repeatedly

View File

@ -1,6 +1,6 @@
(defproject clojure-koans "0.5.1-SNAPSHOT" (defproject clojure-koans "0.5.1-SNAPSHOT"
:description "The Clojure koans." :description "The Clojure koans."
:dependencies [[org.clojure/clojure "1.5.1"] :dependencies [[org.clojure/clojure "1.7.0"]
[koan-engine "0.2.3"]] [koan-engine "0.2.3"]]
:dev-dependencies [[lein-koan "0.1.3"]] :dev-dependencies [[lein-koan "0.1.3"]]
:profiles {:dev {:dependencies [[lein-koan "0.1.3"]]}} :profiles {:dev {:dependencies [[lein-koan "0.1.3"]]}}

View File

@ -10,7 +10,31 @@
"hello" "hello"
3]}] 3]}]
["02_lists" {"__" [1 2 3 4 5 ["02_strings" {"__" ["hello"
"world"
"Cool "
"right?"
0
11
false
6 11
"123"
", "
"1" "2" "3"
"olleh"
"hello"
13
-1
"hello world"
true
false
false
"a"
true
true
false]}]
["03_lists" {"__" [1 2 3 4 5
1 1
[2 3 4 5] [2 3 4 5]
3 3
@ -23,7 +47,7 @@
"No dice!" "No dice!"
()]}] ()]}]
["03_vectors" {"__" [1 ["04_vectors" {"__" [1
[1] [1]
[nil nil] [nil nil]
2 2
@ -34,14 +58,14 @@
[:butter :and] [:butter :and]
3]}] 3]}]
["04_sets" {"__" [[3] ["05_sets" {"__" [[3]
3 3
#{1 2 3 4 5} #{1 2 3 4 5}
#{1 2 3 4 5} #{1 2 3 4 5}
#{2 3} #{2 3}
#{1 4}]}] #{1 4}]}]
["05_maps" {"__" [:b 2 ["06_maps" {"__" [:b 2
1 1
2 2
2 2
@ -57,7 +81,7 @@
2010 2014 2018 2010 2014 2018
"PyeongChang" "Sochi" "Vancouver"]}] "PyeongChang" "Sochi" "Vancouver"]}]
["06_functions" {"__" [81 ["07_functions" {"__" [81
20 20
10 10
60 60
@ -68,7 +92,7 @@
(fn [f] (f 5)) (fn [f] (f 5))
(fn [f] (f 5))]}] (fn [f] (f 5))]}]
["07_conditionals" {"__" [:a ["08_conditionals" {"__" [:a
[] []
nil nil
:glory :glory
@ -77,7 +101,7 @@
:bicycling :bicycling
"is that even exercise?"]}] "is that even exercise?"]}]
["08_higher_order_functions" {"__" [4 8 12 ["09_higher_order_functions" {"__" [4 8 12
(* x x) (* x x)
[false false true false false] [false false true false false]
() ()
@ -88,14 +112,14 @@
100 100
(count a) (count b)]}] (count a) (count b)]}]
["09_runtime_polymorphism" {"__" [(str (:name a) " eats veggies.") ["10_runtime_polymorphism" {"__" [(str (:name a) " eats veggies.")
(str (:name a) " eats animals.") (str (:name a) " eats animals.")
(str "I don't know what " (:name a) " eats.") (str "I don't know what " (:name a) " eats.")
"Hello World!" "Hello World!"
"Hello, you silly world." "Hello, you silly world."
"Hello to this group: Peter, Paul, Mary!" ]}] "Hello to this group: Peter, Paul, Mary!" ]}]
["10_lazy_sequences" {"__" [[1 2 3 4] ["11_lazy_sequences" {"__" [[1 2 3 4]
[0 1 2 3 4] [0 1 2 3 4]
10 10
95 95
@ -103,14 +127,14 @@
:a] :a]
"___" [(fn [x] x)]}] "___" [(fn [x] x)]}]
["11_sequence_comprehensions" {"__" [[0 1 2 3 4 5] ["12_sequence_comprehensions" {"__" [[0 1 2 3 4 5]
(* x x) (* x x)
(range 10) (range 10)
(odd? x) (* x x) (odd? x) (* x x)
[row column] [row column]
]}] ]}]
["12_creating_functions" {"__" [true false true ["13_creating_functions" {"__" [true false true
4 4
:a :b :c :d :a :b :c :d
:c :d :c :d
@ -120,7 +144,7 @@
multiply-by-5 multiply-by-5
(comp dec square)]}] (comp dec square)]}]
["13_recursion" {"__" [true ["14_recursion" {"__" [true
acc acc
(loop [coll coll (loop [coll coll
acc ()] acc ()]
@ -134,7 +158,7 @@
(recur (dec n) (* acc n))))] (recur (dec n) (* acc n))))]
"___" [not]}] "___" [not]}]
["14_destructuring" {"__" [":bar:foo" ["15_destructuring" {"__" [":bar:foo"
(format (str "An Oxford comma list of %s, " (format (str "An Oxford comma list of %s, "
"%s, " "%s, "
"and %s.") "and %s.")
@ -156,7 +180,7 @@
street-address ", " city ", " state)) street-address ", " city ", " state))
]}] ]}]
["15_refs" {"__" ["hello" ["16_refs" {"__" ["hello"
"hello" "hello"
"better" "better"
"better!!!" "better!!!"
@ -165,7 +189,7 @@
] ]
"___" [(fn [x] (+ 20 x))]}] "___" [(fn [x] (+ 20 x))]}]
["16_atoms" {"__" [0 ["17_atoms" {"__" [0
1 1
(swap! atomic-clock (partial + 4)) (swap! atomic-clock (partial + 4))
20 20
@ -173,7 +197,7 @@
atomic-clock 20 :fin atomic-clock 20 :fin
]}] ]}]
["17_macros" {"__" [~(first form) ["18_macros" {"__" [~(first form)
~(nth form 2) ~(nth form 2)
form form
(drop 2 form) (drop 2 form)
@ -183,7 +207,7 @@
'(* 10 2) '(* 10 2)
'(+ 10 (2 * 3))]}] '(+ 10 (2 * 3))]}]
["18_datatypes" {"__" [(print ["19_datatypes" {"__" [(print
(str "You're really the " (str "You're really the "
(.category this) (.category this)
", " recipient "... sorry.")) ", " recipient "... sorry."))
@ -195,7 +219,7 @@
(str "Congratulations on your Best Picture Oscar, " (str "Congratulations on your Best Picture Oscar, "
"Evil Alien Conquerors!")]}] "Evil Alien Conquerors!")]}]
["19_java_interop" {"__" [java.lang.String ["20_java_interop" {"__" [java.lang.String
"SELECT * FROM" "SELECT * FROM"
10 10
1024 1024
@ -203,14 +227,14 @@
"___" [#(.toUpperCase %) "___" [#(.toUpperCase %)
] ]
}] }]
["20_partition" {"__" [partition ["21_partition" {"__" [partition
[:a :b :c] [:a :b :c]
'((0 1 2) (3 4)) '((0 1 2) (3 4))
5 5
:hello :hello
(6 :these :are) (6 :these :are)
]}] ]}]
["21_group_by" {"__" [odd? ["22_group_by" {"__" [odd?
{5 ["hello" "world"] 3 ["foo" "bar"]} {5 ["hello" "world"] 3 ["foo" "bar"]}
{1 [{:name "Bob" :id 1} {1 [{:name "Bob" :id 1}
{:last-name "Smith" :id 1}] {:last-name "Smith" :id 1}]
@ -219,7 +243,7 @@
{:naughty-list [{:name "Jimmy" :bad true} {:naughty-list [{:name "Jimmy" :bad true}
{:name "Joe" :bad true}] {:name "Joe" :bad true}]
:nice-list [{:name "Jane" :bad false}]}]}] :nice-list [{:name "Jane" :bad false}]}]}]
["22_meta" {"__" [{:league "National League"} ["23_meta" {"__" [{:league "National League"}
{:division "West"} {:division "West"}
"This doesn't implement the IObj interface" "This doesn't implement the IObj interface"
{:foo :bar} {:foo :bar}

70
src/koans/02_strings.clj Normal file
View File

@ -0,0 +1,70 @@
(ns koans.02-strings
(:require [koan-engine.core :refer :all]
[clojure.string :as string]))
(meditations
"A string is nothing more than text surrounded by double quotes"
(= __ "hello")
"But double quotes are just magic on top of something deeper"
(= __ (str 'world))
"You can do more than create strings, you can put them together"
(= "Cool right?" (str __ __))
"You can even get certain characters"
(= \C (get "Characters" __))
"Or even count the characters"
(= __ (count "Hello World"))
"But strings and characters are not the same"
(= __ (= \c "c"))
"What if you only wanted to get part of a string?"
(= "World" (subs "Hello World" __ __))
"How about joining together elements in a list?"
(= __ (string/join '(1 2 3)))
"What if you wanted to separate them out?"
(= "1, 2, 3" (string/join __ '(1 2 3)))
"Maybe you want to separate out all your lines"
(= [__ __ __] (string/split-lines "1\n2\n3"))
"You may want to make sure your words are backwards"
(= __ (string/reverse "hello"))
"Maybe you want to find the index of the first occurence of a substring"
(= 0 (.indexOf "hello world" __))
"Or maybe the last index of the same"
(= __ (.lastIndexOf "hello world, hello" "hello"))
"But when something doesn't exist, it turns up negative"
(= __ (.indexOf "hello world" "bob"))
"Sometimes you don't want whitespace cluttering the front and back"
(= __ (string/trim " \nhello world \t \n"))
"You can check if something is a char"
(= __ (char? \c))
"But it may not be"
(= __ (char? "a"))
"But chars aren't strings"
(= __ (string? \b))
"Strings are strings"
(= true (string? __))
"Some strings may be blank"
(= __ (string/blank? ""))
"Even if at first glance they aren't"
(= __ (string/blank? " \n \t "))
"However, most strings aren't blank"
(= __ (string/blank? "hello?\nare you out there?")))

View File

@ -1,4 +1,4 @@
(ns koans.02-lists (ns koans.03-lists
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations
@ -43,4 +43,3 @@
(rest '()) (rest '())
(catch IllegalStateException e (catch IllegalStateException e
"No dice!")))) "No dice!"))))

View File

@ -1,4 +1,4 @@
(ns koans.03-vectors (ns koans.04-vectors
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.04-sets (ns koans.05-sets
(:require [koan-engine.core :refer :all] (:require [koan-engine.core :refer :all]
[clojure.set :as set])) [clojure.set :as set]))

View File

@ -1,4 +1,4 @@
(ns koans.05-maps (ns koans.06-maps
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.06-functions (ns koans.07-functions
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defn multiply-by-ten [n] (defn multiply-by-ten [n]

View File

@ -1,4 +1,4 @@
(ns koans.07-conditionals (ns koans.08-conditionals
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defn explain-exercise-velocity [exercise-term] (defn explain-exercise-velocity [exercise-term]

View File

@ -1,4 +1,4 @@
(ns koans.08-higher-order-functions (ns koans.09-higher-order-functions
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.09-runtime-polymorphism (ns koans.10-runtime-polymorphism
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defn hello (defn hello

View File

@ -1,4 +1,4 @@
(ns koans.10-lazy-sequences (ns koans.11-lazy-sequences
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.11-sequence-comprehensions (ns koans.12-sequence-comprehensions
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.12-creating-functions (ns koans.13-creating-functions
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defn square [x] (* x x)) (defn square [x] (* x x))

View File

@ -1,4 +1,4 @@
(ns koans.13-recursion (ns koans.14-recursion
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defn is-even? [n] (defn is-even? [n]

View File

@ -1,4 +1,4 @@
(ns koans.14-destructuring (ns koans.15-destructuring
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(def test-address (def test-address

View File

@ -1,4 +1,4 @@
(ns koans.15-refs (ns koans.16-refs
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(def the-world (ref "hello")) (def the-world (ref "hello"))

View File

@ -1,4 +1,4 @@
(ns koans.16-atoms (ns koans.17-atoms
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(def atomic-clock (atom 0)) (def atomic-clock (atom 0))

View File

@ -1,4 +1,4 @@
(ns koans.17-macros (ns koans.18-macros
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defmacro hello [x] (defmacro hello [x]

View File

@ -1,4 +1,4 @@
(ns koans.18-datatypes (ns koans.19-datatypes
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defrecord Nobel [prize]) (defrecord Nobel [prize])

View File

@ -1,4 +1,4 @@
(ns koans.19-java-interop (ns koans.20-java-interop
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.20-partition (ns koans.21-partition
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(meditations (meditations

View File

@ -1,4 +1,4 @@
(ns koans.21-group-by (ns koans.22-group-by
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(defn get-odds-and-evens [coll] (defn get-odds-and-evens [coll]

View File

@ -1,4 +1,4 @@
(ns koans.22-meta (ns koans.23-meta
(:require [koan-engine.core :refer :all])) (:require [koan-engine.core :refer :all]))
(def giants (def giants