(defconstant G 1 "Goo (rock)")
(defconstant C 2 "Choki (scissor)")
(defconstant P 4 "Paa (paper)")
(defun janken-winner (hands)
(let ((x (apply #'logior hands)))
(cond ((eql x (logior G C)) G)
((eql x (logior C P)) C)
((eql x (logior P G)) P)
(t nil))))
(defun janken-count-winners (hands)
(let ((win (janken-winner hands)))
(values (count win hands) win)))
(defun janken-format-hand (stream arg colon atsign)
(declare (ignore colon atsign))
(princ (cond ((eql arg G) #\g)
((eql arg C) #\c)
((eql arg P) #\p)
(t (error "Not a JANKEN hand: ~S" arg)))
stream))
(let ((games (list (list g c c g c)
(list g g g g g g g)
(list c p p c p p p p c c p p p p p c)
(list c p p c p p p p c c p g p p p c))))
(dolist (hands games)
(format t "~{~/janken-format-hand/~} -> ~D~%"
hands (janken-count-winners hands))))