用 python 计算 24 点的 python 时间 24 小时系统
最编程
2024-04-27 19:01:42
...
解题思路:
要注意的点: 1-13每个数字都有可能出现4次,所以用穷举法,可能性太多,难以穷举完全, 因为找不到完整的规律,所以考虑直接使用暴力搜索;
即: 1-13中 使用4层嵌套循环,第1层 第1个数字从1-13开始遍历,第2层,即第2个数字从1-13开始遍历,第3,第4层同样,这样就把所有有序排列组合都展示出来了;
第二步就是数字间的(+ - * / )组合运算, 四个数字,中间需要3个运算符, 即从4个中取3个的有序排列组合,比如 +-* , +++,---;等等同样使用3层遍历;
工具介绍:
python中封装了专门排列组合的库 itertools,具体了解参考链接: https://docs.python.org/zh-cn/3/library/itertools.html
上述提到,所有的排列组合,重复的考虑使用 itertools.product 笛卡尔积,不重复的使用 itertools.permutations
简单介绍下它们的使用:
for i in (x for x in product('ABCD', repeat=2)):
print(i)
# 输出结果是: AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
# 即product中第一个参数是可迭代器,第二个参数的值是组合的长度
for j in (x for x in permutations('ABCD', repeat=2)):
print(j)
# 输出结果是: AB AC AD BA BC BD CA CB CD DA DB DC
通过上述我们可以把所有数字排列组合用运算符字符串拼接成一个字符串,但最终我们要的是数字间的运算结果,所以我们需要把包含运算符的字符串转化为数字运算,
这里就需要用到python 的eval 函数了,简单介绍下使用:
x = 7
y= eval( '3 * x' )
print(y) # 输出21
开始解题
import itertools
def fun(li):
# 字符串切分后的列表, 如果包含大小王则直接返回 ERROR
if li.__contains__('joker') or li.__contains__('JOKER'):
print('ERROR')
return
# 扑克牌中 JQKA 和对应数字的替换,便于后续数字操作,即下数d,注意后续满足条件的输出要重新替换回JQKA,属于原格式也要保留,即li
m={'J':'11','Q':'12','K':'13','A':'1'}
d=[]
for i in li:
if i in m:
d.append(m[i])
else:
d.append(i)
c = ['+','-','*','/']
# x 和 c 组合 表示运算符的所有排列组合(4取3)
for i in (x for x in itertools.product( range(4),repeat=3)):
# j 和 d 组合 表示输入的长度为4的字符串 打散后所有有序的排列组合
for j in itertools.permutations(range(4),4):
# 替换成数字后的所有数字和运算符字符串拼接的完整字符串组合
# t1 = d[j[0]] + c[i[0]] + d[j[1]] + c[i[1]] + d[j[2]] + c[i[2]] + d[j[3]]
# 这里() 需要加,不加在牛客网中代码通过率始终只有50% ,这里有点坑;
t1 = '((' + d[j[0]] + c[i[0]] + d[j[1]]+ ')' + c[i[1]] + d[j[2]]+ ')' + c[i[2]] + d[j[3]]
# 原生的拼接组合
t2 = li[j[0]] + c[i[0]] + li[j[1]] + c[i[1]] + li[j[2]] + c[i[2]] + li[j[3]]
if eval(t1) == 24:
print(t2)
return
print('NONE')
if __name__ == '__main__':
while True:
try:
s = input()
fun(s.strip().split())
except:
break
标签:24,__,数字,itertools,li,华为,print,排列组合,python3
上一篇: 二十一点的 javascript 实现
下一篇: 定点优化:指数级性能提升
推荐阅读
-
用 python 计算 24 点的 python 时间 24 小时系统
-
卷积的意义--我见过最生动易懂的解释--就是在图像处理中,将两组分辨率不同的图像进行卷积处理,从而形成易于处理的平滑图像。卷积甚至可以用在考试作弊中,为了让照片中的两个人同时像,只要对两个人的图像进行卷积处理就可以了,这是一种平滑处理,但我们如何才能真正把这个公式与实际建立一种联系,也就是说我们能不能从生活中找到一个很方便具体的例子来表达这个公式的物理意义呢? 有一个七品县令,喜欢打骂无赖,并有一个惯例:只要不犯大罪,只打一顿就放他回家,以示爱民如子。 有一种无赖,想扬名立万却又不抱多大希望,心想:既然扬不了好名,出了臭名也成啊。怎样才能出恶名呢?炒作!怎么炒作?找名人!他自然而然地想到了自己的长官--县令。 无赖于是在光天化日之下,站在县衙门口撒了泡尿,后果可想而知,自然是被请进堂上挨了板子,然后昂首挺胸地回家,躺了一天,哎!身体并无大碍!第二天照样如此,全然不顾行政长管的仁慈和衙门的尊严,第三天、第四天 ......每天去县衙领板子回来,还兴高采烈,坚持了一个月之久!这个无赖的名声像衙门口的臭气一样传遍了八方! 县太爷噤了噤鼻子,愣愣地望着惊堂木案,皱了皱眉头,思考着一个问题:这三十块大木板怎么会不好用呢?......想想也是,当年这位大人金榜题名的时候,我数学考了满分,所以这道题至少今天得解出来: --人(系统!)会怎么样(系统!)之后会怎么样(输出!)人(系统!)被打之后会怎么样? --有什么用,很疼! --我问的是:会发生什么? --取决于有多疼。就像这个无赖的体质,每天挨一板什么事都不会发生,连哼哼两声都不行,你看他那得意洋洋的样子(输出 0);如果一次连打他十板,他可能会皱着眉头,咬着牙,硬是不哼一声(输出 1);打到二十板,他会疼得脸都变形了,像猪一样哼哼唧唧(输出 3);打到三十板,他可能会像驴一样嚎叫,一把鼻涕一把泪,求你饶他一命(输出 5);打到四十板,他会大小便失禁,勉强哼哼(输出 1);打到五十板,他连哼哼都不能哼一下(输出 0)--死! 县官摊开坐标纸,绘制了一条以挨打次数为 X 轴、哼唱程度(输出)为 Y 轴的曲线: --"呜呼!这条曲线就像一座山,想不通,想不通。为什么那个无赖被打了三十天也不喊救命? --哦,你打的时间间隔(Δτ=24小时)太长了,这样无赖一天承受的痛苦程度,没有叠加,始终是个常数;如果缩短时间间隔(建议Δτ=0。5 秒),那么他的疼痛程度就可以迅速叠加;等到无赖挨了三十下(t=30)时,疼痛程度已经达到他叫喊能力的极限,就会收到最好的惩戒效果,再多挨几下也不会手下留情。 --还是不太明白,为什么疼痛程度会在小时间间隔内叠加? --这跟人(线性时变系统)对木板(脉冲、输入、激发)的反应有关。什么是响应?人收到板子后,疼痛的感觉会在一天内(假设,因人而异)慢慢消失(衰减),而不是突然消失。这样,只要中风的时间间隔较小,每次中风造成的疼痛就没有时间完全衰减,都会对最终的疼痛程度产生不同的影响: t 块大板造成的疼痛程度 = Σ(第 τ 块大板造成的疼痛程度 * 衰减系数)[衰减系数是 (t - τ) 的函数,请仔细品味] 数学表达式为:y(t) = ∫T(τ)H(t-τ)
-
Python实现24点游戏的计算器
-
秒杀24点!用Python轻松计算并获取表达式
-
Python瞬间计算24点,这可行吗?详解itertools.chain.form_iterable的用法
-
超快速24点游戏用Python来实现!详解其背后的原理
-
Python计算24点的方法和原理详细解析