Altered coin values to actual (relative) values of old Scots coins; this

makes it all mind-bendingly harder, and is probably not a good exercise!
This commit is contained in:
simon 2015-04-30 08:18:52 +01:00
parent df179255e0
commit 694230405c
2 changed files with 16 additions and 17 deletions

View file

@ -10,13 +10,15 @@
:change nil :change nil
:output nil} ) :output nil} )
(def coin-values {:merk 100 :plack 25 :bawbee 10 :bodle 5}) ;; Laterly a bodle was worth either one sixth or one eighth of an English penny, but apparently
;; it was two pence Scots. Other values are more certain; a merk was 13 shillings and sixpence.
(def coin-values {:merk 160 :bawbee 6 :plack 4 :bodle 2})
(keys coin-values) (keys coin-values)
(.indexOf (keys coin-values) :bodle) (.indexOf (keys coin-values) :bodle)
(def item-prices {:caramel-wafer 65 :teacake 100 :snowball 150}) (def item-prices {:caramel-wafer 10 :teacake 16 :snowball 22})
(defn coin-value [coin] (defn coin-value [coin]
(coin-values coin)) (coin-values coin))

View file

@ -41,21 +41,21 @@
"summing coins" "summing coins"
(let [coins1 (sum-coins (list :merk :plack :bawbee :bodle)) (let [coins1 (sum-coins (list :merk :plack :bawbee :bodle))
coins2 (sum-coins (list :merk :plack :bawbee :bodle :merk :plack :bawbee :bodle))] coins2 (sum-coins (list :merk :plack :bawbee :bodle :merk :plack :bawbee :bodle))]
(= (:merk coins1 1) "after adding one merk, one merk should be present") (is (= (:merk coins1) 1) "after adding one merk, one merk should be present")
(= (:merk coins2 2) "after adding two merks, two merks should be present") (is (= (:merk coins2) 2) "after adding two merks, two merks should be present")
)) ))
(testing (testing
"making appropriate change" "making appropriate change"
(let [wallet {:merk 5 :plack 5 :bawbee 5 :bodle 5} (let [wallet {:merk 1 :plack 1 :bawbee 1 :bodle 1}
no-change (make-change 0 wallet) no-change (make-change 0 wallet)
merk-change (make-change 100 wallet) merk-change (make-change (coin-values :merk) wallet)
ten-change (make-change 10 wallet) ten-change (make-change (+ (coin-values :plack) (coin-values :bawbee)) wallet)
all-change (make-change 140 wallet)] all-change (make-change (reduce + (map #(coin-values %) (keys coin-values))) wallet)]
(is (empty? no-change) "no change implies an empty coin list") (is (empty? no-change) "no change implies an empty coin list")
(is (= merk-change '(:merk)) "100 units of change should be satisfied with one mark") (is (= merk-change '(:merk)) "140 units of change should be satisfied with one mark")
(is (= (set all-change) (set (list :merk :plack :bawbee :bodle))) "140 units of change should be satisfied with one coin of each denomination") (is (= (set all-change) (set (list :merk :plack :bawbee :bodle))) "172 units of change should be satisfied with one coin of each denomination")
(is (or (= (set ten-change) (set (list :bawbee))) (= (set ten-change) (set (list :bodle :bodle)))) "ten change could be satisfied with one bawbee or two bodles"))) (is (= (set ten-change) (set (list :plack :bawbee))) "ten change could be satisfied with one bawbee or two bodles")))
(testing (testing
"removing change from machine" "removing change from machine"
@ -68,13 +68,10 @@
(testing (testing
"full machine cycle" "full machine cycle"
(let [machine (get-caramel-wafer (add-coin (make-default-machine) :merk))] (let [machine (get-caramel-wafer (add-coin (add-coin (make-default-machine) :bawbee) :bawbee))]
(is (= (:message machine) "Enjoy your :caramel-wafer")) (is (= (:message machine) "Enjoy your :caramel-wafer"))
(is (= (set (:change machine)) #{:plack :bawbee})) (is (= (set (:change machine)) #{:bodle}))
(is (= (:merk (:coins machine)) 2)) (is (= (:bawbee (:coins machine)) 6))
(is (= (:output machine) '(:caramel-wafer))))) (is (= (:output machine) '(:caramel-wafer)))))
) )
(make-change-machine (make-default-machine) '( 1 1 1 1))
(set '(:a :b :c))