quintillion 순열 43 개


16

다음과 같이 Rubik 's Cube 를 그물로 표현할 수 있습니다 (해결시).

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

각 문자는 해당 색상을 나타냅니다 ( W흰색, G녹색 등).

보였다 정확히 있다는 것을 43,252,003,274,489,856,000 (~ 43 루빅스 큐브가 될 수 quintillion) 다른 순열.

당신의 임무는 에서 사이의 정수를 취하여 위에 표시된 방식으로 해당 순열을 출력하는 것입니다. 순열의 순서를 선택할 수 있지만 사용하는 알고리즘은 가능한 각 입력에 대해 고유하고 올바른 순열을 생성하도록 표시되어야합니다.143,252,003,274,489,856,000

잘못된 순열 규칙

페이지 에서 가져온

시작하려면 각 3x3면의 중심이 동일하게 유지되어야합니다. 루빅스 큐브의 중심 사각형은 회전 할 수 없기 때문입니다. 얼굴 전체가 보이는 위치를 변경하여 전체 큐브를 회전 할 수 있지만 큐브의 그물에는 영향을 미치지 않습니다.

각 순열에 해당 순열에 도달하기위한 스왑 수의 패리티를 기준으로 패리티가 있다고 가정하면

  • 각 모서리 부분에는 세 가지 방향이 있습니다. 올바른 방향 (0), 시계 방향 (1) 또는 시계 반대 방향 (2) 일 수 있습니다. 코너 방향의 합은 항상 3으로 나눌 수 있습니다

  • Rubik 's Cube의 각 적법한 회전은 항상 짝수의 가장자리를 뒤집기 때문에 한 조각 만 잘못 될 수는 없습니다.

  • 모든 모서리와 모서리의 순열을 고려할 때 전체 패리티는 짝수 여야합니다. 즉, 각 법적 이동은 항상 짝수의 스왑 수와 동일합니다 (방향 무시).

예를 들어 다음 세 가지 net은 유효하지 않은 출력입니다.

   WWW
   WWW
   WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

(Too many whites/not enough reds)

   WRW
   WRW
   WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
   YYY
   GGY
   YYY

(There are two red/green center squares and no white/yellow center squares.
 In all valid permutations, the center squares are all different colours)

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
   YYY
   YYY
   YYB

(The yellow/orange/blue corner is rotated into an impossible permutation)

규칙

  • 원하는 방식으로 알고리즘이 유효하다는 것을 증명해야합니다. 알고리즘의 유효성을 입증하는 한 모든 순열을 열거 할 필요는 없습니다.
  • 143,252,003,274,489,856,000
    • 25312531
    • 27,946,105,037,114,827,095
  • 당신은 있어야 당신의 대답에 유효 증거의 일종을 포함한다. 이 증명은 모든 가능성을 열거하는 것을 제외하고는 모든 승인 된 증명 방법의 유효성을 증명할 수 있습니다.
  • 원하는 경우 다음과 같은 경우 대체 입력 방법을 사용하도록 선택할 수 있습니다.
    • 입력이 제한됩니다
    • 각 입력은 고유 한 출력에 해당
    • 입력 형식과 각 출력에 해당하는 형식을 명확하게 설명합니다.
  • 대신 33 ( !) ~ 126 ( ~) 사이에서 6 가지 ASCII 문자를 사용하는 데 사용되는 문자를 변경할 수 있습니다.WGRBOY
  • 유효한 큐브 네트, 단일 줄 문자열 또는 3D 렌더링을 포함하여 6 개의면을 모두 표시 할 수있는 큐브를 명확하게 표현하는 한 원하는 방식으로 원하는대로 출력 할 수 있습니다. 특정 형식에 대해 잘 모르면 주저하지 말고 의견을 말하십시오.

이것은 이므로 각 언어에서 가장 짧은 코드 (바이트)가 이깁니다.

유효한 출력 예

   YYY
   YYY
   YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   WWW
   WWW
   WWW

(The `W` and `Y` faces have been swapped)

   ZZZ
   +++
   +}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
   7bb
   [7Z
   [7Z

(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
 Then, the moves L, R, U and F' have been applied, in that order.
 Notice that each centre square is different, and corresponds to the same colour as in the mapping)

세 번째 잘못된 예에서는 모서리가 유효하지 않은 구성 일뿐 아니라 r / y / o 모서리는 r과 o가 서로 반대이므로 불가능한 모서리입니다.
fəˈnɛtɪk

세 번째 잘못된 예 (CC @ fəˈnɛtɪk) 수정
Jonathan Allan

두 번째 잘못된 예에서도 동일한 문제가 발생했지만 눈치 채지 못했습니다. 어쨌든 색상이 엉망이기 때문에 덜 중요합니다
fəˈnɛtɪk

(1,2,,4)18!2712!/24211

1
@Shaggy 예는 단 한 줄의 문자열은 괜찮
coinheringaahing 케어 드

답변:


13

, 334 297 바이트

Nθ≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θF⪪”B"↷:μêKO″KW#})”³«J⌕α§ι⁰I§ι¹§ι²»≔⁰ω≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δF²«Fδ«≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυFLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»≧÷Lκε»≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ≔θζ≔ηε

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Nθ

변수에 정수를 입력하십시오 q.

≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ

나누기 q의 나머지를 넣어, 3⁷에 의해 e. 그런 다음 e3 진법의 숫자로 간주 하여 3 진법의 숫자가 e3의 배수 가 되도록 숫자에 접미사를 붙 e입니다. 그러면 모퉁이의 회전을 정의 할 수 있습니다.

≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ

나누기 q의 나머지를 넣어! 8 z. (8!은 일시적으로 저장되어 d바이트를 저장합니다.) z코너의 위치를 ​​정의 할 수 있습니다.

≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θ

나누기 q의 나머지를 넣어, 2¹¹에 의해 h. 그런 다음 h밑수 2의 숫자로 간주 하여 자릿수에 밑수 2를 더하여 h숫자 2를 더합니다. 이렇게하면 h가장자리의 플립을 정의 할 수 있습니다 .

F⪪”B"↷:μêKO″KW#})”³

중심의 문자열 표현을 반복합니다.

«J⌕α§ι⁰I§ι¹§ι²»

각 중심의 위치로 이동하여 인쇄하십시오.

≔⁰ω

코너 위치의 패리티를 variable로 추적하십시오 w.

≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ

모서리 위치의 배열을 만듭니다.

≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δ

코너 색상의 배열을 만듭니다.

F²«

모서리를 위해 한 번, 모서리를 위해 한 번, 두 번 반복하십시오. 이하 "큐브"라고합니다.

Fδ«

큐브 색상 배열을 반복합니다.

≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυ

에서 다음 큐브 위치를 추출하여 z의 패리티를 업데이트하십시오 w. 이 패리티는 마지막이지만 한 모서리에 사용하십시오. 이를 통해 모서리와 모서리의 패리티 합계가 고르게됩니다.

FLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»

해당 위치에 큐브를 인쇄하고 다음 회전에 맞게 조정하거나 적절하게 뒤집습니다.

≧÷Lκε»

회전을 제거하거나에서 뒤집습니다 e.

≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ

가장자리 위치의 배열을 만듭니다. 루프를 통해 두 번째로 사용됩니다.

≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ

가장자리 색상의 배열을 만듭니다.

≔θζ≔ηε

코너 덮어 변수 ze대응하는 에지 변수 qh가장자리가 순열 루프의 두 번째 패스 동안에 대칭이되도록한다.


나에게 조언 : 숯으로 골프를 타는 것이 330 바이트라면 PHP로 시도하지 마십시오!
Night2

버그 수정 (잘못된 패리티 계산)으로 인해 @ Night2 슬프게도 334이되었습니다.
Neil

8

루비 , 570408 바이트

->g,h{z=[]
c=a="\x19)!$'%\x177\x1F495.)@7g~yp"
20.times{|i|z<<a[k=g%r=12+i/12*8-i];a[k]="";g/=r}
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18,2])
h+=h+("%b"%(h%2048)).sum%2
j=0
b="023451"
20.times{|i|b<<("%0*o"%[r=2+i/12,z[i].ord-20]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s["<QTWZo;MP[ngD@RS^k=GVUpaJ8XYdsAFE?CN7LK9IHl_`jh]reftbc"[i].ord-55]=b[i]}
s}

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

매직 스트링 대신 매직 넘버 배열이있는 오리지널 버전

->g,h{z=[]
a=[05,025,015,020,023,021,03,043,013,040,045,041,   032,025,054,043,0123,0152,0145,0134]
#PERMUTE
20.times{|i|r=12+i/12*8-i;z<<a.delete_at(g%r);g/=r}
c=1
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18],z[19])
#ROTATE
h+=h+(h%2048).to_s(2).sum%2
j=0
b="023451"
20.times{|i|r=2+i/12;b<<("%0*o"%[r,z[i]]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
#DISPLAY
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s[
[5,26,29,32,35,56,
4,22,25,36,55,48, 
13,9,27,28,39,52,
6,16,31,30,57,42,
19,1,33,34,45,60,
10,15,14,8,12,23,0,21,20,2,18,17,
53,40,41,51,49,38,59,46,47,61,43,44][i]]=b[i]}
s}

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

현재 형태의 익명 함수는 두 개의 정수를 입력받습니다. "대체 입력 방법을 선택할 수 있습니다." 첫 번째는 0에서 범위의 순열 12!*8!/2 - 1이고 두 번째는 0에서 범위의 조각의 방향입니다 2**11 * 3*7 - 1. 해결 된 상태의 출력은 다음 문자열입니다.

000
000
000
222333444555
222333444555
222333444555
111
111
111

추가 골프

출력 형식을 다음과 같은 모양으로 조정하여 저장해야 할 문자가 약 10 개 더 있습니다. 그러나 이것은 가독성을 떨어 뜨릴 것이므로 현재는하지 않을 것입니다.

      #########
      #########
      #########
#########
#########
#########

설명

순열

내부적으로 해결 된 상태는 배열의 일련의 8 진수로 표시됩니다 a. 입력은 g숫자로 나눈 12..1계수가 선택로부터 에지를 제거하기 위해 사용되는로 a와의 배치 z. 이 작업이 완료되면 모퉁이 만 남아 a있으므로 모퉁이를 제거 하고에 배치 하는 데 사용되는 계수로 g숫자 8..1로 나뉩니다 .az

마지막 두 모퉁이의 순서를 결정하기위한 정보가 충분하지 g않으므로 값이 도달 할 때마다 값이 0으로 나누어 져 항상 z원래 순서대로 추가됩니다 . 그런 다음 전체 순열이 짝수인지 홀수인지 확인하고 필요한 경우 마지막 두 모퉁이를 교체하여 순열을 균일하게 만듭니다.

정위

모서리 나 모서리가 해결 된 위치에 있지 않은 경우 올바른 방향인지 결정하는 다양한 방법이 있습니다. 이 경우이 도시 않음 위해, 모서리가 올바른 방향으로 간주 0또는 1상부 또는 하부면 상. 따라서 상단 또는 하단면을 회전해도 코너 방향이 변경되지 않습니다. 다른면을 회전해도 방향이 변경되지만 전체 패리티 합계는 변경되지 않습니다. 그들이 보여 주면 가장자리가 올바른 방향으로 고려 2또는 4앞 / 뒷면에 또는 3또는 5왼쪽 / 오른쪽. 즉, 상단 또는 하단을 1/4 회전하면 네 모서리가 반전되지만 다른면은 회전하면 플립 상태가 변경되지 않습니다.

입력에는 첫 번째 모서리와 마지막 모서리를 제외한 모든 정보가 명시 적으로 포함됩니다. 11 개의 최하위 비트 h%2048가 합산되고 모듈러스는 첫 번째 에지의 방향을 결정하는 데 사용됩니다. h이 값에 2를 곱하여 첫 번째 모서리의 방향 값을 최하위 비트로 추가합니다. 마지막 모서리의 방향은에서 다른 모서리의 방향을 점진적으로 빼서 구합니다 j. 마지막 코너 ( i/19= = 1)의 경우 값이 0 j%3에 추가되고 h마지막 코너의 방향이 결정됩니다.

문자열 b은면의 중심에 대한 텍스트로 미리 초기화됩니다. h로 나눈 2다음으로 1:12 3modulos이 부분의 방향을 결정하는데 사용되면서, 여덟 번. 각각의 경우 숫자 z는 적절한 자릿수 (2 또는 3)를 가진 문자열로 변환 된 다음 문자열이 복제됩니다. 이를 통해 모듈로에서 찾은 숫자의 올바른 회전을 색인화하여 문자열에서 추출 할 수 있습니다.b

디스플레이

마지막으로, 원시 스티커는 색인 테이블의 매직 번호를 사용하여 b보다 읽기 쉬운 형식으로 복사됩니다 s.

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