ルービックキューブのIDシーケンス


32

移動シーケンスは、ルービックキューブ上の移動(ターン)のシーケンスです(表記については、下をご覧ください)。空の移動シーケンスのほかに、他の多くの移動シーケンスがあり、キューブにはまったく影響しません。これらの移動シーケンスをIDシーケンスと呼びます。

これらのIDシーケンスの一部は、U2 R R' U2またはなどのように決定するのが明らかU D2 U' D2です。最初のものでは、2つのランダムな動きが行われU2 R、その後すぐに元に戻されR' U2ます。2番目は似ています。最初の2つのランダムな動きU D2とその後は元に戻されますが、順序は逆U' D2です。これは機能します。移動Uは上層のD2部分のみに影響し、移動は下層の部分のみに影響するためです。これら2つの移動シーケンスの視覚化を見ることができます。

U2 RR 'U2 U D2 U 'D2

他の同一性シーケンスはまったく明らかではないかもしれません。たとえば、シーケンスR' U' R' F' U F U' R' F R F' U' R U2 R。かなり長いですが、キューブにはまったく効果がありません。

ここに画像の説明を入力してください

移動記法

移動は、立方体の6つの面のうちの1つの1つのレイヤーの回転を表します。動きは、顔を表す1文字と、それに続く回転角度を表すオプションの接尾辞で構成されます。

文字とそれに対応する面は、U(上-上を向く面)、D(下-下を向く面)、R(右-右を向く面)、L(左-左を向く面)です。 、F(正面-あなたに面する側面)およびB(背面-あなたから離れる面)。

接尾辞がない場合、顔は時計回りに90度回転し、接尾辞'は顔が反時計回りに90度回転し、接尾辞は顔が2時計回りに180度回転します。

表記に問題がある場合は、http://alg.cubing.netを使用するだけで、そのような移動シーケンスを視覚化できます。

チャレンジ

あなたの仕事はプログラムを書くことで、それは移動シーケンスがアイデンティティかどうかを決定します。

完全なプログラムまたは関数を作成できます。入力として(STDIN、コマンドライン引数、プロンプト、または関数引数を介して)移動シーケンス(移動はスペースで区切られます)を含む文字列を受け取り、ブール値または対応する整数(戻り値またはSTDOUTを介して)を出力する必要があります( True-1-IDシーケンス/ False-0-IDシーケンスではありません)。

接尾辞'がプログラミング言語で問題を引き起こす場合は、数字ではなく別の記号を使用できます。R F2 U3許可されていません。

これはcodegolfであるため、最短のコード(バイト単位)が優先されます。

テストケース

"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False

何が問題なのR F2 U3ですか?
ジョンドヴォルザーク

2
すべての人が同じ前提条件を持っていることを確認したいだけです。を許可する場合U3、接尾辞を数字にキャストするよりも簡単です。
ジャクベ

3
T-Top、B-Bottom、およびP-Posterior(back)を使用する表記法に慣れています。人々はおそらくシーケンスを見るのが好きだったでしょうR2 D2
mbomb007

2
@ mbomb007 ...それはあなたのコメントはありませんでした私はトップのためのTを理解することができますが、私はPを見たことがない後部と私はその意味を理解しないだろう
ジョンドヴォルザーク

2
@ mbomb007私もその表記を見ましたが、それは元のSingmaster表記ほど一般的でも古いものでもありません。そして、なぜ人々がオリジナルを台無しにしたいのかわかりません。David Singmaster(私が知る限り)は言及していませんが、位置ではなく方向として考えた場合、すべての顔は完全に一貫しており、衝突はありません。That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
レベルリバーセント

回答:


14

ハスケル、263の 261 247 243文字

c[x]=[x]
c(x:"2")=[x,x]
c(x:_)=[x,x,x]
s!a@[x,y,z]=case s of
 'R'|x>0->[x,-z,y]
 'B'|y>0->[z,y,-x]
 'U'|z>0->[-y,x,z]
 'L'|x<0->[x,z,-y]
 'F'|y<0->[-z,y,x]
 'D'|z<0->[y,-x,z]
 _->a
r=[-2..2]
i=mapM id[r,r,r]
f w=i==foldr(map.(!))i(c=<<words w)

むしろ簡単なアルゴリズム; 各キューブレットは、その位置と方向をエンコードする1,2,4または8個のチャンクで構成されています。エッジキューブレットごとに4チャンク、コーナーキューブレットごとに8チャンク、7キューブレットが静止しています。

c cは、入力の各ワードを一連のCWターンに!送信し、ターンに従って各チャンクを送信します。iある dentity位置が。fメインであるFの慰めは。

chomp関数にはあまり満足していませんが、短縮する方法も見つけられないようです(ただし、@ Nimiはそうしました)


どの程度c(x:"2")=[x,x]c(x:_)=[x,x,x]。2バイト節約します。
-nimi

を使用しi=sequence[s,s,s]、すべてのタプルをリストに変更すると(つまり:に(x,y,z)なり[x,y,z]ます)、9文字まで保存されます。インライン化すると、さらに4つ節約できます。落下_からケースを!別の11セーブ
MtnViewMark

@MtnViewMarkが完了し改善されましたi、ありがとう。インライン化の意味がわからないi-の定義に2回現れることに注意してくださいf_ケースをドロップすることの意味がわかりません- _->a完全に除外するか、最上部に移動すると、完全なパターン例外が発生し、最上部に移動しても文字は保存されません。ただし、5文字を保存することができました。
ジョンドボラック

素晴らしい解決策。すべてのテストケースをチェックしました。
ジャクベ

繰り返しになりますが、おめでとうございます。最短のコードを提示したため、100の評判に値する賞金を受け取ります。
ジャクベ

4

通常6 4バイト

¶=8%

私が勝ちます:P

¶=8%
¶     read a string, evaluate as Cubically code
 =8   set notepad to (notepad == 8th face)
   %  print notepad

メモ帳はゼロに初期化されます。8番目の「面」には、キューブが未解決の場合は1が含まれ、それ以外の場合は0が含まれます。

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


3
興味深い言語のように見えます。しかし、チャレンジが投稿された後に言語が作成されたため、優勝する資格がありません。
寂部

2
@Jakube RubikのCubeビルトインが、チャレンジ後遅くに投稿され、他の回答を完全に削除した言語であるという事実だけで、受け入れられないことに同意します。しかし、メタごとに勝つことは技術的には資格があります(競合しないルールはいくらか取り消されました)。
MD XF

3

J- 232、220、381、315 296バイト

このソリューションは、すべての操作を面の順列としてエンコードし、キューブ全体の回転の下で、すべての面のねじれが実際に同じであるという事実に基づいて機能します。

編集:もう少しゴルフ

f=:+/~6&*
r=:4 :'y f&.>(]{^:x~)&.C.;/i.2 4'"0
t=:((r~0),_4<\44#.inv 1478253772705907911x)&C.&.
Y=:(C.(,0 2 r 4 5),;/4 f&i.8)&{^:t
X=:((,1 1 0 2 r 2 4 3 1)C.C.;/0 4 2 5 f i.8)&{^:t
61".@A."1'=: ',"#~6 3$'D0XR1YF1XU2YB3XL3Y'
T=:[:(_2".@}.'(i.48)-:'&(,,[))[:(,'^:',])/&.>@|.&.;:[:''''&=@{.`]},:&'3'

前の試行以外に、これコーナー回転を考慮します。

f単なるヘルパー関数です。r1つの面の回転を行います。顔は次のようにエンコードされます。

  1. 6のステップですべてのコーナー
  2. 6のステップですべてのエッジ

この順序により、回転とねじれのエンコードが容易になります。 tは、特定の立方体の回転の下で顔をひねり、顔を選択する副詞です。

XそしてY、左引数として立方体全体のその方向の数をとる副詞です。

次の行は、すべての回転を定義します:回転ごとに3文字:名前、回転数、および方向。

最後の行は、テスト動詞を定義し、T3および'Power表記に変換し、テストベクトルを追加し、最後に全体を実行する操作の順序を反転します。

リクエストに応じて詳細。

tests =: (] ;. _2) 0 : 0

 U2 R R' U2
 U D2 U' D2
 U2 R2 R'
 R' U' R' F' U F U' R' F R F' U' R U2 R
 L'
 B B2 B' B2
 D D2 D'
 R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'
 D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'
 B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2
 R U2 R' U R' U2 R U2 R U R' U' R' U R U2
 U F B' R' U F' R U' F' B L U' F L'
 R2 U' R' U' R U R U R U' R
 R' F R' B2 R F' R' B2 R2
)
res =: 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
res ([,],:=) T"1 tests NB. passes all tests.
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

NB. some handy display methods:
dispOrig=: (". ;._2) 0 :0
   _   _   _   5  29  11   _   _   _   _   _   _
   _   _   _  47  _1  35   _   _   _   _   _   _
   _   _   _  23  41  17   _   _   _   _   _   _
   3  27   9   0  24   6   1  25   7   2  26   8
  45  _3  33  42  _6  30  43  _5  31  44  _4  32
  21  39  15  18  36  12  19  37  13  20  38  14
   _   _   _   4  28  10   _   _   _   _   _   _
   _   _   _  46  _2  34   _   _   _   _   _   _
   _   _   _  22  40  16   _   _   _   _   _   _
)
ind =: dispOrig i.&, i. 48 NB. indices of i.48 in the original display

disp =: (9 12$(,dispOrig) ind}~ ])
changed =: 1 : '(u ~:&disp ]) i.48' NB. use to debug permutation verbs: L ch
vch =: 1 :'disp  ((]+_*=) u)'
NB. viewmat integration RGB
cm =: 255 * 1 0 0 , 1 1 1, 0 1 0, 1 1 0, 1 0.5 0, 0 0 1,: 0 0 0 NB. colormap
NB. use as:  "cube i. 48" for seeing a nice folded out cube.
cube =: cm viewmat (>&7 + >&15 + >&23 + >&31 + >& 39 + >&47)@|@disp@]

11
「私のテスト結果は与えられたものと一致しないので...」のように、あなたのソリューションは機能しませんか?私は...それを投稿しないでしょう
ジョンドヴォルザーク

あなたが正しい。今それを修正しました。
jpjacobs

さらに4つのテストケースを追加しました。それらのうちの2つは、まだ誤った結果を返します。角の向きを無視しているようです。
寂部

@jpjacobs現在、この質問には100人の担当者がいます。コードを修正したいですか?
ジャクベ

出来上がり。今、それを減らします。
jpjacobs

2

Python 3:280文字

これはチャレンジの参加者ではありません。第一に、チャレンジを自分で尋ねたからです。第二に、それが私のコードではないからです。すべてのクレジットはStefan Pochmannに属します。StefanPochmannは、ルービックキューブをシミュレートするこの素晴らしい方法を発見しました。チャレンジに関しては、いくつかのゴルフといくつかの小さな変更を行いました。

def f(a):
 s=t="UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR".split()
 for m in a.split():q="FLBR FRBL FDBU FUBD URDL ULDR".split()['UDLRFB'.index(m[0])];n=2+"2'".find(m[-1]);s=[[p,p.translate(str.maketrans(q,q[n:]+q[:n]))][m[0]in p]for p in s]
 return s==t

この背後にある考え方は次のとおりです。sピースの位置を表しUFURおよびにそうします。例えば:s = ['DF', 'BL', ...]手段、作品はそのUF位置にあるDF、作品はUR位置にありBL、...

移動するとき、ピースの位置はどのように変化しますか。U-move を実行するとU、前面に面した-layerのすべてのステッカー(色)が左面に移動します。左の顔のステッカーは後ろに、これらは右に、これらは正面に移動します。でエンコードされていFLBRます。いくつかの例:へのUF移動UL、へのUFR移動ULFなど。したがって、移動を適用することは、対応するレイヤーのピースの面を単純に変換することです。

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