算24全分析:计算力最强的牌组是哪个?最好算的数字是哪个?
有了Python语言,我们可以对算24游戏相关内容做一个比较彻底的分析。为什么必须python语言,其它语言不行么?当然也可以,只是python让很多算法可以比较简单地实现,让研究过程更有乐趣。
6/3,2*7,14+10
算24全分析
o 问题1:扑克牌玩法的算24游戏有多少种不同的组合
o 问题2:其中有多少种组合是有解的
o 问题3:扩展问题——算23,算25,等等
o 问题4:计算能力最强的牌组
o 问题5:给出计算过程
o 问题6:不同牌组的计算难度
问题1:扑克牌玩法的算24游戏有多少种不同的组合
问题转化为一个组合问题:从1~13,抽取4个数字的组合,抽取可以重复。转化为苹果和盘子的语境就是:从13种不同的苹果中任意抽取,放在4个相同的盘子里,盘子不允许为空。
结果显示:1820
应该说,这是一个相当小的数字,
问题2:其中有多少种组合是有解的
这就稍微复杂一点,必须做求解的判断。我们采用最朴素的算法,也正是大多数算24游戏所采用的操作方法:从现有牌组中任选两个数字,进行所有可能的计算,将结果放回剩下的数字中。继续这种操作,直到最后只剩下一个数字。检查它是否等于24,在所有递归操作中,有一种情况成立即说明有解。这里将涉及4个小算法:三个个辅助算法(任性两个数字、所有可能的计算、剩下的数字),和最后可解性判断的算法。
得到结果,1362种是可解的,大约占到3/4。
问题3:扩展问题——算23,算25,等等
如果你经常亲自玩这个算24的游戏,有时会遇到我们能算23,也能算25,就是一时想不出怎么算24。我们直观的感觉,算23和25机会都应当少得多,以前日本也有类似算10的游戏,似乎也有因子太少的问题,不如算24的机会多。其他数字怎样?比如36,48,甚至60,虽然因子也很多,但数字太大可能会失去一些较小数字的机会。我们猜想之所以只有算24流行,是因为在所有目标数字中,4张牌组能够算出24的机会最多。
是否真的如此呢?让我们编程验证一下,把上面的算法略改一下就可以看看计算其他数字的可解比例。结果可能会让你大吃一惊:
- 虽然24的计算可解比例是一个局部高点,而且高于所有以后的数字,但不如20以及所有18以前的数字。
- 你相信么?给你4张牌,你有更大的概率算出17而不是24。
- 算出25的机会,其实略小于算23的机会!
总的规律是:数字越小的可计算比例越高,因子越多的可计算比例最高。
所有100以内的目标数字中,可计算比例最低的是最大的质数97,仅20%左右。可计算比例最高的,是最小的质数2,在全部1820种牌组中,仅62种组合不能算出2,可计算率高达96%+。像36、48、60、72这种因子较多的数字,都形成了局部高点,但总的来说,数字越大可计算的比例越小。
为什么只有算24的游戏最流行呢?只怕或许没什么特别的原因。
整个计算过程超过10分钟。
问题4:计算能力最强的牌组
我们换一个角度来看分析,有些牌组计算能力就比较强,可以算23、24、25等等很多数字;而另外一些计算能力就弱一些。比如四个1,它的计算能力就很弱,能够计算的数字仅0,1,2,3,4,更多的就没法算了。我们想看看不同牌组的计算力如何。仍然以0~100的目标数字为限,超过100的数字不在统计。当然非整数也不统计在内。
大约10分钟后得到计算结果,限于篇幅,就不一一展示每个牌组的计算能力了。最后得到计算力最强的牌组为:[2, 3, 7, 12]。
100以内可计算的整数共有82种,其中30以下所有的数字都能计算,而且算法还不复杂,有兴趣的朋友可以自己试试,稍后公布答案。
问题5:给出计算过程
前面只是做了能否计算的判断,下一个需求是给出计算过程。我们用一个简单的办法来表示计算过程,即三个公式。比如用[2, 3, 7, 12]计算24的方法,简单表示为:‘7+12,3+19,2+22,’。
为了得到计算过程,在问题2的基础上,有两个算法的代码略做修改。
举例,下面显示最强牌组[2,3,7,12]计算0~30目标数字的解法:
- 0 12-7,5-3,2-2,
- 1 12-7,5-3,2/2,
- 2 7-3,12/2,6.0-4,
- 3 7*3,12*2,24-21,
- 4 12-7,3+5,8/2,
- 5 12-7,3-2,5/1,
- 6 12-7,3+5,8-2,
- 7 7+12,19+2,21/3,
- 8 7+12,19-3,16/2,
- 9 12-7,5-2,3*3,
- 10 12-7,3+5,2+8,
- 11 7+12,3+19,22/2,
- 12 3*2,7-6,12/1,
- 13 7+12,3*2,19-6,
- 14 7+12,19-3,16-2,
- 15 7*3,12/2,21-6.0,
- 16 12-7,3+5,2*8,
- 17 12-7,3*5,2+15,
- 18 7+12,19-3,2+16,
- 19 7+12,3-2,19/1,
- 20 7+12,3+19,22-2,
- 21 12-7,5+2,3*7,
- 22 12*3,7*2,36-14,
- 23 12+3,15*2,30-7,
- 24 7+12,3+19,2+22,
- 25 7+12,3*2,19+6,
- 26 7*12,84/3,28.0-2,
- 27 7*3,12/2,21+6.0,
- 28 7-3,12*2,4+24,
- 29 12+3,7*2,15+14,
- 30 7*12,84/3,2+28.0,
上面的计算过程,仅仅是给出一个计算方案,没有考虑计算方案的复杂程度(虽然这几个看起来都比较简单)。这就引出了下一个问题——
问题6:不同牌组的计算难度
这是算24最有趣的一部分,有些牌组很容易得到计算方案,有些牌组却百思不得其解,很可能被误认为无解。最有名的一些难度牌组如:[1,5,5,5],[3,3,7,7]等。
为了实现这种分析,必须拿到所有的解法。对于一套牌组来说,它的解题难度是由最简单的那个解法决定的。我们对所有的解法,逐一打分,返回分数最低的,作为整个牌组的难度分。
难度判断算法
判定牌组的难度是比较主观的,在计算机看来,不同的解法之间并没有什么难度的差别可言。只是对于有着某种计算习惯的人类来说,才会有难度差异感觉。我们采用这样计算方法来进行难度评价的标准:
· 解法的最后一步如果是通过整数乘法计算得到24,难度认定为1
· 但如果在最后一步的乘法,参与了小数,一般人是难以想到的,难度定为5
· 最后一步是加法的难度是2
· 最后一步是减法(排除减0这种情况),难度为3
· 最后一步是除法(除除1这种情况),那就可以说是很难了,难度为4
这个难度判断逻辑未必严谨,但实际得到的分析结果,大致符合实际计算观感。 算法同时返回最简单的计算方法。
从结果看,无解的458组,这个早已有结论;
难度为1的 956组
难度为2的 290组
难度为3的 86组
难度为4的 20组
难度达到5的,仅10组
系统认为难度达到4级或5级的,一共只有30组。这里将他们列举出来,有兴趣和自信的朋友可以尝试手工求解。不过,当你知道它们的难度是4级5级,其实是一个巨大的提示,反而容易想出来。所以,如果你把这些题目出给你的朋友们,大概是最有趣的。
- 牌组[1, 2, 7, 7],难度4
- 牌组[1, 3, 4, 6],难度4
- 牌组[1, 4, 5, 6],难度4
- 牌组[1, 5, 5, 5],难度5
- 牌组[1, 5, 11, 11],难度4
- 牌组[1, 6, 6, 8],难度4
- 牌组[1, 6, 11, 13],难度4
- 牌组[1, 7, 13, 13],难度4
- 牌组[1, 8, 12, 12],难度4
- 牌组[2, 2, 11, 11],难度5
- 牌组[2, 2, 13, 13],难度5
- 牌组[2, 3, 5, 12],难度4
- 牌组[2, 4, 10, 10],难度5
- 牌组[2, 5, 5, 10],难度5
- 牌组[2, 7, 7, 10],难度5
- 牌组[3, 3, 7, 7],难度5
- 牌组[3, 3, 8, 8],难度4
- 牌组[3, 5, 7, 13],难度4
- 牌组[3, 6, 6, 11],难度4
- 牌组[3, 8, 8, 10],难度4
- 牌组[4, 4, 7, 7],难度5
- 牌组[4, 4, 10, 10],难度4
- 牌组[4, 8, 8, 11],难度4
- 牌组[4, 8, 8, 13],难度4
- 牌组[5, 5, 7, 11],难度5
- 牌组[5, 7, 7, 11],难度5
- 牌组[5, 10, 10, 11],难度4
- 牌组[5, 10, 10, 13],难度4
- 牌组[6, 11, 12, 12],难度4
- 牌组[6, 12, 12, 13],难度4