教女朋友学 python——24点游戏

前言

女朋友一个编程小白,最近在学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是一个关键字参数,指定重复生成序列的次数。

以上的函数可以通过手动循环和树结构代替。

猜你喜欢

转载自blog.csdn.net/weixin_42280274/article/details/109081028