24点计算

24点计算是从我小时候开始玩的一个数学游戏,用一副牌,双方随机各取出2张,拼成4张,看谁首先通过“加、减、乘、除”四种运算的组合,找出把4张牌组成24点的方法。

小朋友喜欢玩这个游戏,我们曾经在机场候机时,用航班号计算24点来玩。

24点计算有多种实现的算法,下面是小朋友在一个方向上不断改进的思路和代码。

1


wow = []
jilu = input("输入4个数")
cat = jilu.split(" ")
for i in cat:
    wow.append(int(i))
if sum(wow) == 24:
    print(sum(wow))
elif wow[0] * wow[1] *wow[2] *wow[3] == 24:
    print(wow[0] * wow[1] *wow[2] *wow[3])

第一个版本,在试验自己的思路,跑通代码。没有使用函数。

2


wow = []
import random
# jilu = input("输入4个数")
# cat = jilu.split(" ")
# for i in cat:
#     wow.append(int(i))
wow = [3,4,5,6]
if sum(wow) == 24:
    print(sum(wow))
elif wow[0] * wow[1] *wow[2] *wow[3] == 24:
    print(wow[0] * wow[1] *wow[2] *wow[3])
for i in range(10000):
    random.shuffle(wow)
    if wow[0] + wow[1] + wow[2] * wow[3] == 24:
        print(f"{wow[0]} + {wow[1]} + {wow[2]} * {wow[3]}")
        break
    if (wow[0] + wow[1]) * wow[2] - wow[3] == 24:
        print(f"({wow[0]} + {wow[1]}) * {wow[2]} - {wow[3]}")
        break
    if (wow[0] - wow[1]) * wow[2] + wow[3] == 24:
        print(f"({wow[0]} - {wow[1]}) * {wow[2]} + {wow[3]}")
        break
    if ((wow[0] - wow[1]) + wow[2]) * wow[3] == 24:
        print(f"(({wow[0]} - {wow[1]}) + {wow[2]}) * {wow[3]}")
        break

第2个版本,选择了通过列表shuffle,组合公式的方式来计算24点。

3


wow = []
import random
# jilu = input("输入4个数")
# cat = jilu.split(" ")
# cat = 4
for i in range(4):
    wow.append(random.randint(1,10))

# wow = [5,7,9,9]
print(wow)
if sum(wow) == 24:
    print(f"{wow[0]}+{wow[1]}+{wow[2]}+{wow[3]}")
elif wow[0] * wow[1] *wow[2] *wow[3] == 24:
    print(f"{wow[0]} * {wow[1]} *{wow[2]} *{wow[3]}")
for i in range(1000):
    random.shuffle(wow)
    if wow[0]*wow[1] + wow[2]  * wow[3] == 24:
        print(f"({wow[0]} - {wow[1]} / {wow[2]}) * {wow[3]}")
        break
    if (wow[0]-wow[1] / wow[2] ) * wow[3] == 24:
        print(f"({wow[0]} - {wow[1]} / {wow[2]}) * {wow[3]}")
        break
    if (wow[0] - wow[1]) * (wow[2] + wow[3]) == 24:
        print(f"({wow[0]} - {wow[1]}) * ({wow[2]} + {wow[3]})")
        break
    if wow[0] * wow[1] - (wow[2] + wow[3]) == 24:
        print(f"{wow[0]} * {wow[1]} - ({wow[2]} + {wow[3]})")
        break
    if wow[0] + wow[1] + wow[2] * wow[3] == 24:
        print(f"{wow[0]} + {wow[1]} + {wow[2]} * {wow[3]}")
        break
    if (wow[0] + wow[1]) * wow[2] - wow[3] == 24:
        print(f"({wow[0]} + {wow[1]}) * {wow[2]} - {wow[3]}")
        break
    if (wow[0] - wow[1]) * wow[2] + wow[3] == 24:
        print(f"({wow[0]} - {wow[1]}) * {wow[2]} + {wow[3]}")
        break
    if ((wow[0] - wow[1]) + wow[2]) * wow[3] == 24:
        print(f"(({wow[0]} - {wow[1]}) + {wow[2]}) * {wow[3]}")
        break
    if ((wow[0] / wow[1]) + wow[2]) * wow[3] == 24:
        print(f"(({wow[0]} / {wow[1]}) + {wow[2]}) * {wow[3]}")
        break

第3个版本,调通代码,并尽可能覆盖更多的计算公式。引入随机数生成新的测试列表。

4


wow = []
import random
jilu = input("输入4个数")
cat = jilu.split(" ")
for i in cat:
    # wow.append(random.randint(1,10))
    wow.append(int(i))
#     print(wow)
# wow = [5,7,9,9]

def jisuan(wow, gongshi):
    v = gongshi.format(wow[0],wow[1],wow[2],wow[3])
    if eval(v) == 24:
        print(v)
        return 24
    else:
        return -1

def run(n, wow, gongshi):
    for i in range(n):
        random.shuffle(wow)
        if jisuan(wow, gongshi)== 24:
            return

jisuan(wow,'{0}+{1}+{2}+{3}')
jisuan(wow,'{0}*{1}*{2}*{3}')

n =1000
run(n,wow,'({0}-{1})*({2}/{3})')
run(n,wow,'{0}*{1}+{2}*{3}')
run(n,wow,'(({0}-{1}/{2})*{3})')
run(n,wow,'({0}-{1})*({2}+{3})')
run(n,wow,'({0}*{1})*({2}+{3})')
run(n,wow,'{0}+{1}+{2}*{3}')
run(n,wow,'({0}+{1})*({2}-{3})')
run(n,wow,'({0}-{1})*{2}+{3}')
run(n,wow,'({0}-{1})+({2}*{3})')
run(n,wow,'({0}/{1})+({2}*{3})')

# for i in range(1000):
#     random.shuffle(wow)
#     jisuan(wow,'({0}-{1})*({2}/{3})')
#     jisuan(wow,'{0}*{1}+{2}*{3}')
#     jisuan(wow,'(({0}-{1}/{2})*{3})')
#     jisuan(wow,'({0}-{1})*({2}+{3})')
#     jisuan(wow,'({0}*{1})*({2}+{3})')
#     jisuan(wow,'{0}+{1}+{2}*{3}')
#     jisuan(wow,'({0}+{1})*({2}-{3})')
#     jisuan(wow,'({0}-{1})*{2}+{3}')
#     jisuan(wow,'({0}-{1})+({2}*{3})')
#     jisuan(wow,'({0}/{1})+({2}*{3})')
# n = int(input(""))
# for i in range(n):
#     print(i*" "+(n*2-1-i*2)*"o")
# for i in range(n):
#     print(i)

第4个版本,把之前计算公式里面9个重复的if,放到函数jisuan里面。并进行把重复的9行调用 jisuan的代码,放到新写的函数 run 里面。

同时因为字符串格式函数 format 的使用,使得代码相对清晰了一些。

5


wow = []
import random
jilu = input("输入4个数")
cat = jilu.split(" ")
# cat = 4
for i in cat:
    # wow.append(random.randint(1,10))
    wow.append(int(i))
#     print(wow)
# wow = [5,7,9,9]

def jisuan(wow, gongshi):
    v = gongshi.format(wow[0],wow[1],wow[2],wow[3])
    if eval(v) == 24:
        print(v)
        return 24
    else:
        return -1

def run(n, wow, gongshi):
    for i in range(n):
        random.shuffle(wow)
        if jisuan(wow, gongshi)== 24:
            return
jisuan(wow,'{0}+{1}+{2}+{3}')
jisuan(wow,'{0}*{1}*{2}*{3}')
n =1000
ror = [
    "({0}-{1})*({2}/{3})",
    "{0}*{1}+{2}*{3}",
    '(({0}-{1}/{2})*{3})',
    '({0}-{1})*({2}+{3})',
    '({0}*{1})*({2}+{3})',
    '{0}+{1}+({2}*{3})',
    '({0}+{1})*({2}-{3})',
    '({0}-{1})*({2}+{3})',
    '({0}-{1})+({2}*{3})',
    '({0}/{1})+({2}*{3})',
    '({0}+{1})-({2}*{3})',
]
for i in ror:
    run(n,wow,i)

第5个版本,把所有计算公式移出来,放入一个列表里。

6

import random
class Jishuan():
    def __init__(self, wow = []):
        if wow:
            self.wow = wow
        else:
            jilu = input("输入4个数")
            cat = jilu.split(" ")
            self.wow = [int(i) for i in cat]
#             for i in cat:
#                 self.wow.append(int(i))
        # 运行的次数
        self.n =1000
        #24点的算法
        self.ror = [
            "({0}-{1})*({2}/{3})",
            "{0}*{1}+{2}*{3}",
            '(({0}-{1}/{2})*{3})',
            '({0}-{1})*({2}+{3})',
            '({0}*{1})*({2}+{3})',
            '{0}+{1}+({2}*{3})',
            '({0}+{1})*({2}-{3})',
            '({0}-{1})*({2}+{3})',
            '({0}-{1})+({2}*{3})',
            '({0}/{1})+({2}*{3})',
            '({0}+{1})-({2}*{3})',
        ]
        #全部加起来和全部相乘
        self.jisuan('{0}+{1}+{2}+{3}')
        self.jisuan('{0}*{1}*{2}*{3}')
        self.run24()

    def jisuan(self, gongshi):
        v = gongshi.format(self.wow[0], self.wow[1], self.wow[2],self.wow[3])
        if eval(v) == 24:
            print(v)
            return 24
        else:
            return -1

    def run(self, n, gongshi):
        for i in range(n):
            random.shuffle(self.wow)
            if self.jisuan(gongshi)== 24:
                return

    def run24(self):
        for i in self.ror:
            self.run(self.n, i)

# Jishuan()

Jishuan([5,6,7,8])

第6个版本,把代码放入对象里。

上述的代码是在一周的时间内陆陆续续完成和改进的。从第1个版本到完成版本,可以看到明显的提升。



tag: 教育 编程 算法




权利声明: 未经许可,不得转载。