루빅스 큐브인가요?


25

pedants의 존경하는 통과 시간은 티셔츠, 포스터 등의 "Rubik 's Cubes"의 사진이 실제로는 해결할 수 없다는 것을 지적하는 것입니다.

가장 먼저 확인해야 할 것은 큐브가 올바른 조각으로 구성되어 있다는 것입니다. 큐브를 풀 수 있으려면 큐브에 각각 9 개의 사각형이있는 6 개의 색상이 필요합니다. 큐브는 또한 각 모서리 및 모서리 단위 (큐브를 구성하는 작은 큐브)가 고유해야합니다. 그것들은 독특해야 할뿐만 아니라 두 개의 중앙 부분이 서로 마주 보면 가장자리 또는 모서리 부분이 두 색상을 모두 포함 할 수 없습니다.

모든 올바른 조각으로 구성된 큐브가 있으면 여전히 풀릴 수 있는지 확인해야합니다. 여기에는 몇 가지 규칙이 있으므로 전문가에게 문의하여 설명하겠습니다. 아래 스포일러는이 작업을 수행하는 방법을 설명합니다. 혼자서 문제를 해결하는 데 관심이 있다면이 문제를 이해하거나 참여하기 위해 사이트를 방문 할 필요가 없습니다.

연결된 설명

당신의 임무는 패턴을 입력으로 취하여 실제로 해결할 수있는 Rubik의 큐브인지 확인하는 것입니다. 큐브가 각면에 하나의 색상 만 있고 서로 다른면이 다른 색상을 갖도록 큐브에서 유효한 이동을 수행 할 수있는 방법이 있어야합니다. 대부분의 Rubik 큐브는 표준 색상으로 표시됩니다 (흰색은 노란색과 반대입니다). 해결 상태가이 특정 색상을 따르는 것으로 가정하지 않을 수 있습니다.

유효한 이동은 큐브의 단일면을 시계 방향 또는 시계 반대 방향으로 회전하는 것입니다. 큐브의면이 회전하면면과 접하는 사각형도 회전하며 이전에 닿은면에 연결된 상태로 유지됩니다.

IO

합리적인 방법으로 큐브를 가져갈 수 있습니다. 언어에 내장 된 "큐브-페이스"유형이있는 경우 입력에 적합합니다. 그렇지 않으면 넷의 2D 배열, 큐브, 각 얼굴에 대해 1 3 x 3 목록을 사용할 수 있습니다. 합리적입니다. 특정 형식이 수용 가능한 의견인지 또는 채팅에서 핑인지 알고 싶다면 그 유효성을 진술하기 위해 도전에 추가 할 것입니다.

입력 형식은 최대 9 개의 가능한 색상 만 지원하면됩니다.

출력의 경우 이는 결정 문제점이므로 "예, 이것은 유효한 Rubik 큐브입니다"에 대해 하나의 상수 값을, "아니요, 이것은 유효한 Rubiks 큐브가 아닙니다"에 대해 다른 하나의 상수 값을 출력해야합니다.


이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

테스트 사례

테스트 사례는 다음과 같습니다. 각 정사각형을 단일 문자로 사용하여 정육면체의 그물로 형식화됩니다. 다른 글자는 다른 색을 나타냅니다. 요청시 더 이상 테스트 케이스를 추가 할 수 있습니다.

풀 수 있는

   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 개 밖에없는 루빅스 큐브를 가지고 있습니다.
Adám

2
@ H.PWiz 아니오, 당신은 할 수 없습니다. 그것은 내 정의에 암시 적이지만 질문에서 명시 적으로 만들 것입니다.
밀 마법사

2
귀하의 사양에는 큐브의 세 가지 패리티 법에 대한 완전한 설명이 포함되어 있지 않습니다. 1. 1 개의 모서리 만 180도 뒤집을 수는 없습니다 (언급 됨). 2 개의 모서리 만 120도 (비 기호)를 꼬는 것은 불가능합니다. ). 이 문제가 해결 될 때까지 가까운 투표를합니다. 설명 은 ryanheise.com/cube/cube_laws.html 을 참조하십시오 .
Level River St

4
@LevelRiverSt Rubik의 큐브는 독립적이며 누구나 수학 공식과 패리티 법칙을 독립적으로 도출 할 수 있습니다.
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에 의해 명시 적으로 허용되었습니다.

설명

이 프로그램은 Devil 's Algorithm 을 사용하여 해결 된 큐브와 동일한 그룹에서 큐브의 가능한 모든 상태를 반복 하는 접근 방식을 취합니다 . 큐브를 해결할 수 있으면 알고리즘이 완료되기 전에 어느 시점에서 해결됩니다 ( 사용한 알고리즘 이 올바르게 작동 한다고 가정 ).

(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 천 2 백 2 십만 이동, 이것이 내 Cloud9 IDE 가 얻는 것입니다).

또한 세 번의 sextillion 이동을 수행하려면 많은 메모리 가 필요 합니다. 입방체는 초당 약 4 백만 번의 이동을 수행 할 수 있지만 오버 커밋 된 메모리 로 인해 프로세스가 종료 될 가능성이 높습니다 . 512MB의 메모리로 VM에서 15 초 후에 죽습니다. 이미 할당 된 플랫 어레이 비용 메모리에서 이동을 수행해야하는 이유는 무엇입니까? 발견 된 메모리 누출 (또는 스무)와 그것을 고정 .

다음 은 동일한 방식으로 작동하는 훨씬 더 읽기 쉬운 버전입니다.

그러나 나는 그것이 효과가 있다는 것을 정말로보고 싶다!

이 악마의 알고리즘에서 실행되는 첫 번째 실제 이동은입니다 F2. 따라서 해결해야 할 가장 빠른 큐브는 다음과 F2같이 뒤섞입니다 .

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

이것은 실제로 TIO 에서 0.007 초 안에 실행됩니다 .

이것을 어떻게 개선 할 수 있습니까?

확실히 더 많은 악마의 알고리즘이 있습니다. 이 동작이 30 분도 안되는 것을 찾았습니다. 그러나 이는 수천 바이트 (약 100MB 이상)와 복잡한 해밀턴 회로를 큐빅 코드로 변환하는 데 수십 시간이 소요됩니다.

일부 기능을 제거하고 하단의 루프에 똑바로 놓을 수도 있습니다. 그러나 나는 약간의 가독성을 위해 약간의 바이트를 희생 할 것입니다.

또한 Cubically의 루핑 동작을 수정하여 알고리즘을 7 또는 8 회 더 반복 할 수 있도록 (소스에서 7 또는 8 번 반복 된 함수 호출로 알고리즘을 하드 코딩하는 대신) 더 고려하고 있습니다. 또는 메모장으로 마술을 만들고 더 많은 루프를 사용하여 골프를 칠 것입니다.

인터프리터에서 가능한 모든 것을 계속 최적화 할 것이므로 향후 평균 PC에서 작동 할 수 있습니다!


큐빅으로 2 바이트

r▦

위의 답변이 더 좋아서 이것을 대체 솔루션으로 추가하고 있습니다. 이것은 몇 백만 년과 달리 1 초 안에 시작됩니다.

r    read cube from standard in
 ▦   and solve it

큐브를 해결할 수있는 경우 출력 : (없음)
큐브를 해결할 수없는 경우 출력 : Error: The cube has reached an unsolvable state.


우리가 측면을 바꾸면 이것이 효과가 있습니까? 예를 들어 큐브 덤프에서 2가 4와 반대입니다. 2가 5와 4가 0과 반대이면 작동합니까?
밀 마법사

1
@WheatWizard 예, solvemode는 각면에 고유 한 정수가 있는지 확인하고 해당 정수가면에서 유일한 정수인지 확인합니다.
MD XF

그래도 괜찮아. 나는 이것이 당신의 묘사인지 아닌지 알기 위해 입방 적으로 익숙하지 않았습니다.
밀 마법사

@WheatWizard 내가 당신을 올바르게 이해하고 있는지 확인하십시오- 이것은 당신이 말한 것의 라인입니다. 맞습니까?
MD XF

예. 그리고 해결할 수 있어야합니다.
밀 마법사

4

APL (Dyalog 기본) , 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 : 위 아래)입니다. 해결할 수있는 Rubik의 큐브에 대해서는 1을, 그렇지 않으면 0을 리턴합니다.

t문자 수에 포함되지 않은 TIO 링크에서 function 은 9 줄의 입력을 읽고 기본 입력 형식 (순)에서 필요한 3x2 x 3x3 행렬로 변환 한 다음 솔루션을 호출하고 결과가 나타나면 OK를 인쇄합니다 예상대로입니다.

이 알고리즘은 주어진 큐브를 26 개의 큐비 (길이 3 (코너), 2 (가장자리) 및 1 (센터))로 나눕니다. 또한 동일한 6 개의 중앙 큐비로 해결 된 큐브의 26 개 큐브를 생성합니다. 다음 기준을 모두 충족해야합니다.

  • 6 개의 센터에는 중복이 없습니다

  • 예를 들어 고려 - 주어진 / 해결 cubies의 세트는 최대 회전, 일치 'WBR''BRW'같은 cubie 있지만'BWR'

  • 모퉁이 순열과 모서리 순열의 패리티는

  • 코너 회전 인덱스들의 모듈로 합 (3) (예, "최소"문자를 가지고 B우리가 기준점으로서 : 'BRW'→0, 'WBR'→1, 'RWB'→2)이 주어지고 해결 큐브 간의 매치; 모서리 모듈로 2에 대해 동일

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.