2015-04-02 53 views
0

如何在Lisp中編碼樂透符號,用戶在1-45之間隨機生成6個數字(非重複),然後輸入他們自己的樂透號碼選擇以查看它們是否匹配,然後告訴他們是否贏了?在Lisp中編程樂透

(defun shuffle (list) 
    (let ((len (length list))) 
    (loop repeat len 
      do (rotatef (nth (random len) list) 
         (nth (random len) list)) 
      finally (return list)))) 

(defun lottery() 
    (sort (subseq (shuffle (loop for i from 1 to 49 collect i)) 
       0 6) 
     #'<)) 

(lottery) 

(代碼實際上是從其他作者取自這個問題:Get numbers for the lottery

它輸出的隨機數,我需要,但我有很多的麻煩6個號碼的用戶輸入和將它們與這些數字進行比較,看看它們是否「獲勝」。

+0

請將您的代碼縮進4個空格。 – Carcigenicate 2015-04-02 10:53:15

+0

歡迎光臨!我編輯了你的帖子。正如@Carcigenicate指出的那樣,您可以通過縮進4個空格來獲得'code markdown'中的代碼。您可能需要在代碼中添加更多格式 - 只需確保每行代碼縮進4個空格即可。祝你好運! – 2015-04-02 10:54:51

+0

請格式化您的代碼。 – 2015-04-02 11:19:58

回答

1

如果你的問題是輸入這應該是一個(不安全的)解決方案:

(defun play-lotto (&aux list) 
    (dotimes (i 6) 
    (loop 
     (princ "Write a Integer between 0 and 50: ") 
     (let ((number (read))) 
     (if (and (integerp number) (< 0 number 50)) 
      (if (member number list) 
       (progn 
        (princ "You can only choose a number once") 
        (terpri)) 
       (progn 
        (push number list) 
        (return))) 
      (progn 
       (princ "Not a Integer between 0 and 50") 
       (terpri)))))) 
    (if (equal (sort list #'<) (lottery)) 
     (princ "You won!") 
     (princ "You lost..."))) 
2

讓我們開始越來越n非重複的隨機數。

(defun get-n-rand (n) 
    (loop :for i = (adjoin (1+ (random 44)) i) 
     :when (= (length i) n) :return i)) 

現在,如果我們希望他們的6是很簡單的寫(get-n-rand 6)

接下來我們要檢查,如果一個列表的每個成員都可以在另一個被發現。

(defun check-user-guess (guess-list actual-list) 
    (equal (sort guess-list #'<) (sort actual-list #'<))) 

希望這涵蓋了核心邏輯。我輸入的內容將會在其他答案中涵蓋的內容。

+0

實際上遇到麻煩「檢查用戶猜測」如何正確調用它? (檢查用戶猜測1 2)還是沿着這些線? – Fergo 2015-04-03 10:23:30

+0

'(check-user-guess'(1 2 3 4)'(3 2 4 1))'給出'T',這樣你就可以擁有'(check-user-guess(get-n-rand 6)用戶猜測))'..假設get-user-guesses返回用戶選擇的數字列表 – Baggers 2015-04-03 10:24:26