Golden Thumb

remote tutor & close friend of chosen kids
proud dad of an awesome daughter
正文

大隐隐于市

(2019-09-22 14:24:24) 下一个

写个魔方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)
评论
目前还没有任何评论
登录后才可评论.