FWIW (i.e. IMO the previous two functional solutions are better
examples) here is a more imperative style solution done sort of to
prove to myself that I could do such a thing in Clojure w/o too much
(arguable) fanfare. Maybe it will be interesting to others who are
learning Clojure too
(defn score [rolls]
(loop [roll-number 0 frame 0 score 0 frames []]
(if (or (= frame 10) (= roll-number (count rolls)))
frames
(let [roll (nth rolls roll-number)]
(if (= roll 10) ;; strike
(let [new-score (+ score roll (nth rolls (inc roll-number) 0)
(nth
rolls (+ roll-number 2) 0))]
(recur (inc roll-number) (inc frame) new-score (conj
frames
{:score new-score :frame-type :strike})))
(if-let [roll-2 (nth rolls (inc roll-number) nil)]
(if (= (+ roll roll-2) 10) ;;spare
(let [new-score (+ score roll roll-2 (nth rolls (+
roll-number
2) 0))]
(recur (+ roll-number 2) (inc frame) new-score
(conj frames
{:score new-score :frame-type :spare})))
(let [new-score (+ score roll roll-2)]
(recur (+ roll-number 2) (inc frame) new-score
(conj frames
{:score new-score :frame-type :underachieving?}))))
(let [new-score (+ score roll)]
(recur (inc roll-number) (inc frame) new-score (conj
frames
{:score new-score :frame-type :incomplete})))))))))
(use 'clojure.test)
(deftest test-various-games
(are [description expected-score game] (= expected-score (:score
(last (score game))))
"gutter game" 0 (repeat 20 0)
"all ones" 20 (repeat 20 1)
"one spare" 16 (concat [5 5 3] (repeat 17 0))
"one strike" 24 (concat [10 3 4] (repeat 17 0))
"all nine pins first" 90 (conj (vec (interpose 9 (repeat 10
0) )) 9)
"all spares w/ gutter ball first" 100 (conj (conj (vec
(interpose 10 (repeat 10 0))) 10) 0)
"all spares w/ 1 pin first" 110 (conj (conj (vec (interpose 9
(repeat 10 1) )) 9) 1)
"all spares w/ 9 pins first" 190 (conj (conj (vec (interpose 1
(repeat 10 9) )) 1) 9)
"perfect game" 300 (repeat 12 10)
))
(run-tests)
On Jul 21, 8:37 pm, Mark Triggs <[email protected]> wrote:
> An artifact of not running my code from a clean REPL before posting ;)
> It should just read `frames'.
>
> Cheers,
>
> Mark
>
> artg <[email protected]> writes:
> > What is "group-frames"?
>
> > --art
>
> > On Jul 21, 12:00 am, Mark Triggs <[email protected]> wrote:
>
> [...]
>
> >> (defn score-game [rolls]
> >> (reduce + (map #(reduce + %)
> >> (take 10 (group-frames rolls)))))
>
> --
> Mark Triggs
> <[email protected]>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---