ルービックキューブスクランブル


21

あなたの仕事は、ランダムな動きのシーケンスを作成することです。これは、ルービックキューブをスクランブルするために使用できます。このようなスクランブルは、正確に25の動きで構成されています。各動きは、UDRLFBオプションでサフィックスの1つが続く文字で構成されます'2

この表記法は、Singmaster表記法と呼ばれます。UDRLFBは6つの面のいずれかを表し、オプションのサフィックス'2は回転角度を表します。この情報は、タスクを解決するために決して必要ではありません。

スクランブルが「良質」であることを保証するには、次の2つのルールを適用する必要があります。

  • 2つの連続した動きに同じ文字を含めることはできません。これは、連続した移動を禁止UUDDRRLLFFおよびBBなど、オプションの接尾辞を使用して、すべてのこれらの組み合わせU2UU'U'

    これらのムーブペアは、1ムーブまたは0ムーブに簡単に減らすことができるため、禁止されています。U2Uと同じ効果がU'ありR'R、と同じ効果があります。

  • 3つの連続した動きは、同じ文字グループのものであってはなりません。文字グループはUDRLおよびFBです。この規則は、さらに連続して移動を禁止UDUDUDRLRLRLFBFBFBなどの任意の接尾辞を使用して、すべてのこれらの組み合わせU2DURL'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'U2L2 U R2 F' R' U2L2U R2F'R'U2許可されていません。


もしかしてUR 2許可されていませんか?U R2 必要があります移動の間にスペースが理にかなっているので、私が思うに、許されます。
mbomb007

@ mbomb007のようなものを意味しL2U R2F'R'U2ます。Uオプションのサフィックスがないため、スペースを使用しないでください。スペースは、オプションのサフィックスの代わりにはなりません。
寂部

すべての動きの間にスペースがある場合はどうなりますか?U F2 L D2 R'...たとえば、出力できますか?この場合、余分なスペースはありません。これは、ルールに従って問題ないはずです。
mbomb007

@ mbomb007はい、説明に入れます。
ジャクベ

2は手紙の前ではありませんか?オブジェクト指向
オリバーニッケル

回答:


6

CJam、47 45バイト

このソリューションは、これまでに投稿された他のソリューションとは異なるアプローチを使用しています。CJamの簡潔なリスト操作を利用して、使用可能な移動リストを生成し、各反復ごとにランダムに選択します。修飾子は単純に独立して生成されます。

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

{BA^2/6,_B-?A:B-mr0=:A"UDRLFB"=3mr[L2'']=}25*

説明

{               "Loop...";
  BA^2/           "If the two previous moves were not from the same group, ...";
  6,              "... then produce the available move list [0 1 2 3 4 5], ...";
  _B-             "... else produce the available move list [0 1 2 3 4 5] with
                   the second previous move removed";
  ?
  A:B             "Save the previous move as the second previous move";
  -               "Remove the previous move from the available move list";
  mr0=            "Randomly select an available move";
  :A              "Save this move as the previous move";
  "UDRLFB"=       "Map this move to its character (implicitly printed)";
  3mr[L2'']=      "Randomly select a modifier (implicitly printed)";
}25*            "... 25 times";

9

C、129

f(){int i,n,m,r,s,t;for(i=26;i--;i<25&&printf("%c%c","URFDLB"[s%6],"'2"[r%3])){for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;s+=m;}}

内側ループは、の値を生成するm範囲内1..5に添加sし、モジュロ6、どの2つの連続的な移動は、立方体の同じ側にないことを確実に採取します。の古い値mが格納されn、テストm*n==9により値m= 3が連続して2回生成されないことが保証されます(したがって、反対側の面を連続して2回選択することはできません。文字列内の面の順序に注意してください)

の最下位部分は、の末尾のヌル文字を利用して、使用するrサフィックス('2またはヌル)を決定するために使用されます"'2"

外側のループは26回実行されます。最初は、選択Uできないprintfため、最初の反復では抑制されます。

テストプログラムのゴルフのないコード

ungolfedコードプット明確にするために各移動の間の空間(golfedコードは、1つのバイトを節約するために、ない。)さらにgolfedコードは再配置によってセミコロン節約printfforブラケット。

f(){
  int i,n,m,r,s,t;
  for(i=26;i--;){
    for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;
    s+=m;
    i<25&&printf("%c%c ","URFDLB"[s%6],"'2"[r%3]);
  }
}

main(){
  int j;
  srand(time(0));
  for(j=0;j<5;j++)f(), puts("");
}

典型的な出力

U' B D2 B' R' L F' D2 B D2 B2 R' B2 U D2 F' R U R' L B' L R2 B2 F'
U B U B F L2 D2 B' U' L B L R' D B U' D R D' B' F2 D' B D R
L D F2 B2 R' U F B' D2 L U R' L' U2 F' R F D U2 B L' B' U L2 F'
R2 B' F2 R2 L2 F' U2 L U' B' F R' D' F2 D F' L2 U2 R' D' B2 D F R2 L'
U2 F2 B2 D' F D F R L2 U' B D2 L' R D R F2 R' F2 U2 D R' D2 L F2



4

Pyth、 65 66

私はPythで実際にゴルフをしたことは一度もありません。プログラムを1つか2つ書いたかもしれません。これは、基本的に@ steveverrillのソリューションをPythに翻訳したものです。改善提案を歓迎します。

更新:スクランブルもで始まるように1バイトを追加しましたU。Cソリューションは、未定義の動作に依存して動作する可能性があります...

=YO6V25JZK1WK=GO15=Z/+3G3=Kq9*ZJ)~YZpd+@"URFDLB"%Y6?@"'2"%G3>2%G3k

これは少ない割り当てで行うべきだと思いますが、そのためにはアルゴリズムを大幅に変更する必要があります。(まあ、試してみてください。)

Cコードに基づいた説明を次に示します。

=YO6           s = random.choice(range(6))
V25            for i in range(25):
  JZ               n = m
  K1               t = 1
  WK               while t:
    =GO15              r = random.choice(range(15))
    =Z/+3G3            m = (r + 3) / 3
    =Kq9*ZJ            t = 9 == m * n
  )
  ~YZ              s += m
  pd               print(..., end = " ")
  +                ... + ...
  @"URFDLB"%Y6     "URFDLB"[s % 6]
  ?@"'2"%G3>2%G3k  "'2"[G % 3] if 2 > G % 3 else ""

変数Yとを切り替えますZZは0で事前初期化されているため、最初の3文字を保存します。
寂部

@ジャクベしかし、次に設定する必要がありますn = m(3行目の説明)。これn = 0は最初を意味する必要があり、順番Yに0にする必要があります
。– PurkkaKoodari

Y空のリストで事前に初期化されます[]。そして、私はn最初のイテレーションで問題の価値を考えていません。
寂部

ところで、あなたのコードはで始まるスクランブルを生成しませんU
寂部

@ジャクベ、ありがとう、修正。
PurkkaKoodari

4

JavaScriptの(ES6)175 178 204

3バイト少なく編集します。1つはコードを変更し、2つはバイトのカウント方法を変更します(カウントしませんF=)。

繰り返しを避けるためのコードは、@ stevemillerから取得されます。手紙のグループを管理する彼の方法はさらに優れていますが、私はそれを盗むつもりはありません。

ボーナス:オプションで移動数を指定できます。

(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

少ないゴルフ

(n = 25) => 
{
  R = n => Math.random()*n | 0;
  N = _ => 'UDRLFB'[(r += 1+R(5)) % 6];
  r = 0;
  b = N();
  a = N();
  for(s = '' ; n; )
     c = N(),
     ~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')
       ? 0
       : s += (--n, a=b, b=c) + ["","'",2][R(3)];
  return s
}

テスト

var F=
(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

function go() {
  console.log(F(+M.value))
}

go()
Moves <input type=number min=1 id=M value=25 max=999>
<button onclick='go()'>Test</button>





1

Clojure、223バイト

(let[R(range)F(fn[f p c](apply concat(filter f(partition-by p c))))](apply str(map str(take 25(F(fn[p](<(count p)3))(zipmap"UDLF""1122")(F(fn[p](=(count p)1))int(for[_ R](rand-nth"UDRLFB")))))(for[_ R](rand-nth[""\'\2])))))

これは「シーケンス->パーティション->フィルター->連結」パターンに大きく依存しており、フェイスの「不正な」シーケンスを除外するために使用されます。このseqは、ランダムな接尾辞(空の文字列を含む)とともに文字列にマップされます。

ゴルフをしていない出発点:

(->> (for[_(range)](rand-nth"UDRLFB"))
     (partition-by int)           ; "identity" would be the correct fn to use here
     (filter(fn[p](=(count p)1))) ; Only one identical value in partition
     (apply concat)
     (partition-by(zipmap"UDLF""1122")) ; R & B are in the implicit nil group
     (filter(fn[p](<(count p)3)))       ; Only 1 or 2 consecutive faces from a group
     (apply concat)
     (take 25))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.