#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author: YangPC
@time:2021/07/02
@QQ:327844761
@微信公众号:ewbang
"""
# 二十四点
import os
from time import sleep
from time import perf_counter
import random
global Goal
Goal = 24
# 得到四个用户输入值
def getNumbers():
a = int(input("请输入第1个值:"))
b = int(input("请输入第2个值:"))
c = int(input("请输入第3个值:"))
d = int(input("请输入第4个值:"))
print(f"输入的数值为:{a},{b},{c},{d}")
return f"{a} {b} {c} {d}"
# 穷举所有的数值列表
# 共4!=24种
def getNumList(numbers):
items = numbers.split()
data_list = [(items[i] + ' ' + items[j] + ' ' + items[p] + ' ' + items[q]) for i in range(4) for j in range(4) for p
in range(4) for q in range(4) if (i != j) & (i != p) & (i != q) & (j != p) & (j != q) & (p != q)]
# 使用set方法排除冗余的数字组合
# 当输入的数字中存在重复数字,则4!=24种排序方案会存在重复,必须排除
return set(data_list)
# 穷举所有的操作符列表
# 共4x4x4=64种
def getOplist(ops):
op_list = [ops[i] + ' ' + ops[j] + ' ' + ops[p] for i in range(4) for j in range(4) for p in range(4)]
return op_list
# 计算24点
def Cal(num_list, opt_list):
res = []
for numlist in num_list:
nums = numlist.split()
for oplist in opt_list:
ops = oplist.split()
Cal24(res, nums, ops)
return random.choice(res) if len(res) > 0 else -1
# 对单种运算符顺序和单种数字顺序进行组合运算
def Cal24(res, nums, op):
global Goal
# 第一种情况 ((num0 op0 num1)op1 num2)op2 num3
try:
if round(eval("((" + nums[0] + op[0] + nums[1] + ")" + op[1] + nums[2] + ")" + op[2] + nums[3]), 0) == Goal:
res.append("(({}{}{}){}{}){}{}={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
except:
pass
# 第二种情况 (num0 op0 num1) op1 (num2 op2 num3)
try:
if round(eval("(" + nums[0] + op[0] + nums[1] + ")" + op[1] + "(" + nums[2] + op[2] + nums[3] + ")"),
0) == Goal:
res.append("({}{}{}){}({}{}{})={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
except:
pass
# 第三种情况 ( num0 op0 ( num1 op1 num2 )) op2 num3
try:
if round(eval("(" + nums[0] + op[0] + "(" + nums[1] + op[1] + nums[2] + "))" + op[2] + nums[3]), 0) == Goal:
res.append("({}{}({}{}{})){}{}={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
except:
pass
# 第四种情况 num0 op0 (( num1 op1 num2 ) op2 num3 )
try:
if round(eval(nums[0] + op[0] + "((" + nums[1] + op[1] + nums[2] + ")" + op[2] + nums[3] + ")"), 0) == Goal:
res.append("{}{}(({}{}{}){}{})={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
except:
pass
# 第五种情况 num0 op0 ( num1 op1 ( num2 op2 num3 ))
try:
if round(eval(nums[0] + op[0] + "(" + nums[1] + op[1] + "(" + nums[2] + op[2] + nums[3] + "))"), 0) == Goal:
res.append("{}{}({}{}({}{}{}))={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
except:
pass
if __name__ == '__main__':
numbers = getNumbers()
start = perf_counter()
num_list = getNumList(numbers)
opt_list = getOplist('+-*/')
res = Cal(num_list, opt_list)
print(f"输出结果:{res}")