あなたの仕事は、ランダムな動きのシーケンスを作成することです。これは、ルービックキューブをスクランブルするために使用できます。このようなスクランブルは、正確に25の動きで構成されています。各動きは、UDRLFBオプションでサフィックスの1つが続く文字で構成されます'2。
この表記法は、Singmaster表記法と呼ばれます。UDRLFBは6つの面のいずれかを表し、オプションのサフィックス'2は回転角度を表します。この情報は、タスクを解決するために決して必要ではありません。
スクランブルが「良質」であることを保証するには、次の2つのルールを適用する必要があります。
2つの連続した動きに同じ文字を含めることはできません。これは、連続した移動を禁止
UU、DD、RR、LL、FFおよびBBなど、オプションの接尾辞を使用して、すべてのこれらの組み合わせU2UかU'U'。これらのムーブペアは、1ムーブまたは0ムーブに簡単に減らすことができるため、禁止されています。
U2Uと同じ効果がU'ありR'R、と同じ効果があります。3つの連続した動きは、同じ文字グループのものであってはなりません。文字グループは
UD、RLおよびFBです。この規則は、さらに連続して移動を禁止UDU、DUD、RLR、LRL、FBF、BFBなどの任意の接尾辞を使用して、すべてのこれらの組み合わせU2DU、RL'RまたはB2FB'。グループは、移動軸によって面を並べ替えます。
Uそして、D同じ軸の周りの両方のターンので、同じグループに属しています。したがって、U動きはD顔のD部分に影響を与えず、動きはU顔の部分に影響を与えません。したがって、2つの動きは交換できUDU、と同じ効果がUUDあり、これをに減らすことができますU2D。
チャレンジ
1つのランダムなスクランブルを生成するスクリプトまたは関数を作成します。入力はありません。スクリプト/関数は、25の動きを分離せずに印刷するか、1つのスペースで区切るか、対応する文字列を返す必要があります。
プログラムはすべてのスクランブルを作成できる必要があり、上記のルールを満たします。もちろん、乱数生成器は真の乱数であり、擬似乱数ではないと仮定します。
これはコードゴルフです。最短のコード(バイト単位)が勝ちます。
出力例:
スクリプト/関数を3回呼び出すと、次のようなものが出力/返されます。
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
移動をそれぞれスペースで区切った場合:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
これらの出力はすべて25の動きで構成されていますが、オプションのサフィックスのため、長さが異なることに注意してください。2またはのいずれか'がサフィックスとして使用されている場合、スペースを印刷することはできません。あなたは印刷する必要がありL2UR2F'R'U2かL2 U R2 F' R' U2。L2U R2F'R'U2許可されていません。
L2U R2F'R'U2ます。Uオプションのサフィックスがないため、スペースを使用しないでください。スペースは、オプションのサフィックスの代わりにはなりません。
U F2 L D2 R'...たとえば、出力できますか?この場合、余分なスペースはありません。これは、ルールに従って問題ないはずです。
UR 2許可されていませんか?U R2必要があります移動の間にスペースが理にかなっているので、私が思うに、許されます。