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


25

ped敬の念を抱かせる時間は、「ルービックキューブ」の写真(Tシャツ、ポスターなど)が実際には解けないことを指摘することです。

最初に確認する必要があるのは、キューブが適切なピースで構成されていることです。キューブを解くには、それぞれが9つの正方形の6色が必要です。また、キューブには、エッジとコーナーの各ユニット(キューブを構成する小さなキューブ)が一意である必要があります。それらは一意である必要があるだけでなく、2つの中央ピースが互いに向かい合っている場合、エッジまたはコーナーピースはこれらの色の両方を含むことができません。

すべての適切なピースで構成されるキューブを作成したら、それが解決可能であることを確認する必要があります。ここにはいくつかのルールがありますので、専門家に説明を委ねます。以下のネタバレでこれを行う方法を説明します。自分で問題を解決することに興味がある場合は、サイトにアクセスしてこの課題を理解したり参加したりする必要はありません。

リンクされた説明

あなたの仕事は、入力としてパターンを取り、それが実際に解けるルービックキューブであるかどうかを判断することです。解けるようにするには、キューブの有効な移動を実行する方法が必要です。これにより、キューブの各面の色が1つだけになります(また、異なる面の色は異なります)。ほとんどのルービックキューブには標準の色が付いています(白は黄色の反対側など)。この特定の色に解決状態が続くとは思わないかもしれません。

有効な移動は、立方体の1つの面の時計回りまたは反時計回りの回転です。立方体の面を回転すると、面に接する正方形も回転し、以前に触れていた面に接続されたままになります。

IO

キューブは合理的な方法で使用できます。言語に組み込みの「キューブフェイス」タイプがあり、入力に適している場合は、キューブのネットの2D配列、各フェイスに1 3 x 3リストを使用できます。ただ合理的です。特定の形式が受け入れられるかどうかを知りたい場合、またはチャットでpingを送信し、その有効性を示すためにチャレンジに追加します。

入力フォーマットは、最大9色までサポートする必要があります。

出力の場合、これは決定問題であるため、「はい、これは有効なルービックキューブです」に1つの定数値を、「いいえ、これは有効なルービックキューブではありません」に別の定数値を出力する必要があります。


これはため、回答はバイト単位でスコアリングされ、バイト数が少ない方が優れています。

テストケース

ここにテストケースがあります。これらは、各正方形が1文字の立方体のネットとしてフォーマットされます。異なる文字は異なる色を表します。リクエストに応じて、さらにテストケースを追加できます。

可解

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

解決できない

   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

14
あなたのアバターのルービックキューブは解けないことを指摘する義務があります。通常のルービックキューブには9が必要ですが、正方形の上部にある奇妙なシンボルは言うまでもありません。
DJMcMayhem

2
@DJMcMayhem私の子供には、ルービックキューブに4つの「サブキューブ」しかありません。
アダム

2
@ H.PWizいいえ、できません。それは私の定義では暗黙的でしたが、質問では明確にします。
小麦ウィザード

2
仕様には、キューブの3つのパリティ法則の完全な説明は含まれていません。1. 180度反転したエッジを1つだけにすることは不可能です(言及)2. 120度ねじったコーナーを1つだけにすることは不可能です(言及しません) )。これが解決されるまで、私は慎重に投票します。説明については、ryanheise.com / cube / cube_laws.htmlを参照してください。
レベルリバーセント

4
@LevelRiverStルービックキューブは自己完結型であることに注意してください。数学の定式化とパリティの法則は誰でも独立して導出できます。
user202729

回答:


14

通常1664 1631 1089 バイト

⇒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

解決可能な場合の出力:Solved!
解決できない場合の出力:(空、出力なし)

入力は、キューブキューブダンプとしてフォーマットする必要があります(Debugセクションを参照)。これはOPによって明示的に許可されていました。

説明

このプログラムは、悪魔のアルゴリズムを使用して、解決されたキューブと同じグループ内のキューブのすべての可能な状態を反復処理するアプローチを取ります。キューブが解ける場合、アルゴリズムが完了する前のある時点で解決されます(使用したアルゴリズムが適切に機能すると仮定します)。

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

rs[f36f71]8

rstdinからキューブを読み取り、それにメモリキューブを設定します。sインタプリタを「solvemode」にします。Solved!つまり、キューブが任意の時点で解決された(未解決になった)場合、終了して印刷します。残りのコマンド(単純にf36f718回繰り返す)は、リンクされたページの下部にある最終アルゴリズムに対応しています。

(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.

どうすれば実行できますか?

オンライン試すことができますが、そのリンクは機能しません。TIOは、このアルゴリズムが完了する前にほぼ間違いなくタイムアウトします(インタープリターの最大実行時間は60秒です)。キューブが解けない場合、このアルゴリズムはCubicallyが終了するまでに最大1,100万年かかります(1秒あたり最大1,520万回の移動で、Cloud9 IDEが取得します)。

さらに、3つの六十の動きを実行するには多くのメモリが必要です。通常、1秒あたり約400万回の移動を実行できますが、メモリのオーバーコミットによりプロセスが強制終了される可能性が高くなります。512MBのメモリを搭載したVMで15秒後に死にます。既に割り当てられたフラットアレイで移動を実行するのにメモリが必要なのはなぜですか?メモリリーク(または20)を発見し、修正しました

ここでは同じように動作はるかに読みやすいバージョンです。

しかし、私は本当にそれが機能することを見たいです!

この悪魔のアルゴリズムで実行される最初の実際の動きはF2であるため、解決する最も速いキューブは次のようにスクランブルされF2ます。

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

これは実際にTIOで0.007秒実行されます。

これはどのように改善できますか?

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

一部の関数を削除して、下部のループに直接配置することもできます。ただし、読みやすくするために、いくつかのバイトを犠牲にします。

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

インタプリタで可能な限り最適化を続けるため、将来的には平均的なPCで動作する可能性があることに注意してください!


通常、2バイト

r▦

上記の回答の方が好きなので、代替ソリューションとしてこれを追加しています。これは、数百万年とは対照的に、1秒未満で実行されます。

r    read cube from standard in
 ▦   and solve it

キューブが解決可能な場合に出力:(nothing)
キューブが解決できない場合に出力: Error: The cube has reached an unsolvable state.


サイドを入れ替えても機能しますか?たとえば、キュ​​ーブダンプでは2は4の反対ですが、2が5の反対で4が0の反対の場合は機能しますか?
小麦ウィザード

1
@WheatWizardはい、あります。solvemodeは、各面に一意の整数があり、その整数が面上の唯一の整数であるかどうかをチェックします。
MD XF

当然です。私は、これがあなたの説明からそうであるかどうかを知るほど、Cubicallyに十分に精通していませんでした。
小麦ウィザード

@WheatWizard私があなたを正しく理解していることを確認するだけです- これはあなたが言及していることです(の線に沿って)、そうですか?
MD XF

はい。そして、それは解決可能でなければなりません。
小麦ウィザード

4

APL(Dyalog Classic)190 174バイト

{∧/~∊(×1 2 3|+.-⌿↑⊃∘⍋¨¨¨a)({2|≢∪{⍵⌊⍵[⍵]}⍣≡⍵,0}¨⍳⌿↑⌽b)((∪≢∩)¨/b←(⊃∘⍋⌽⊢)¨¨¨a),6≢≢∪⊃⊃a←{c4⍴⊂⍬⋄c[+/1≠i],←(≠/×i←↑⍳33){⊂⌽⍣⍺⊢⍵~' '}¨,⌿(3|∘.+⍨⍳3)⍉⍤¯11 0 1\⍵1c}¨⍵(3 3∘⍴¨1 1∘⌷¨⍵)}

オンラインでお試しください!

引数は、3x3文字のマトリックスの3x2マトリックス(row0:前面、背面、row1:左右、row2:上下)です。可解ルービックキューブの場合は1を返し、それ以外の場合は0を返します。

TIOリンクでtは、文字カウントに含まれないfunctionは、9行の入力を読み取り、それらをデフォルトの入力形式(ネット)から必要な3x2 x 3x3マトリックスに変換し、ソリューションを呼び出し、結果がOK期待どおりです。

アルゴリズムは、指定されたキューブを長さ3(角)、2(エッジ)、および1(中心)の文字列の26立方体に分割します。また、同じ6つの中央キュービィーを持つ解決されたキューブの26のキュービィーを生成します。以下のすべての基準を満たす必要があります。

  • 6つのセンター間で重複はありません

  • 回転まで、与えられた/解決されたキュービのセットが一致します-例 'WBR''BRW'、同じしますが、'BWR'

  • コーナー置換とエッジ置換の両方のパリティは偶数です

  • 角回転インデックスのモジュロ3和(例えば、「最小」の文字を取るB我々は基準点として:'BRW'→0'WBR'→1'RWB'→2)所与と解決キューブの間で一致。2を法とするコーナーでも同じ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.