鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: wp231957

利用python 写一个24点的 小游戏

[复制链接]
 楼主| 发表于 2024-4-30 15:24:44 | 显示全部楼层
FishC 发表于 2024-4-30 11:05
好的,下面是一个简单的24点小游戏的代码:

咋样能列出 加减乘除四个符号中的所有长度为3的组合
比如
+-*
+-/
+*-
+*/
等等,我也不知道总共有多少种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 15:24:52 | 显示全部楼层
wp231957 发表于 2024-04-30 15:24
咋样能列出 加减乘除四个符号中的所有长度为3的组合
...


要列出加减乘除四个符号中的所有长度为3的组合,可以使用 `itertools.product()` 函数。下面是一个示例代码:

  1. import itertools

  2. operators = ['+', '-', '*', '/']
  3. combinations = list(itertools.product(operators, repeat=3))

  4. for combo in combinations:
  5.     print(''.join(combo))
复制代码


这段代码会输出所有长度为3的加减乘除组合,共有64种组合。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 15:33:39 | 显示全部楼层
FishC 发表于 2024-4-30 15:24
要列出加减乘除四个符号中的所有长度为3的组合,可以使用 `itertools.product()` 函数。下面是一个示例 ...

请看这个代码片段
  1. import itertools

  2. operators = ['+', '-', '*', '/']
  3. combinations = list(itertools.product(operators, repeat=3))
  4. perm=[]
  5. for combo in combinations:
  6.     perm.append(list(''.join(combo)))     

  7. numbers=[2,5,8,7]
  8. print(perm)
复制代码


在暂时不考虑括号的情况下,操作符的组合是64种,4个数字的排列 是 24种
那么 如何把操作符和数字全套进去,最终输出1536种所有可能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 15:33:56 | 显示全部楼层
wp231957 发表于 2024-04-30 15:33
请看这个代码片段
import itertools

operators =  ...


要将操作符和数字配对并输出所有可能的表达式,可以使用嵌套的循环来遍历所有的操作符和数字组合。以下是一个示例代码:

import itertools

operators = ['+', '-', '*', '/']
operator_combinations = list(itertools.product(operators, repeat=3))

numbers = [2, 2, 5, 8]

expressions = []

for operator_combo in operator_combinations:
    for number_permutation in itertools.permutations(numbers):
        expression = []
        for i in range(len(number_permutation)):
            expression.append(str(number_permutation))
            if i < len(number_permutation) - 1:
                expression.append(operator_combo)
        expressions.append(' '.join(expression))
        
print(expressions)
print(len(expressions))

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 15:53:53 | 显示全部楼层
FishC 发表于 2024-4-30 11:07
抱歉,我在代码中犯了一个错误。在插入运算符的那一行代码中,我错误地使用了 `operators` 列表来替代 ...

for x in expressions:
     print(eval(x))   这里  改为  如果计算结果为整数  则输出   该如何修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 15:54:04 | 显示全部楼层
wp231957 发表于 2024-04-30 15:53
for x in expressions:
     print(eval(x))   这里  ...


要根据计算结果是否为整数来输出不同的信息,可以使用 `isinstance()` 函数来检查结果的类型。以下是修改后的代码:

import itertools

operators =
operator_combinations = list(itertools.product(operators, repeat=3))
number_permutations = list(itertools.permutations(numbers))

expressions = []
for operator_combo in operator_combinations:
    for number_permutation in number_permutations:
        expression = ''
        for i in range(3):
            expression += str(number_permutation) + operator_combo
        expression += str(number_permutation[3])
        expressions.append(expression)

for expression in expressions:
    result = eval(expression)
    if isinstance(result, int):
        print(expression, '=', result)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 16:00:42 | 显示全部楼层
FishC 发表于 2024-4-30 15:54
要根据计算结果是否为整数来输出不同的信息,可以使用 `isinstance()` 函数来检查结果的类型。以下是修 ...

虽然你的代码 无法运行,但我还是借鉴你的代码  写出来了自己的东西
  1. import itertools

  2. operators = ['+', '-', '*', '/']
  3. combinations = list(itertools.product(operators, repeat=3))  #所有操作符组合元组模式

  4. numbers=[2,5,8,7]
  5. numberperms=list(itertools.permutations(numbers))  #所有数字组合
  6. expressions=[]
  7. for ops in combinations:
  8.     for num in numberperms:
  9.         expr="{}{}{}{}{}{}{}".format(num[0],ops[0],num[1],ops[1],num[2],ops[2],num[3])
  10.         expressions.append(expr)
  11.         
  12. for x in expressions:
  13.      result=eval(x)
  14.      if isinstance(result, int) and result>10 and result<30:
  15.           print("{}={}".format(x,result))
复制代码


那么下一步 要往表达式里面添加小括号,是不是狠难啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 16:01:11 | 显示全部楼层
wp231957 发表于 2024-04-30 16:00
虽然你的代码 无法运行,但我还是借鉴你的代码  写出 ...


很高兴听到您已经通过借鉴和修改代码解决了问题!您的代码看起来是正确的,并且在输出结果为整数且大于 10 的情况下,进行了特定的处理。这是一个很好的实现方式。

如果您还有其他问题,欢迎随时向我提问。祝您编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 16:02:25 | 显示全部楼层
FishC 发表于 2024-4-30 16:01
很高兴听到您已经通过借鉴和修改代码解决了问题!您的代码看起来是正确的,并且在输出结果为整数且大于 ...

那么下一步 要往表达式里面添加小括号,是不是狠难啊

你还没回复这个问题呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 16:02:57 | 显示全部楼层
wp231957 发表于 2024-04-30 16:02
那么下一步 要往表达式里面添加小括号,是不是狠难啊
...


非常抱歉,我可能之前漏回答了您的问题。确实,在24点游戏中添加小括号可以增加更多的组合和变化,但是会增加一定的复杂度。

如果要在表达式中添加小括号,可以使用递归函数来尝试不同的括号组合。下面是一个示例代码:

  1. def add_parentheses(expression, depth):
  2.     if depth == 0:
  3.         return expression

  4.     parentheses_expressions = []
  5.    
  6.     for i in range(1, len(expression) - depth, 2):
  7.         sub_expression = expression[i-1:i+2]
  8.         sub_result = eval(sub_expression)
  9.         
  10.         if isinstance(sub_result, int) and sub_result != 0:
  11.             remaining_expression = expression[:i-1] + expression[i+2:]
  12.             sub_expressions = add_parentheses(remaining_expression, depth - 1)
  13.             
  14.             for sub_expr in sub_expressions:
  15.                 parentheses_expressions.append(expression[:i-1] + "(" + sub_expression + ")" + sub_expr)
  16.    
  17.     return parentheses_expressions


  18. def generate_expressions(numbers, operators, num_parentheses):
  19.     expressions = []
  20.    
  21.     combinations = itertools.product(operators, repeat=3)
  22.     number_perms = list(itertools.permutations(numbers))
  23.    
  24.     for ops in combinations:
  25.         for num_perm in number_perms:
  26.             expression = "{}{}{}{}{}{}{}".format(num_perm[0], ops[0], num_perm[1], ops[1], num_perm[2], ops[2], num_perm[3])
  27.             expressions.append(expression)
  28.    
  29.     expressions_with_parentheses = []
  30.    
  31.     for expr in expressions:
  32.         expressions_with_parentheses.extend(add_parentheses(expr, num_parentheses))
  33.    
  34.     return expressions_with_parentheses

  35. numbers = [2, 2, 5, 8]
  36. operators = ['+', '-', '*', '/']
  37. num_parentheses = 1

  38. expressions = generate_expressions(numbers, operators, num_parentheses)

  39. for expr in expressions:
  40.     result = eval(expr)
  41.     if isinstance(result, int) and result > 10 and result % 24 == 0:
  42.         print(expr)
复制代码


这段代码将根据给定的数字、运算符和括号数量生成所有可能的表达式,并输出计算结果为整数且大于10且能被24整除的表达式。

希望这次能解决您的问题。如有其他疑问,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 16:04:28 | 显示全部楼层
FishC 发表于 2024-4-30 16:02
非常抱歉,我可能之前漏回答了您的问题。确实,在24点游戏中添加小括号可以增加更多的组合和变化,但是 ...

最不会用的就是递归了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 16:04:44 | 显示全部楼层
wp231957 发表于 2024-04-30 16:04
最不会用的就是递归了


递归是一种非常强大的编程技巧,但对初学者来说可能会有些困难。如果您对递归不太熟悉,我们可以尝试使用迭代的方式来添加小括号。这样会相对简单一些。

以下是一个示例代码,它使用迭代的方式来添加小括号:

  1. import itertools

  2. def calculate(cards):
  3.     # 定义运算符和优先级
  4.     operators = ['+', '-', '*', '/']
  5.     precedence = {'+': 1, '-': 1, '*': 2, '/': 2}

  6.     # 生成所有操作符组合
  7.     operator_combinations = list(itertools.product(operators, repeat=3))

  8.     # 生成所有数字排列
  9.     number_permutations = list(itertools.permutations(cards))

  10.     # 用于存放最终结果的列表
  11.     results = []

  12.     for nums in number_permutations:
  13.         for ops in operator_combinations:
  14.             expression = "{} {} {} {} {} {} {}".format(nums[0], ops[0], nums[1], ops[1], nums[2], ops[2], nums[3])
  15.             results.append(expression)

  16.     return results

  17. cards = [2, 2, 5, 8]
  18. expressions = calculate(cards)

  19. print(expressions)
复制代码


这个示例代码将生成所有可能的表达式,但仍然没有添加小括号。如果您确实想要尝试使用递归来添加小括号,我可以为您提供一个递归的示例代码。请让我知道您的意愿。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 16:08:31 | 显示全部楼层
FishC 发表于 2024-4-30 16:04
递归是一种非常强大的编程技巧,但对初学者来说可能会有些困难。如果您对递归不太熟悉,我们可以尝试使 ...

嗯,你不用写那么复杂的  也不用写全部的   片段的即可
比如
把   2*5-8/7  添加括号
结果应该是:
2*5-8/7
2*(5-8/7)
2*(5-8)/7
(2*5-8)/7
肉眼识别,应该是这四组吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 16:08:51 | 显示全部楼层
wp231957 发表于 2024-04-30 16:08
嗯,你不用写那么复杂的  也不用写全部的   片段的即 ...


是的,根据您提供的表达式,添加括号的结果应该是以下四个组合:

1. 2*5-8/7
2. 2*(5-8)/7
3. 2*(5-8/7)
4. (2*5-8)/7

通过在适当的位置添加括号,可以改变运算的优先级和结果。您可以尝试使用循环和条件语句来生成这些组合。以下是一个示例代码片段:

  1. expression = "2*5-8/7"

  2. # 添加括号的组合
  3. combinations = [
  4.     expression,
  5.     "{}*({}-{})/{}".format(expression.split("*")[0], expression.split("*")[1], expression.split("/")[-1], expression.split("/")[-1]),
  6.     "{}*({}-{})/{}".format(expression.split("*")[0], expression.split("*")[1], expression.split("/")[-1], expression.split("/")[-1]),
  7.     "({}*{}-{}})/{}".format(expression.split("*")[0], expression.split("*")[1], expression.split("/")[-1], expression.split("/")[-1])
  8. ]

  9. for combo in combinations:
  10.     print(combo)
复制代码


这样可以输出四个带有括号的表达式,您可以进行肉眼识别验证结果是否正确。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-30 16:11:27 | 显示全部楼层
FishC 发表于 2024-4-30 11:05
好的,下面是一个简单的24点小游戏的代码:

itertools.product
itertools.permutations

这两个东东  有啥区别没
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-30 16:11:56 | 显示全部楼层
wp231957 发表于 2024-04-30 16:11
itertools.product
itertools.permutations

这两 ...


`itertools.product` 和 `itertools.permutations` 都是 Python 中的迭代工具,但它们有不同的用途。

`itertools.product` 用于从多个可迭代对象中获取所有可能的组合。比如 `itertools.product([1, 2], ['a', 'b'])` 将会生成 `(1, 'a')`、`(1, 'b')`、`(2, 'a')`、`(2, 'b')` 这四个组合。

`itertools.permutations` 则用于从一个可迭代对象中获取所有可能的排列。比如 `itertools.permutations([1, 2, 3])` 将会生成 `(1, 2, 3)`、`(1, 3, 2)`、`(2, 1, 3)`、`(2, 3, 1)`、`(3, 1, 2)`、`(3, 2, 1)` 这六个排列。

因此,`itertools.product` 用于获取多个可迭代对象的组合,而 `itertools.permutations` 用于获取单个可迭代对象的排列。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-1 16:37:39 | 显示全部楼层


Snipaste_2024-05-01_16-37-12.png

问一次 GPT 的效果:

  1. import itertools

  2. def calculate(expression):
  3.     try:
  4.         return eval(expression)
  5.     except ZeroDivisionError:
  6.         return None

  7. def find_24(numbers):
  8.     operators = ['+', '-', '*', '/']
  9.     for perm in itertools.permutations(numbers):
  10.         for ops in itertools.product(operators, repeat=3):
  11.             expression = '(({} {} {}) {} {}) {} {}'.format(perm[0], ops[0], perm[1], ops[1], perm[2], ops[2], perm[3])
  12.             result = calculate(expression)
  13.             if result == 24:
  14.                 return expression
  15.     return None

  16. def main():
  17.     print("Enter four numbers separated by spaces:")
  18.     numbers = list(map(int, input().split()))

  19.     expression = find_24(numbers)
  20.     if expression:
  21.         print("Expression:", expression)
  22.     else:
  23.         print("No expression found")

  24. if __name__ == "__main__":
  25.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 12:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表