Browse Source

Added the program to make decisions for me

Samuel W. Flint 7 years ago
parent
commit
632d2a756d
3 changed files with 55 additions and 1 deletions
  1. 2 1
      .gitignore
  2. 5 0
      make-decision-build.lisp
  3. 48 0
      make-decision.lisp

+ 2 - 1
.gitignore

@@ -8,4 +8,5 @@
 auto/*
 *~
 \#*\#
-/excuse
+/excuse
+/decide

+ 5 - 0
make-decision-build.lisp

@@ -0,0 +1,5 @@
+(load "make-decision")
+(save-lisp-and-die "decide"
+                   :toplevel #'main
+                   :executable t
+                   :purify t)

+ 48 - 0
make-decision.lisp

@@ -0,0 +1,48 @@
+(defvar *initialized-p* nil)
+
+(defun ensure-positive (number)
+  (if (< number 0)
+      (- number)
+      number))
+
+(defun ensure-initialized ()
+  (when (not *initialized-p*)
+    (setq *random-state* (make-random-state t)
+          *initialized-p* t)
+    (dotimes (number (ensure-positive (random 100)))
+      (dotimes (other (ensure-positive (random (1+ number))))
+        (dotimes (yet-another (ensure-positive (random (1+ other))))
+          (ensure-positive (random (1+ yet-another))))))))
+
+(defun flip-coin (stream number)
+  (ensure-initialized)
+  (format stream "Flipping ~a coins.~&" number)
+  (dotimes (n number)
+    (if (= (mod (random 100) 2) 0)
+        (format stream "Heads.~&")
+        (format stream "Tails.~&"))))
+
+(defun roll-die (stream number type)
+  (ensure-initialized)
+  (format stream "Rolling a ~a-sided die ~a times.~&" type number)
+  (dotimes (n number)
+    (let ((die (1+ (mod (ensure-positive (random (* 100 type))) type))))
+      (format stream "You rolled a ~a.~&" die))))
+
+(defun main ()
+  (let ((type (if (not (null (second *posix-argv*)))
+                  (intern (string-upcase (second *posix-argv*)) "KEYWORD")))
+        (times (if (and (not (null (second *posix-argv*)))
+                      (not (null (third *posix-argv*))))
+                   (parse-integer (third *posix-argv*) :junk-allowed t)
+                   1)))
+    (case type
+      (:die
+       (roll-die *standard-output* times (if (not (null (fourth *posix-argv*)))
+                                             (parse-integer (fourth *posix-argv*) :junk-allowed t)
+                                             6)))
+      (:coin
+       (flip-coin *standard-output* times))
+      (t
+       (format *standard-output*
+               "make-decision [ die [ times [ type ] ] | coin [ times ] ]~&")))))