Doesn't quite work but really not far off.

This commit is contained in:
simon 2014-03-26 23:05:14 +00:00
parent 747bd2e98b
commit 0290045971

View file

@ -5,7 +5,7 @@
(defn make-default-machine [] { :stock {:caramel-wafer 5 :teacake 5 :snowball 5} (defn make-default-machine [] { :stock {:caramel-wafer 5 :teacake 5 :snowball 5}
:coins {:merk 1 :plack 4 :bawbee 4 :bodle 4} :coins {:merk 1 :plack 4 :bawbee 4 :bodle 4}
:tendered nil :tendered nil
:last-message "" :message ""
:change nil :change nil
:output nil} ) :output nil} )
@ -24,13 +24,18 @@
"Sum the value of these coins." "Sum the value of these coins."
(apply + (map coin-value coins))) (apply + (map coin-value coins)))
(defn message-machine [machine message]
"Return a machine with this message"
(assoc (dissoc machine :message) :message (.toString message)))
(defn coin-return [machine] (defn coin-return [machine]
"Return all tendered coins in this machine." "Return all tendered coins in this machine."
(assoc (dissoc machine :tendered) :change (:tendered machine))) (message-machine (assoc (dissoc machine :tendered) :change (:tendered machine)) "Coins returned"))
(defn add-coin [machine coin] (defn add-coin [machine coin]
"Add this coin to this machine." "Add this coin to this machine."
(assoc (dissoc machine :tendered) :tendered (cons coin (:tendered machine)))) (message-machine (assoc (dissoc machine :tendered) :tendered (cons coin (:tendered machine))) (str "Added a " coin)))
(defn add-coins [machine coins] (defn add-coins [machine coins]
"Add these coins to this machine" "Add these coins to this machine"
@ -79,7 +84,6 @@
"Given this amount of change to make, and this number each of merks, placks, bawbees "Given this amount of change to make, and this number each of merks, placks, bawbees
and bodles, return a tuple (merk plack bodle bawbee) which indicates the number remaining and bodles, return a tuple (merk plack bodle bawbee) which indicates the number remaining
after making change, or nil if not possible" after making change, or nil if not possible"
(print (list "in-make-change:" amount merk plack bawbee bodle))
(cond (cond
(= amount 0) (list merk plack bawbee bodle) (= amount 0) (list merk plack bawbee bodle)
(and (>= amount (:merk coin-values)) (> merk 0)) (and (>= amount (:merk coin-values)) (> merk 0))
@ -130,17 +134,17 @@
(defn get-item [machine item] (defn get-item [machine item]
(print "get-item: Started")
(let [item-price (item item-prices) (let [item-price (item item-prices)
tend (sum-coins (:tendered machine)) tend (sum-coins (:tendered machine))
change (make-change item-price (:merk tend) (:plack tend) (:bawbee tend) (:bodle tend))] change (make-change item-price (:merk tend) (:plack tend) (:bawbee tend) (:bodle tend))]
(print (list "get-item:" item-price tend change)) (cond (>= 0 (item (:stock machine))) (message-machine (coin-return machine) (str "Sorry, " item " not in stock"))
(cond (<= 0 (item (:stock machine))) (coin-return machine) (<= (coins-value (:tendered machine)) item-price) (message-machine machine "Please insert more money")
(<= (coins-value (:tendered machine)) item-price) (coin-return machine) (empty? change) (message-machine (coin-return machine) "Sorry, I don't have enough change.")
(empty? change) (coin-return) true (message-machine (deliver-item machine item change) (str "Enjoy your " item)))))
true (deliver-item machine item change))))
(defn get-caramel-wafer [machine] (defn get-caramel-wafer [machine]
(get-item machine :caramel-wafer)) (get-item machine :caramel-wafer))
;; (get-caramel-wafer (add-coin (add-coin (make-default-machine) :merk) :merk))