My 4Clojure Solutions(1 to 50)
All the code snippets below are live and interactive. You can modify the code and it will be evaluated in your browser as you type.
1. Nothing but the Truth
xxxxxxxxxx(= true true)xtrue
2. Simple Math
xxxxxxxxxx(= (- 10 (* 2 3)) 4)xxxxxxxxxxtrue
3. Intro to Strings
xxxxxxxxxx(= "HELLO WORLD" (.toUpperCase "hello world"))xxxxxxxxxxtrue
4. Intro to Lists
xxxxxxxxxx(= (list :a :b :c) (:a :b :c))xxxxxxxxxxtrue
5. Lists: conj
xxxxxxxxxx(= (1 2 3 4) (conj (2 3 4) 1))xxxxxxxxxxtrue
xxxxxxxxxx(= (1 2 3 4) (conj (3 4) 2 1))xxxxxxxxxxtrue
6. Intro to Vectors
xxxxxxxxxx(= [:a :b :c] (list :a :b :c) (vec (:a :b :c)) (vector :a :b :c))xxxxxxxxxxtrue
7. Vectors: conj
xxxxxxxxxx(= [1 2 3 4] (conj [1 2 3] 4))xxxxxxxxxxtrue
xxxxxxxxxx(= [1 2 3 4] (conj [1 2] 3 4))xxxxxxxxxxtrue
8. Intro to Sets
xxxxxxxxxx(= {:a :b :c :d} (set (:a :a :b :c :c :c :c :d :d)))xxxxxxxxxxtrue
xxxxxxxxxx(= {:a :b :c :d} (clojure.set/union {:a :b :c} {:b :c :d}))xxxxxxxxxxtrue
9. Sets: conj
xxxxxxxxxx(= {1 2 3 4} (conj {1 4 3} 2))xxxxxxxxxxtrue
10. Intro to Maps
xxxxxxxxxx(= 20 ((hash-map :a 10, :b 20, :c 30) :b))xxxxxxxxxxtrue
xxxxxxxxxx(= 20 (:b {:a 10, :b 20, :c 30}))xxxxxxxxxxtrue
11. Maps: conj
xxxxxxxxxx(= {:a 1, :b 2, :c 3} (conj {:a 1} [:b 2] [:c 3]))xxxxxxxxxxtrue
12. Intro to Sequences
xxxxxxxxxx(= 3 (first (3 2 1)))xxxxxxxxxxtrue
xxxxxxxxxx(= 3 (second [2 3 4]))xxxxxxxxxxtrue
xxxxxxxxxx(= 3 (last (list 1 2 3)))xxxxxxxxxxtrue
13. Sequences: rest
xxxxxxxxxx(= [20 30 40] (rest [10 20 30 40]))xxxxxxxxxxtrue
14. Intro to Functions
xxxxxxxxxx(= 8 ((fn add-five [x] (+ x 5)) 3))xxxxxxxxxxtrue
xxxxxxxxxx(= 8 ((fn [x] (+ x 5)) 3))xxxxxxxxxxtrue
xxxxxxxxxx(= 8 ((+ % 5) 3))xxxxxxxxxxtrue
xxxxxxxxxx(= 8 ((partial + 5) 3))xxxxxxxxxxtrue
15. Double Down
xxxxxxxxxx(defn double-down [x](* x 2))(= (double-down 3) 6)xxxxxxxxxxtrue
16. Hello World
xxxxxxxxxx(= ((str "Hello, " % "!") "Dave")"Hello, Dave!")xxxxxxxxxxtrue
17. Sequences: map
xxxxxxxxxx(= (6 7 8) (map (+ % 5) (1 2 3)))xxxxxxxxxxtrue
18. Sequences: filter
xxxxxxxxxx(= (6 7) (filter (> % 5) (3 4 5 6 7)))xxxxxxxxxxtrue
19. Last Element
xxxxxxxxxx(= (-> [1 2 3 4 5]reversefirst) 5)xxxxxxxxxxtrue
xxxxxxxxxx(defn last-elem [[head & tail]](if (seq tail)(recur tail)head))(= (last-elem [1 2 3 4 5]) 5)xxxxxxxxxxtrue
20. Penultimate Element
xxxxxxxxxx(= (-> (1 2 3 4 5)reverserestfirst) 4)xxxxxxxxxxtrue
xxxxxxxxxx(defmulti penultimate(fn [input](= (count input) 1)))(defmethod penultimate true [input] nil)(defmethod penultimate false [[head after_head & tail :as input]](if (seq tail)(recur (rest input))head))(println (= (penultimate (1 2 3 4 5)) 4))(println (= (penultimate (1)) nil))(println (= (penultimate ()) nil))xxxxxxxxxxtrueniltrue
21. Nth Element
xxxxxxxxxx(defn my-nth [input_seq n]{:pre [(>= n 0)]}(loop [counter 0input input_seq](if (= counter n)(first input)(recur (inc counter) (rest input)))))(println (= (my-nth (4 5 6 7) 2) 6))(my-nth (4 5 6 7) -1)xxxxxxxxxxtruetrueExecution error.ERROR: Error: Assert failed: (>= n 0)
xxxxxxxxxx(= ((->> %1(drop %2)first) (4 5 6 7) 2) 6)xxxxxxxxxxtruetruetruetruetrue
22. Count a Sequence
xxxxxxxxxx(defn my-count [input_seq](apply +(for [elem input_seq] 1)))(println (= (my-count (1 2 3 3 1)) 5))(println (= (my-count "Hello World") 11))xxxxxxxxxxnil
23. Reverse a Sequence
xxxxxxxxxx(= ((into () %) [1 2 3 4 5])[5 4 3 2 1])xxxxxxxxxxtrue
24. Sum It All Up
xxxxxxxxxx(= ((apply + %) [1 2 3]) 6)xxxxxxxxxxtrue
25. Find the odd numbers
xxxxxxxxxx(= ((filter odd? %) [4 2 1 6]) (1))xxxxxxxxxxtrue
26. Fibonacci Sequence
xxxxxxxxxx(defn fib [n](->> (iterate (fn [[a b]] [b (+ a b)]) [1 1])(map first)(take n)))(= (fib 8) (1 1 2 3 5 8 13 21))xxxxxxxxxxtrue
27. Palindrome Detector
xxxxxxxxxx(defn palindrome? [[head & tail :as input_seq]](cond(= (count input_seq) 1) true(empty? input_seq) true:else (and (= head (last tail)) (recur (butlast tail)))))(true? (palindrome? "racecar"))xxxxxxxxxxtrue
28. Flatten a Sequence
xxxxxxxxxx(defn- my-flatten-helper [[head & tail :as input_seq] result](cond(empty? input_seq) result(sequential? head) (recur tail (concat (my-flatten-helper head ()) result)):else (recur tail (conj result head))))(defn my-flatten [input-seq](reverse (my-flatten-helper input-seq ())))(println (= (my-flatten ((1 2) 3 [4 [5 6]])) (1 2 3 4 5 6)))(println (= (my-flatten ["a" ["b"] "c"]) ("a" "b" "c")))(println (= (my-flatten ((((:a))))) (:a)))xxxxxxxxxxtruenil
29. Get the Caps
xxxxxxxxxx(defn is-upper? [input_char](contains?(set "ABCDEFGHIJKLMNOPQRSTUVWXYZ")input_char))(defn get-caps [input_string](apply str (filter is-upper? input_string)))(println (= (get-caps "HeLlO, WoRlD!") "HLOWRD"))(println (empty? (get-caps "nothing")))(println (= (get-caps "$#A(*&987Zf") "AZ"))xxxxxxxxxxtruetruenil
30. Compress a Sequence
xxxxxxxxxx(defn compress [input_seq](loop [[head & tail :as input] input_seqresult ()](cond(empty? input) (reverse result)(= head (first result)) (recur tail result):else (recur tail (cons head result)))))(= (apply str (compress "Leeeeeerrroyyy")) "Leroy")xxxxxxxxxxtruetrue
31. Pack a Sequence
xxxxxxxxxx(defn pack [input_seq](loop [[head & tail :as input] input_seq[result_head & result_tail :as result] ()](cond(empty? input) (reverse result)(= head (first result_head)) (recur tail (cons (cons head result_head) result_tail)):else (recur tail (cons (list head) result)))))(= (pack [1 1 2 1 1 1 3 3]) ((1 1) (2) (1 1 1) (3 3)))xxxxxxxxxxtrue
32. Duplicate a Sequence
xxxxxxxxxx(defn duplicate [input_seq](loop [[head & tail :as input] input_seqresult ()](if (empty? input)(reverse result)(recur tail (conj result head head)))))(= (duplicate [1 2 3]) (1 1 2 2 3 3))xxxxxxxxxxtrue
33. Replicate a Sequence
xxxxxxxxxx(defn replicate [input_seq n](loop [[head & tail :as input] input_seqresult ()](if (empty? input)(reverse result)(recur tail (concat (repeat n head) result)))))(= (replicate [1 2 3] 2) (1 1 2 2 3 3))xxxxxxxxxxWARNING: replicate already refers to: cljs.core/replicate being replaced by: cljs.user/replicate at line 1true
34. Implement range
xxxxxxxxxx(defn my-range [start end](loop [counter startresult ()](if (= counter end)(reverse result)(recur (inc counter) (conj result counter)))))(= (my-range 1 4) (1 2 3))xxxxxxxxxxtrue
35. Local bindings
xxxxxxxxxx(= 7 (let [x 5] (+ 2 x)))(= 7 (let [x 3, y 10] (- y x)))(= 7 (let [x 21] (let [y 3] (/ x y))))xxxxxxxxxxtrue
36. Let it Be
xxxxxxxxxx(println (= 10 (let [x 7 y 3 z 1] (+ x y))))(println (= 4 (let [x 7 y 3 z 1] (+ y z))))(println (= 1 (let [x 7 y 3 z 1] z)))xxxxxxxxxxtruenil
37. Regular Expressions
xxxxxxxxxx(= "ABC" (apply str (re-seq "[A-Z]+" "bA1B3Ce ")))xxxxxxxxxxtruetrue
38. Maximum value
xxxxxxxxxx(defn my-max [& args](loop [[head & tail :as input] argsresult head](cond(empty? input) result(> head result) (recur tail head):else (recur tail result))))(= (my-max 45 67 11) 67)xxxxxxxxxxtruetruetruetruetruetrue
39. Interleave Two Seqs
xxxxxxxxxx(defn my-interleave [seq1 seq2](loop [[head1 & tail1 :as s1] seq1[head2 & tail2 :as s2] seq2result ()](cond(or (empty? s1) (empty? s2)) (reverse result):else (recur tail1 tail2 (conj result head1 head2)))))(= (my-interleave [1 2 3] [:a :b :c]) (1 :a 2 :b 3 :c))xxxxxxxxxxtrue
40. Interpose a Seq
xxxxxxxxxx(defn my-interpose [elem input_seq](loop [[head & tail :as input] input_seqresult ()](if (empty? input)(butlast (reverse result))(recur tail (conj result head elem)))))(= (my-interpose :z [:a :b :c :d]) [:a :z :b :z :c :z :d])xxxxxxxxxxtrue
41. Drop Every Nth Item
xxxxxxxxxx(defn drop-nth [input_seq n](loop [[head & tail :as input] input_seqcounter 1result ()](cond(empty? input) (reverse result)(= counter n) (recur tail 1 result):else (recur tail (inc counter) (conj result head)))))(= (drop-nth [1 2 3 4 5 6] 4) [1 2 3 5 6])xxxxxxxxxxtrue
42. Factorial Fun
xxxxxxxxxx(def factorial (memoize (fn [n]{:pre [(>= n 0)]}(condp = n0 1(* n (factorial (dec n)))))))(= (factorial 8) 40320)xxxxxxxxxxtrue
43. Reverse Interleave
(defn reverse-interleave [input_seq n]
(loop [input input_seq
result (vec (repeat n []))
counter 0]
(match [input counter]
[([] :seq) _] result
[_ n] (recur input result 0)
[([head & tail] :seq) counter] (recur tail
(update-in result [counter] #(conj % head))
(inc counter)))))
(println (= (reverse-interleave [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6))))
(println (= (reverse-interleave (range 9) 3) '((0 3 6) (1 4 7) (2 5 8))))
(println (= (reverse-interleave (range 10) 5) '((0 5) (1 6) (2 7) (3 8) (4 9))))
44. Rotate Sequence
xxxxxxxxxx(defn- rotate-left [n input_seq]{:pre [(>= n 0)]}(loop [result input_seqcounter (mod n (count input_seq))](let [head (first result)tail (vec (rest result))](if (= counter 0)result(recur (conj tail head) (dec counter))))))(defn- rotate-right [n input_seq]{:pre [(>= n 0)]}(->> input_seq(reverse)(rotate-left n)(reverse)))(defn rotate [n input_seq](cond(= n 0) input_seq(> n 0) (rotate-left n input_seq)(< n 0) (rotate-right (* -1 n) input_seq)))(println (= (rotate 2 [1 2 3 4 5]) (3 4 5 1 2)))(println (= (rotate -2 [1 2 3 4 5]) (4 5 1 2 3)))(println (= (rotate 6 [1 2 3 4 5]) (2 3 4 5 1)))(println (= (rotate 1 (:a :b :c)) (:b :c :a)))(println (= (rotate -4 (:a :b :c)) (:c :a :b)))xxxxxxxxxxtruetrueniltrue
45. Intro to Iterate
xxxxxxxxxx(= [1 4 7 10 13] (take 5 (iterate (+ 3 %) 1)))xxxxxxxxxxtruetrue
46. Flipping out
xxxxxxxxxx(defn flip [f](fn [& args](apply f (reverse args))))(= [1 2 3] ((flip take) [1 2 3 4 5] 3))xxxxxxxxxxtruetruetrue
47. Contain Yourself
xxxxxxxxxx(println (contains? {4 5 6} 4))(println (contains? [1 1 1 1 1] 4))(println (contains? {4 :a 2 :b} 4))(println (not (contains? [1 2 4] 4)))xxxxxxxxxxtruenil
48. Intro to some
xxxxxxxxxx(println (= 6 (some {2 7 6} [5 6 7 8])))(println (= 6 (some (when (even? %) %) [5 6 7 8])))xxxxxxxxxxtruetruetruenil
49. Split a sequence
xxxxxxxxxx(defn my-split [n input_seq][(subvec input_seq 0 n) (subvec input_seq n)])(println (= (my-split 3 [1 2 3 4 5 6]) [[1 2 3] [4 5 6]]))(println (= (my-split 1 [:a :b :c :d]) [[:a] [:b :c :d]]))(println (= (my-split 2 [[1 2] [3 4] [5 6]]) [[[1 2] [3 4]] [[5 6]]]))xxxxxxxxxxnil
50. Split by Type
xxxxxxxxxx(defn- split-by-type-helper [t input_seq](filterv (instance? t %) input_seq))(defn split-by-type [input_seq](let [types (set (map type input_seq))](set (for [t types](split-by-type-helper t input_seq)))))xxxxxxxxxxcljs.user/split-by-type