TrialPay在他们的博客上发布了一个关于蛇魔方谜题的编程问题。
最近,我们的一位工程师向我们介绍了蛇形魔方。蛇形魔方是由一串魔方链组成的拼图,由贯穿每个魔方的松紧带连接。每个立方体可以围绕松紧带旋转 360°,允许根据最初构建链的方式构建各种结构,最终目标是以创建立方体的方式排列立方体。
例子:
这种特殊的排列包含 17 组立方体,由 8 组两个立方体和 9 组三个立方体组成。这种排列可以用多种方式表达,但为了本练习的目的,让“0”表示旋转不会改变拼图方向的棋子,或者可以认为是“直”棋子,而“1”将表示旋转会改变拼图配置或“弯曲”蛇的部分。使用该模式,上面的蛇拼图可以描述为 001110110111010111101010100。
挑战:
你的挑战是用你选择的任何语言编写一个程序,它将立方体维度(X、Y、Z)和二进制字符串作为输入,如果可以解决问题,则输出“1”(不带引号)谜题,即在给定立方体方向的情况下构造一个适当的 X Y Z 立方体,如果当前排列无法解决,则为“0”。
我发布了解决方案的半详细说明,但是如何确定程序是否解决了问题?本来想弄更多的测试用例,但是遇到了一些问题:
- TrialPay 博客中的蛇形立方体示例与维基百科的蛇形立方体页面和 www.mathematische-basteleien.de 上的图片具有相同的组合。
- 手动将图像转换为字符串非常繁琐。
我试图制作一个可以产生很多组合的程序:
#We should start at the binary representation of 16777216 (00100...), because
#lesser numbers have more than 2 consecutive 0s (000111...)
i = 16777216
solved = []
while i <= 2**27:
s = str(bin(i))[2:]
#Add 0s
if len(s) < 27:
s = '0'*(27-len(s)) + s
#Check if there are more than 2 consecutive 0s
print s
if s.find("000") != -1:
if snake_cube_solution(3, 3, 3, s) == 1:
solved.append(s)
i += 1
但它只需要永远完成执行。有没有更好的方法来验证程序?
提前致谢!