猜數字(cows and bulls)

最近在看實況,結果有個實況主剛好要寫這個。所用的程式語言是Python,想說我學到現在,不如試試看,看會寫得如何?結果三兩下就寫完,覺得還可以。

後來玩了一下,拿到課堂去,覺得應該是可以寫一個「公式解」也就是一套程式可行的解法。於是在某一天的通勤去上課的課程,就用平板寫了「窮舉法」的解決方案。

Repl.it

點進去的介面,按下上面的「Start」鍵,可以在右方視窗看到程式碼執行結果。
輸入「@」可以抽一個可能性,輸入「show」可以看目前剩幾種可能性。

除了輸入特殊符號,也可以輸入數字,輸入四位數字就是正常的玩法。

窮舉法是以抽一個可能性去對正確數字,然後會得到「XAYB」的結果,最後再把所有可能性去對當初抽數字,也要同樣是「XAYB」,如果是則保留,否則去除。

至於為什麼是這樣設計,我在那時問同學懂不懂?我說這是大學程度,大學並不是要你做多麼高深且複雜的計算,而是更偏重「解釋」為什麼,而這個解釋就是很嚴謹的考量各種可能狀況。

要想通,對一般沒有練習這一塊的人,很難。

簡單來說,如果輸入「1234」得到「1A1B」,那麼「正解」只會在所有可能性中,去對「1234」會得到「1A1B」可能性的裡面。因此,如果所有可能性對上「1234」不是「1A1B」的,絕對不可能有正解,因此去除掉。

解釋可以用好幾種思路,每個都能通,不過我覺得自己還是沒有讓聽者懂,同學的程度在常態中也有算超過平均,感覺這一塊並不是人人都適合走的路。

根據網路上的研究報告,窮舉法最多7次就能找到正解,平均落在5.1次左右。所以8次一定猜得出來答案,交給電腦來算是沒問題的。