大隐隐于市

来源: 金拇指 2019-09-22 14:24:24 [] [博客] [旧帖] [给我悄悄话] 本文已被阅读: 次 (3662 bytes)

写个魔方app来模拟标准魔方,很容易就把脑袋瓜转懵圈了。因为6x9共54个小正方形,每个都要编上号,编号方式也不太容易确定(哪个做头哪个做尾?),然后这个转到那里,那个转到这里。不说它有多难吧,也够烦人的。

高智商的小P同学两周前就下手了。前转后转,左转右转,上转下转,还有逆时针反转。各种转法都是以函数的形式写出来。如附图图显示,左面背面和底面看不见,搞清楚三面的每个色块的逻辑关系需要多一点点的想象力。正面“Front”直勾勾地盯着你,相对直白,透亮,怎么看都属于最容易对付的。

魔方行话中顺时针转上下左右前后分别用这些字母代表:U,D,L,R,F,B;逆时针转上下左右前后分别用这些字母代表:U',D',L',R',F',B'。

小P同学很快就写完了函数turnF(),然后其它11个类似函数也一个一个写出来了,最简测试好像还行,没发现太明显的问题。接着加了个洗牌按钮,点击后随机洗牌10000次,也就是转上10000次,每次随机地从12种转法中挑一种。

没想到洗牌按钮犹如神探,一按就出明显bug,即同一方块的两个邻面出现相同颜色。每次我俩讨论的内容,就是用各种不同的方法debug,比如写test cases,或者肉眼观察,再比如让全部54个小正方形除一个外都用同一个颜色,然后跟踪那块唯一不同的色块。他干累了,我说,我来试试,我慢吞吞小心翼翼地手工跟踪着某个色块,还真找到一个bug,然后小P同学上去搞定了,我们还补上一个test case。我说:“OK I found one. Now it's your turn.”把皮球踢给他了。

两周下来,他解决了不少问题,但只要一洗牌,错误邻色块立马现身。昨天晚上,他发信息给我:“there are still a few bugs in our actual app, but I cannot find them”。有点要投降的味道。鬼知道12种转法哪个或哪几个有问题。

今天上午,我说咱们用个偷懒的办法试试运气。让小P同学在洗牌函数中,每次注释掉一种转法,只用其它未注释的11种参与洗牌。失败,失败,失败,...,当注释到 turnF() 时,问题消失了,怎么洗牌都看不见错误邻色块了。我俩都不愿意相信这个被认为最不可能出错的“正面Front顺时针旋”转是罪魁祸首。但事实就是事实,小P同学找到turnF() 仔细检查,秒杀了最后这个顽固的bug。当时跳入我脑海的就是这几个字“大隐隐于市”。

我知道小P同学中文还行,就在他的电脑屏幕上写了“大隐隐于市”,并问道:“你知道这几个字的意思吗?”

......

 




更多我的博客文章>>>

所有跟帖: 

在市上的是中隐 -千里一盏灯- 给 千里一盏灯 发送悄悄话 千里一盏灯 的博客首页 (0 bytes) () 09/22/2019 postreply 14:31:37

大隐,你在哪里? -金拇指- 给 金拇指 发送悄悄话 金拇指 的博客首页 (0 bytes) () 09/22/2019 postreply 18:44:23

用了12个旋转函数?用数学统一为一个,就容易了。 -L1- 给 L1 发送悄悄话 L1 的博客首页 (0 bytes) () 09/22/2019 postreply 15:43:47

一个按钮,或一个手势,触发一个旋转。比如按钮U一按,就触发顺时针旋转魔方顶层,对应的函数是 turnU()。 -金拇指- 给 金拇指 发送悄悄话 金拇指 的博客首页 (0 bytes) () 09/23/2019 postreply 04:45:36

小隐隐于垃圾桶 -古代的事物- 给 古代的事物 发送悄悄话 (459 bytes) () 09/22/2019 postreply 18:27:48

小隐,快出来吧,那儿味不正。 -金拇指- 给 金拇指 发送悄悄话 金拇指 的博客首页 (0 bytes) () 09/22/2019 postreply 18:45:34

请您先登陆,再发跟帖!