RosettaCodeData/Task/24-game/Clojure/24-game.clj

28 lines
875 B
Clojure

(ns rosettacode.24game)
(def ^:dynamic *luser*
"You guessed wrong, or your input was not in prefix notation.")
(def ^:private start #(println
"Your numbers are: " %1 ". Your goal is " %2 ".\n"
"Use the ops [+ - * /] in prefix notation to reach" %2 ".\n"
"q[enter] to quit."))
(defn play
([] (play 24))
([goal] (play goal (repeatedly 4 #(inc (rand-int 9)))))
([goal gns]
(start gns goal)
(let [input (read-string (read-line))
flat (flatten input)]
(println
(if (and (re-find #"^\([\d\s+*/-]+\d?\)$" (pr-str flat))
(= (set gns) (set (filter integer? flat)))
(= goal (eval input)))
"You won the game!"
*luser*))
(when (not= input 'q) (recur goal gns)))))
; * checks prefix form, then checks to see that the numbers used
; and the numbers generated by the game are the same.