教育 小朋友的算法系列 24点计算
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: 教育 编程 算法
权利声明: 未经许可,不得转载。