教女朋友學 python——24點遊戲

2020-10-15 15:00:38

前言

女朋友一個程式設計小白,最近在學python,從零開始,作為男朋友的我當然不能坐視不管。幫助完成一下她的作業,順便記錄一下。我自己的python也是邊學邊用,基礎很不紮實,就當是自己複習python,把握一些細節。

題目:

用python編寫24點小遊戲。
要求:用鍵盤輸入四個數位,每個在1-10(包含)之間,判斷是否可以通過±*/運算得到24,並輸出運算過程,結果越簡潔越好。

在這裡插入圖片描述

思路

只有四個數位,最簡單粗暴的方法就是列舉法。
1.列出四個數位所有可能的排列組合。(數位可能重複,所以要去重)
2.四個數位運算需要三個符號,所以要列出+-*/四個符號長度為三的笛卡爾積。
3.除了符號還要考慮計算過程中的括號,已經列出了所有數位和符號的組合,括號就只有((a*b)c)d 和(ab)(cd)兩種計算方式。
4.將上述所有可能組合,記錄結果為24的組合就是答案。

實現程式碼

print("請輸入四個數位(1-10):")
n1 = input()
n2 = input()
n3 = input()
n4 = input()
four_numbers = [n1,n2,n3,n4] 
import itertools
#四個數位的全排列
permutation = itertools.permutations(four_numbers, len(four_numbers))
# for p in permutation :
#     print(p)
#因為允許重複數位,所以需要對全排列去重
four_num_list =[]
for i in set(permutation):
    four_num_list.append(list(i))
operators=['+','-','*','/']
#四個符號 長度為三的笛卡爾積排列
product = itertools.product(operators,repeat=3)
three_op_list=[]
for i in product:
    three_op_list.append(list(i))

expression_list = []
for i in four_num_list:
    for j in three_op_list:
        expression1 = str('(('+i[0]) + j[0] + str(i[1])+')' + j[1] + str(i[2])+')' + j[2] + str(i[3])    #將各個數都轉化為str型別
        #eval可以直接計算出數學表示式的值
        result = eval(expression1)
        if result ==24:
            expression_list.append(expression1+'=24')
        else:
            expression2 = '(' + str(i[0]) + j[0] + str(i[1]) + ')' + j[1]+'(' + str(i[2]) + j[2] + str(i[3]+')')
            result = eval(expression2)
            if result ==24:
                expression_list.append(expression2+'=24')
for ex in expression_list:
    print(ex)

內建方法講解

上面的程式碼偷了一些懶,直接用了一些內建函數:

eval():用來執行一個字串表示式,並返回表示式的值。

itertools是用於建立迴圈用迭代器的函數模組。
itertools.permutations(p,r):建立一個迭代器,所有長度為r的專案序列,如果省略了r,那麼序列的長度與p中的專案數量相同: 返回p中任意取r個元素做排列的元組的迭代器。

itertools.product(*iterables[, repeat]):以元組的形式,根據輸入的可遍歷物件生成笛卡爾積,與巢狀的for迴圈類似。
repeat是一個關鍵字引數,指定重複生成序列的次數。

以上的函數可以通過手動迴圈和樹結構代替。