Skip to content

Instantly share code, notes, and snippets.

@bmerrill42
Created February 21, 2018 06:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bmerrill42/c853470979a3705ec2e668b08f1f7d13 to your computer and use it in GitHub Desktop.
Save bmerrill42/c853470979a3705ec2e668b08f1f7d13 to your computer and use it in GitHub Desktop.
;;;;;;;;;;;;;;
;; GREED !! ;;
;;;;;;;;;;;;;;
;; Modified from Ruby Koans: about_scoring_project.rb
; *Greed* is a dice game where you roll up to five dice to accumulate
; points. The following "score" function will be used to calculate the
; score of a single roll of the dice.
;
; A greed roll is scored as follows:
;
; * A set of three ones is 1000 points
;
; * A set of three numbers (other than ones) is worth 100 times the
; number. (e.g. three fives is 500 points).
;
; * A one (that is not part of a set of three) is worth 100 points.
;
; * A five (that is not part of a set of three) is worth 50 points.
;
; * Everything else is worth 0 points.
;
;
; Examples:
;
; (score '(1 1 1 5 1)) => 1150 points
; (score '(2 3 4 6 2)) => 0 points
; (score '(3 4 5 3 3)) => 350 points
; (score '(1 5 1 2 4)) => 250 points
;
; More scoring examples are given in the tests below:
;
; Your goal is to write the score method.
(defun calc (kv)
(multiple-value-bind (di re) (truncate (cdr kv) 3)
(cond
((= 1 (car kv)) (+ (* 1000 di) (* 100 re)))
((= 5 (car kv)) (+ (* 500 di) (* 50 re)))
((= 3 (cdr kv)) (* (car kv) 100))
(t 0))))
(defun score (dice)
(let ((sum 0)
(hash
(loop for i from 1 to 6 collect (cons i (count i dice)))))
(dolist (kv hash)
(setf sum (+ sum (calc kv))))
sum))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment