루빅스 큐브의 아이덴티티 시퀀스


32

이동 순서는 Rubik 's Cube에서의 이동 순서 (회전)입니다 (아래 표기법 참조). 빈 이동 시퀀스 외에도 큐브에 전혀 영향을 미치지 않는 다른 많은 이동 시퀀스가 ​​있습니다. 우리는 이러한 이동 시퀀스를 식별 시퀀스라고 부릅니다.

이러한 신원 순서 중 일부는 U2 R R' U2또는 같은 결정을 내릴 수 U D2 U' D2있습니다. 첫 번째에서는 두 번의 임의 이동이 수행 된 U2 R후 즉시 취소 R' U2됩니다. 두 번째는 비슷합니다. 처음 두 번의 임의 이동 U D2후 실행 취소되지만 순서는 반대 U' D2입니다. 이동 U은 상위 레이어의 조각 D2에만 영향을 미치고 이동 은 하위 레이어의 조각에만 영향을 미치기 때문에 작동합니다 . 이 두 이동 시퀀스의 시각화를 볼 수 있습니다.

U2 RR 'U2 U D2 U 'D2

다른 식별 순서는 전혀 명확하지 않을 수 있습니다. 예를 들어 시퀀스 R' U' R' F' U F U' R' F R F' U' R U2 R입니다. 꽤 길지만 큐브에는 전혀 영향을 미치지 않습니다.

여기에 이미지 설명을 입력하십시오

이동 표기법

움직임은 큐브의 6면 중 하나의 한 레이어의 회전을 나타냅니다. 이동은면을 나타내는 하나의 문자와 회전 각도를 나타내는 선택적 접미사로 구성됩니다.

글자와 해당면은 U (위-위를 향한면), D (아래-아래를 향한면), R (오른쪽-오른쪽을 향한면), L (왼쪽-왼쪽을 향한면) , F (앞면-자신을 향한면) 및 B (뒷면-자신을 향한면)

접미사가 없으면 얼굴이 시계 방향으로 90도 회전하고 접미사가 '의미되고 얼굴이 시계 반대 방향으로 90도 회전되고 접미사가 2의미되면 얼굴이 시계 방향으로 180도 회전됩니다.

표기법에 문제가있는 경우 http://alg.cubing.net을 사용 하면 이러한 이동 시퀀스를 시각화 할 수 있습니다.

도전

당신의 임무는 이동 시퀀스가 ​​ID인지 아닌지를 결정하는 프로그램을 작성하는 것입니다.

당신은 전체 프로그램이나 함수를 작성할 수 있습니다. STDIN, 명령 행 인수, 프롬프트 또는 함수 인수를 통해 입력으로 이동 시퀀스 (공백이 공백으로 구분됨)를 포함하는 문자열을 수신하고 부울 값 또는 해당 정수를 리턴 (반환 값 또는 STDOUT을 통해)해야합니다. True-1-동일성 시퀀스 / False-0-동일성 시퀀스가 ​​아님).

접미사 '가 프로그래밍 언어에서 문제를 일으키는 경우 숫자가 아닌 다른 기호를 사용할 수 있습니다. 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?
John Dvorak

2
나는 모든 사람이 같은 전제 조건을 가지고 있는지 확인하고 싶습니다. 허용 U3하면 접미사를 숫자로 캐스팅하는 것보다을 허용 합니다.
Jakube

3
T-Top, B-Bottom 및 P-Posterior (뒤)를 사용하는 표기법에 더 익숙합니다. 사람들은 아마도 시퀀스를 보는 것을 좋아했을 것 R2 D2입니다.
mbomb007

2
@ mbomb007 나는 T를 최고로 이해할 수 있지만, P를 사후에 본 적이 없으며 그 의미가 귀하의 의견에 대한 것이 아니라는 것을 이해하지 못합니다 ...
John Dvorak

2
@ mbomb007 그 표기법도 보았지만 원래 Singmaster 표기법만큼 흔하거나 오래되지는 않았으며 사람들이 왜 원본을 엉망으로 만들고 싶어하는지 모르겠습니다. David Singmaster (내가 아는 한)는 언급하지 않았지만, 모든면이 완벽하게 일관되고 위치가 아닌 방향으로 간주 될 경우 충돌이 없음을 관찰했습니다. That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Level River St

답변:


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는 IS 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에 대한 정의에서 두 번 나타납니다 f. _대소 문자 를 삭제하여 의미가 무엇인지 확실하지 않은 경우- _->a완전히 빠지거나 맨 위로 이동하면 철저한 패턴 예외가 발생하지 않으며 맨 위로 이동해도 문자가 저장되지 않습니다. 그러나 5자를 저장할 수있었습니다.
John Dvorak

훌륭한 솔루션. 모든 테스트 사례를 확인했습니다.
Jakube

다시 한 번 솔루션에 축하드립니다. 가장 짧은 코드를 제시 했으므로 100 평판의 현상금을받습니다.
Jakube

4

큐빅 으로 6 4 바이트

¶=8%

내가 이겼다 : P

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

메모장이 0으로 초기화됩니다. 큐브가 해결되지 않으면 8 번째 "얼굴"에 1이 포함되고 그렇지 않으면 0이 포함됩니다.

온라인으로 사용해보십시오!


3
흥미로운 언어 인 것 같습니다. 그러나 챌린지가 게시 된 후 언어가 작성되었으므로이 언어를 사용할 수 없습니다.
Jakube

2
@Jakube 나는 그것이 도전 후 늦게 게시 된 Rubik 's 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도우미 기능 일뿐입니다. r한면의 회전을 수행합니다. 얼굴은 다음과 같이 인코딩됩니다.

  1. 6 단계의 모든 모서리
  2. 6 단계의 모든 모서리

이 순서는 회전 및 비틀림 인코딩을 용이하게합니다. t는 특정 큐브 회전에서 얼굴을 비틀어 얼굴을 선택하는 부사입니다.

X그리고 Y왼쪽 인수로 전체 큐브의 방향의 수를 취 부사입니다.

다음 줄은 모든 회전을 정의합니다. 회 전당 3 자 : 이름, 회전 수 및 방향.

마지막 줄은 테스트 동사를 정의하고 T3 '을 거듭 제곱 표기법으로 변환 하고 테스트 벡터를 추가하는 작업 순서를 뒤집고 전체 항목을 최종적으로 실행합니다.

요청시 자세한 내용.

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 개의 테스트 사례를 추가했습니다. 그들 중 두 명은 여전히 ​​잘못된 결과를 반환합니다. 모서리의 방향을 무시한 것 같습니다.
Jakube

@jpjacobs 지금이 질문에 100 개의 현상금이 있습니다. 코드를 수정하고 싶습니까?
Jakube

짜잔 이제는 그것을 줄였습니다.
jpjacobs

2

파이썬 3 : 280 자

이것은 도전에 참여하지 않습니다. 첫째로 나는 도전을 직접 요청했기 때문에 두 번째는 내 코드가 아니기 때문에 도전했다. 모든 크레딧은 Stefan Pochmann 에게 있으며 루빅스 큐브를 시뮬레이션하는 멋진 방법을 발견했습니다. 나는 도전과 관련하여 약간의 골프와 약간의 변화 만했다.

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조각의 위치를 나타내며 UF, UR및의 정도. 예를 들어 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.