大约一年半前我在微博讲了一个日历游戏 (详情见 http://t.cn/AXhdAoeX ) 。那个游戏我现在几乎每天玩,做咖啡的时候就拼出那一天。刚开始的时候遇到难的可能要花20分钟。现在比较有经验了,平均两分钟可以搞定。
与那个玩具一起买的还有另一个凑数玩具。要求从圆心出发的每条射线上的数字加起来等于50。图一是那个游戏的随机状态。图二从侧面看可以更清楚每个转盘的结构和整体层次。因为每个转盘下面的数字与上面一起转,每层的转动都会有数字被覆盖或者原来被覆盖的数字冒出来。各种组合太多,答案不好找。一年多中我玩过至少10次,总是东边按下葫芦西边起了瓢,每次都是两三分钟后就放弃。感觉永远不会解出来了。
两天前在朋友圈里看到有人写程序解puzzle。他说那个长蛇puzzle困惑他好些年,最后终于决定写个程序把他搞定。图三是他想解的puzzle,要求把长蛇复原成立方块。图四是程序给出解答后他复员出的解答。
那个朋友圈提醒了我。我也可以用程序来解决这个转盘puzzle. 下班路上开车想了一下如何写程序,回来就开工。20分钟写程序。输入游戏中的数据花不少时间,实际程序很快(因为开车时已经想清楚了)。可是程序运行无解。我以为程序有虫,花了超过写程序的时间找虫。后来发现是我原始数据输入出错(我先前已经检查两遍,但看来不够仔细。程序无虫,数字肯定有问题。所以一个数一个数地看,总算找到错误)。数字输入正确以后,程序运行时间0.05秒。
英文有谚语说 If all you have is a hammer, everything looks like a nail (当你手中只有锤子,一切问题都变成钉子)。我的锤子就是编程,这个问题就变成钉子。一锤子下去,0.05秒问题就没了。
有人或许会说,写程序解没有动手解有乐趣。实际上各有各的乐趣。当我按程序答案转出图五时,感觉一锤子下去把钉子敲平所带来的快感比慢慢转木头搜索要强烈得多。
关于程序补充一下。如果手动求解的话,那个长蛇问题应该比这个转盘问题容易。但写程序的话,转盘问题要简单很多。长蛇程序有400行(Python),真是长蛇。我的程序(MATLAB) 只有25行,包括10行输入数据。另外,程序只搜出一个解,也就是说解唯一,难怪手动搜索那么难。
