TrialPay は、ブログにスネーク キューブ パズルに関するプログラミングの質問を投稿しました。
最近、当社のエンジニアの 1 人がスネーク キューブを紹介してくれました。スネーク キューブは、各キューブレットを通る弾性バンドで接続された一連のキューブレットで構成されるパズルです。各キューブレットは弾性バンドを中心に 360° 回転することができ、チェーンを最初に構築する方法に応じてさまざまな構造を構築できます。最終的な目標は、キューブを作成するような方法でキューブを配置することです。
例:
この特定の配置には、17 グループのキューブレットが含まれており、2 つのキューブレットの 8 つのグループと 3 つのキューブレットの 9 つのグループで構成されています。この配置はさまざまな方法で表すことができますが、この演習では、回転によってパズルの向きが変わらないピース、または「まっすぐな」ピースと見なされるピースを「0」、「1」とします。は、回転によってパズルの構成が変化するピース、またはヘビを「曲げる」ピースを示します。そのスキーマを使用すると、上記のヘビ パズルは 00111011011101011101010100 と記述できます。
チャレンジ:
あなたの課題は、選択した任意の言語で、立方体の次元 (X、Y、Z) とバイナリ文字列を入力として取り、問題を解決できる場合は '1' (引用符なし) を出力するプログラムを作成することです。パズル、つまりキューブレットの向きを指定して適切な X Y Z 立方体を構築し、現在の配置が解決できない場合は '0' を返します。
解決策の半詳細な説明を投稿しましたが、プログラムが問題を解決するかどうかを判断するにはどうすればよいですか? もっと多くのテストケースを取得することを考えましたが、いくつかの問題に遭遇しました:
- TrialPay のブログのスネーク キューブの例は、ウィキペディアのスネーク キューブのページと www.mathematische-bastelien.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
しかし、実行が完了するまでには永遠に時間がかかります。プログラムを検証するためのより良い方法はありますか?
前もって感謝します!