ルービックキューブですか?

ペダントの伝説的な時間は、「Rubik’s
Cubes」(Tシャツ、ポスターなど)の写真は実際には解決できないと指摘しています。

最初にチェックする必要があるのは、キューブが正しい部分で構成されていることです。解けるようにするには、キューブにはそれぞれ9つの四角形の6色が必要です。キューブには、各エッジとコーナーユニット(キューブを構成する小さなキューブ)が一意である必要があります。それらが一意である必要があるだけでなく、2つの中央のピースが互いに反対である場合、エッジまたはコーナーピースはそれらの色の両方を含むことができません。

すべての適切な部分から構成されたキューブを取得したら、それを解決できるかどうかを確認する必要があります。ここにはいくつかのルールがありますので、私はそれらを説明するために専門家に任せます。以下のスポイラーは、これをどのように行うことができるかを説明します。自分で問題を解決することに興味がある場合は、このチャレンジを理解したり参加したりするためにサイトにアクセスする必要はありません。

リンクされた説明

あなたの仕事は、入力としてパターンを取り、それが実際に解けるルービックの立方体であるかどうかを判断することです。解決できるようにするには、立方体が各面に1つの色しか持たないように(そして異なる面が異なる色を持つように)、キューブ上で有効な移動を実行する方法が必要です。ルービックの立方体には標準的な色が付いています(白は黄色に向いています)。

有効な移動は、立方体の片面の時計回りまたは反時計回りのいずれかの回転です。キューブの顔の回転に伴い、顔に接する四角形も同様に回転し、以前触れていた顔に接続したままになります。

IO

あなたは合理的な方法で立方体を取ることができます。あなたの言語が
“キューブフェイス”タイプのものを持っていれば、それは入力としてはうまくいくが、キューブのネットの2D配列を取ることもできる。ちょうど妥当である。特定のフォーマットがチャットで受け入れ可能なコメントかpingであるかどうかを知りたければ、その妥当性を述べるためにチャレンジに追加します。

入力フォーマットは最大9色しかサポートしていません。

出力に関しては決定の問題ですので、 “はい、これは有効なルービックの立方体です”と
“いいえ、これは有効なルービックキューブではありません”という1つの定数値を出力する必要があります。


This is
so answers will be scored in bytes with less bytes being
better.

テストケース

Here are テストケース. They are formatted as the net of a cube with
each square as a single letter. Different letters represent
different colors. Any more testcases can be added upon request.

解決可能

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

Un解決可能

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWYWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   GGG
GGYWYWRBBOBO
GGYWWWROBOOO
GGYWWWRBBOOO
   BBB
   YWY
   YYY


   RRW
   RRW
   GGG
GGYWWYEOBROO
GGYWWYEBBROO
GGOWWYWBBROO
   BBB
   YYW
   YYO
ベストアンサー

Cubically, 1664 1631 1089
bytes

⇒FD2F'R'D2RUR'D2RFD2F'U'
⇒Ff1F'
⇒LFf1F'L'
⇒F'f1F
⇒F2f1F2
⇒L'F2f1F2L
⇒D'F'f1FD
⇒LR'FLR'DLR'B2L'RDL'RFL'RU2
⇒LFf8F'L'
⇒R'F'f8FR
⇒Ff8F'
⇒F'f8F
⇒ULU'f8UL'U'
⇒U'R'Uf8U'RU
⇒F2f8F2
⇒Df15D'
⇒D'f15D
⇒D2f15D2
⇒UF2UF2D'L2B2U'B2DL2F2D2B2D2F2
⇒U'DL2UD'B2
⇒UF2UF2D'L2B2D'R2UR2F2D2B2U2B2
⇒BL'BU2D2F'RF'U2D2
⇒LD'F2U'B2U'RU2R'F2R2F2D'R2DF2D
⇒B2URB2D2B2RB2U'D'L2D'B2
⇒B2LF'U'B2UFL'R2B2U'D2L2D'B2U
⇒B2RB2D2B2RB2U'L2UD'F2U'F2B2
⇒D2R'FUB2U'F'RU2B2D'F2R2UF2UF2
⇒B2R2U'L'D2B2U2R'U2R2F2L2R2UR2
⇒D2L'B2U2F2RUL2U'F2R2U'R2U2F2DL2D'
⇒UB2U'L2DL2B2DB2D'B2
⇒BR'BL2B'RBL2B2
⇒UF2B2U'F2B2U'F2L2R2B2R2
⇒R2U'F2DR2UF2D'R2DF2R2D'F2
⇒U'F2DF2UL2F2DL2DF2L2D2F2
⇒U2D'L2U'F2L2U'B2L2R2U'L2B2
⇒F2D'R2U2L2B2UF2L2U2F2L2UF2R2
⇒[f1]3
⇒[f2f37]3
⇒[f3f38]3
⇒[f4f39]3
⇒[f5f40]3
⇒[f6f41]3
⇒[f7f42]3
⇒[f8f43]2
⇒[f9f44]2
⇒[f10f45]2
⇒[f11f46]2
⇒[f12f47]2
⇒[f13f48]2
⇒[f14f49]2
⇒[f15f50]2
⇒[f16f51]2
⇒[f17f52]2
⇒[f18f53]2
⇒[f19f54]2
⇒[f20f55]3
⇒[f21f56]4
⇒[f22f57]5
⇒[f23f58]6
⇒[f24f59]7
⇒[f25f60]8
⇒[f26f61]9
⇒[f27f62]9[f27f62]2
⇒[f28f63]9[f28f63]3
⇒[f29f64]9[f29f64]4
⇒[f30f65]2
⇒[f31f66]3
⇒[f32f67]4
⇒[f33f68]5
⇒[f34f69]6
⇒[f35f70]7
rs[f36f71]8

Output if solvable: Solved!
Output if unsolvable: (empty, no output)

Input should be formatted as a Cubically cube-dump (see the
Debug section). This was
explicitly allowed by the OP.

説明

このプログラムでは、 Devil’s
Algorithm

を使用して、同じグループ内のキューブのすべての可能な状態を繰り返し処理します。解決された立方体。キューブが解ける場合は、アルゴリズムが終了する前に(私が使用したアルゴリズムは正しく動作します)。

(Cubicallyのコードページでは0x84)で始まる行はすべて関数定義です。これらの機能は、実際の悪魔のアルゴリズムを構成するよう互いに組み合わされています。実行される最初の行が最後の行です。

rs[f36f71]8

r reads a cube from stdin and sets the memory cube
to it. s puts the interpreter into “solvemode”, which
means that it exits and prints Solved! if the cube
becomes solved (after being unsolved) at any point. The rest of the
commands (which simply repeat f36f71 8 times)
correspond to the final algorithm at the bottom of the linked
page:

(D) = (CP) = (CPT8) = [(CPC8)(CPT7)]8 (3,847,762,288,469,010,006,992 moves)

(D) is the Devil's Algorithm. If you apply it to the cube, it will be solved at some point before you have done the algorithm once. As you can see, it is terribly long, nearly a thousand times more moves than there are possible positions.

どのように私はそれを実行できますか?

することができます<�のhref =
“https://tio.run/##XVE5rh0hEMzfKV5GCk3DMOkIEREhEVkT2F9qydKPbDnwCZz7iL7Ic3ezeJFmqeqtiubt26fPbx/[email protected]/[email protected]/[email protected]/[email protected]oXdHaUKzBlwkceBWwVeubU/@XZNOhtlncYBVc1VwfdH68MhkjlBeh0sQd8LtA27s/80zaedOmgJlUisCR5S7J8Dsua1GaGke4j/[email protected]@[email protected]@YqOONAL10huY8W6nKZ2xz0UCfQ6VaV135HeyBgn[email protected]EuLCzhKGTRxh3AQIj008YdoECc9NAgW7SaTgNjkowCaJwjbgTgrbAVgKYR/
XUYg3TgIUjjtM4imkO06CFM77mCRQtHeaJFJ09znJQRHuc4ElmCh6jSpYyidF1KiCacFbins93lGM
@ zKA4rHLPMW0nHqkeC6nPtBh2emXr4wjHe5Or9fz @ bTWPuTnxo @ Zcw4AvPeI @
HDWCQSPAf/NcHUIQX8YJvsN」のrel =
“nofollowをnoreferrer”>オンラインにそれをしようが、そのリンクは動作しません。このアルゴリズムが終了する前に、TIOはほとんど間違いなくタイムアウトします(インタプリタの最大ランタイムは60秒です)。キューブが解けるわけではない場合、このアルゴリズムは、キューブ式に完了するまでに1100万年かかるでしょう(1秒間に1520万回の移動で、私の
Cloud9 IDE
が取得されます)。

Additionally, you need a lot of memory to perform 3
sextillion moves. Cubically can perform about 4 million moves per
second, but the process will most likely be killed due to overcommitted
memory
. It dies after 15 seconds on my VM with 512MB of
memory.
Why should performing moves on an already-allocated
flat array cost memory? Found a memory leak (or twenty) and fixed it.

Here is a much more readable version
that behaves the same way.

しかし、私は本当にそれが動作することを確認したい!

この悪魔のアルゴリズムで実行される最初の実際の移動は F2 であるため、解く最も速い立方体は
F2 でスクランブルされたものになります。

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

これは確かに0.007秒<�のhref =
“https://tio.run/##[email protected]/[email protected]/v/@[email protected]@[email protected][email protected]/w4jqNvocPQsDW3DbI9icrIzRpsgCrruORnIssTfKLvCxNKm1WqGuUNri0lC3p8sWsa7IxC8E94L/[email protected][email protected]/r4juxGU0001HGnviGKD7IotxM436t6WvX5MIg7zATMFDssBM0UO6wEzJY7TATNljv6AmWaOdMBMC8dgME0qRgPmmjgmELrnmEHoxHEGoQeOCwg9clxB6InTBELPnDwIfeZEIPSFUwChr5wiiG3JadM1YfWc8nPCR5zmW0RE4LS8TMRFTus9RHTiPN1P5GTOで実行されます/
l @ JzJkzvYaosnAOrydqrZzj/yL @ FhPnBEKXn3m @ JqzEeX5O @
ALn5RYRETmvLxNxiefpHj58/vLev5vfcMg8i/A2n8 @
n02mapofjleR37H0gIh9ClL/ibeXPJLx @ AQ “rel =” nofollow noreferrer
“> on TIO 。

どのように改善することができますか?

確かにもっと悪魔のアルゴリズムがあります。私は、これが行う動きの30分の1以下を使用するものを見つけました。しかし、複雑なハミルトニアン回路をCubicallyコードに変換するには、数千バイト(約100MB以上)と数十時間かかることになります。

また、いくつかの関数を削除して、ループを真下に置くこともできます。しかし、私はいくつかの読みやすさのためにいくつかのバイトを犠牲にするつもりです。

さらに、Cubicallyのループ動作の変更を考慮して、ソースで7回または8回繰り返される関数呼び出しでハードコーディングするのではなく、アルゴリズムを7〜8回簡単に繰り返すことができます。または、私はメモ帳でいくつかの魔法を働かせ、より多くのループを使ってゴルフをするでしょう。

私はインタプリタで何かを可能な限り最適化し続けるつもりであることに注意してください。これは、将来的に平均的なPCで動作するかもしれません!


キュービックには、2バイト

r▦

私は上記の答えがより好きなので、これを代替ソリューションとして追加しています。これは、数百万年ではなく、1秒未満で実行されます。

r    read cube from standard in
 ▦   and solve it

Output if the cube is solvable: (nothing)
Output if the cube is unsolvable: Error: The
cube has reached an unsolvable state.

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です