Skip to content

Instantly share code, notes, and snippets.

@dlongmuir
Last active August 29, 2015 14:13
Show Gist options
  • Save dlongmuir/f37c5c50a82bee3a98f8 to your computer and use it in GitHub Desktop.
Save dlongmuir/f37c5c50a82bee3a98f8 to your computer and use it in GitHub Desktop.
Diamond Kata in (newb) Clojure
(def alphabet (map #(str (char %)) (range (int \A) (inc (int \Z)))))
(defn outside-spaces
[letter letters]
(loop [[current-letter & rest] letters
position 0]
(if (= current-letter letter)
position
(recur rest (inc position)))))
(defn print-character
[letter position]
(print (apply str (repeat position " ")) letter))
(defn direction
[growing]
(if growing
inc
dec))
(defn print-half-triangle
[letters expanding max-spaces]
(let [start-row (if expanding 0 max-spaces)]
(loop [[current-letter & rest] letters
current-row ((direction expanding) start-row)]
(do
(print-character current-letter (- max-spaces current-row))
(when (not (= current-letter "A"))
(print-character current-letter (- (* 2 current-row) 4)))
(println)
(when rest
(recur rest ((direction expanding) current-row)))))))
(defn print-triangle
[letter]
(let [all-letters alphabet
max-spaces (inc (outside-spaces letter all-letters))
letters (take max-spaces all-letters)]
(print-half-triangle letters true max-spaces)
(print-half-triangle (rest (reverse letters)) false max-spaces)))
clojure-noob.core> (print-triangle "L")
A
B B
C C
D D
E E
F F
G G
H H
I I
J J
K K
L L
K K
J J
I I
H H
G G
F F
E E
D D
C C
B B
A
nil
clojure-noob.core> (print-triangle "D")
A
B B
C C
D D
C C
B B
A
nil
clojure-noob.core> (print-triangle "D")
A
B B
C C
D D
C C
B B
A
nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment