번호가 매겨진 큐브에면 출력


19

원하는 방식으로 큐브의 정점에 0에서 7까지의 숫자를 지정하십시오. 정점마다 정확히 하나의 숫자를 할당해야합니다.

예를 들어 정점은 다음과 같이 할당 될 수 있습니다.

  3-----1
 /|    /|
4-----2 |
| |   | |
| 5---|-0
|/    |/
6-----7

0에서 5까지의 정수를 사용하는 프로그램을 작성하십시오.이 6 개의 숫자 각각은 원하는 방식으로 큐브의 한면과 정확히 연관됩니다. 이 숫자 중 하나가 입력되면 연관된면의 4 개의 정점 숫자가 2x2 자릿수의 표준 출력으로 인쇄되어야합니다. 면은 입방체 바깥 쪽에서 똑바로 쳐야합니다. 4 개의면 회전이 모두 유효합니다.

예를 들어, 0이 위 예제 큐브의 앞면과 연관된 경우 입력에 대한 올바른 출력이됩니다 0.

42
67

면은 90 ° 회전에서 볼 수 있으므로 다음과 같은 경우에도 유효합니다.

27
46
76
24
64
72

이 출력 (및 그 회전)은 얼굴의 잘못된면에서 볼 때 유효하지 않습니다 .

24
76

같은 생각이 다른 모든 얼굴에도 적용됩니다. (1)이 배면과 연결된 경우, 예를 들면, 다음 입력 1힘 생산 출력 13[newline]05(및 31[newline]50잘못된 것이다).

따라서 실제 과제는 입력을 4 개의 정점 숫자로 변환하는 것이 쉽고 짧도록 정점 수와 회전을 선택하는 것입니다.

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker는 이전 게시물입니다. ( 핸디 바이트 카운터 )

노트

  • 프로그램 대신 함수를 작성할 수 있습니다. 0에서 5 사이의 정수를 가져와 2 × 2 자리 그리드 문자열을 인쇄하거나 반환해야합니다.
  • stdin, 명령 행 또는 함수 인수에서 입력을 가져옵니다. 입력이 유효하다고 가정 할 수 있습니다.
  • 출력에는 선택적으로 후행 줄 바꿈이있을 수 있습니다.
  • 선택한 정점과면 번호를 알려주십시오.

답변:


17

CJam, 23 16 바이트

이 문제에 대한 우아한 수학적 해결책이있을 것입니다. 그러나 나는 그것을 찾는 방법에 대한 단서가 없으므로 슈퍼 압축 하드 코딩입니다!

찾았어요! 비트 연산을 사용하기 때문에 고전적으로 우아한 수학 솔루션은 아니지만 완전히 공식적입니다.

li_o1^_p_6|o3+6%

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

큐브 레이아웃

  4-----7          4-----7          3-----2
 /|    /|         /  0  /|         /  3  /|
1-----0 |        1-----0 |        6-----5 |
| |   | |        |     |2|        |     |4|
| 5---|-2        |  1  | 2        |  5  | 7
|/    |/         |     |/         |     |/ 
6-----3          6-----3          1-----4  

설명

내 오래된 대답은 이미 큐브를 배치하여 각 얼굴을 첫 번째 (왼쪽 상단) 정점 번호로 얼굴 번호와 동일하게 설명 할 수 있습니다. 그러나 나는 얼굴 번호를 사용하여 더 많은 정점 수를 계산할 수 있기를 원했습니다. 어느 시점에서, 나는 발을 문에 넣은 아이디어를 생각해 냈고, 두 번째 (왼쪽 상단) 정점 번호를 얼굴 번호 XOR 1로 계산했습니다. 위에 표시된 레이아웃과 아래 수식을 사용 하면 얼굴의 모든 정점 수를 n간결하게 계산할 수 있습니다 .

  • 왼쪽 상단 : n
  • 오른쪽 상단: n^1
  • 왼쪽 아래 : (n^1)|6
  • 오른쪽 아래 : ((n^1)+3)%6

참고로 여기에 원하는 레이아웃으로 각면의 출력을 재현합니다.

Face:      0     1     2     3     4     5

Vertices:  01    10    23    32    45    54
           74    63    70    65    72    61

따라서 정점마다 약간 다른 인쇄 논리가 있지만 전체 프로그램은 입력면 번호를 읽고 순서대로 값을 생성합니다. 첫 번째 이후의 모든 정점이 기준으로 시작하기 때문에 n^1논리를 한 번만 계산하면됩니다.


후손을 위해, 그리고 여전히 좋은 접근 방식이라고 생각하기 때문에 여기에 오래된 대답이 있습니다.

CJam, 23 바이트

이 문제에 대한 우아한 수학적 해결책이있을 것입니다. 그러나 나는 그것을 찾는 방법에 대한 단서가 없으므로 슈퍼 압축 하드 코딩입니다!

"pÜ×ñè¨"487b8b3/ri_o=~p

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

큐브 레이아웃

  0-----7          0-----7          3-----6
 /|    /|         /  0  /|         /  3  /|
1-----2 |        1-----2 |        4-----5 |
| |   | |        |     |2|        |     |5|
| 5---|-6        |  1  | 6        |  4  | 7
|/    |/         |     |/         |     |/ 
4-----3          4-----3          1-----0  

설명

기본 접근 방식은 가능한 한 적은 공간에서 각면의 정점을 하드 코딩하는 것입니다. 옵티마이 저의 기본 변환 솔루션과 마찬가지로 정점 목록을 ASCII 문자 데이터로 압축 된 8 진수로 처리합니다. 그러나 이것이 더 많은 최적화를 위해 유사점이 끝나는 곳입니다!

다음은 "순진한"솔루션에 대한 세 가지 주요 최적화입니다.

  • 각면을 첫 번째 정점 번호로 해당면 번호로 설명 할 수 있도록 큐브를 배치하십시오. 위에서 제시 한 큐브 레이아웃을 보면 각면의 왼쪽 상단 정점 수가면 번호와 같다는 것을 알 수 있습니다. 이를 통해 입력을 다시 인쇄 해야하는 비용으로 6 개의 적은 정점을 인코딩 할 수 있으므로 바이트를 절약 할 수 있습니다.
  • 정점 데이터를 각 "문자"가 최대 256보다 큰 문자열로 묶습니다.이 최대 값이 256보다 커질수록 문자열의 길이는 느리게 줄어들지 만 "문자"중 하나가 256을 초과 할 가능성이 높아집니다. 따라서 더 이상 1 바이트 ASCII 문자 세트의 일부가 아닙니다. 그래서 나는 256에서 1000까지 모든베이스에서 정점 데이터를 인코딩하는 프로그램을 작성했는데, 이것은베이스 256에 비해 1 바이트의 문자 데이터를 저장하는 약 10 개의베이스를 찾았습니다. 487을 선택했습니다. 결과 문자열은 전적으로 인쇄 가능한 ASCII로 구성됩니다.
  • 첫 번째 최적화와 혼합하여 비대칭으로 출력을 생성합니다. CJam의 일반적인 접근 방식은 정점 데이터를 2 요소 목록의 2 요소 목록으로 형식화하고 중간에 개행을 삽입 한 후 출력을 내재적으로 인쇄하는 것입니다. 그러나 대신 개행을 추가하지 않는 연산자로 첫 번째 정점 (입력면 번호와 동일)을 인쇄하고 다른 정점의 3 요소 목록을 검색하고 다음 정점을 잡고 추가하는 연산자로 인쇄하십시오 줄 바꿈을 사용하고 다른 두 정점을 암시 적으로 인쇄합니다. 바이트가 절약됩니다.

2
나는 우아한 수학적 접근 방식으로 순열을 시도했으며 최적화하지 않은 하드 코딩보다 더 장황합니다.
Peter Taylor

최근 답변이 훌륭합니다. 나는 완전히 다른 접근법이며 또 다른 찬성에 합당하기 때문에 별도의 답변으로 게시해야한다고 생각합니다. 기본적으로 내 C 답변과 동일한 큐브가 있지만 처음 세 개의 짝수 코너가 한 곳으로 이동했습니다. 나는 내가 놓쳤다는 것을 믿을 수 없다 6+n%2 --> 6|n(나는 이미 그것을 내 루비 답변에 통합했다.) n --> n^1얼굴에 변환 을 수행하면 수식을 단순화 할 수 있지만, 버리고 n계속 진행 하면 수식이 단순화 될 n^1것입니다. 점수에 도움이되지 않습니다.
Level River St

@steveverrill 감사합니다! 나는 이것을 완전히 새로운 답변으로 게시 해야하는지 채팅에서 물었지만 합의가 없었기 때문에 합의가 없었습니다. 큐브 주위에 nn^1쌍 을주의 깊게 주문하면 다른 정점을 계산할 수 있다는 것을 깨달았을 때 나는 정말 기뻤습니다 |6. 그리고 나는 그 n --> n^1변형을 보지 못했습니다 . 그러나 당신은 그것이 실제로 내 점수에 영향을 미치지 않을 것이라고 올바르게 추측 했으므로 아마 그대로 그대로 두겠습니다.
Runer112

계속해서 XOR 아이디어를 Ruby 답변에 통합했습니다. 10을 절약 할 수 있습니다 (에 대한 2 외에도 6+n%2 --> 6|n) 나는 당신이 신경 쓰지 않기를 바랍니다. 나는 n --> n^1얼굴에 변형을 사용 했기 때문에 최신 개정판은 당신과 동일한 출력을 제공하지만 다른 입력을 제공합니다. BTW, 비트 작업이 우아하지 않다고 생각합니다. 모두 사용 방법에 달려 있습니다!
Level River St

1
GolfScript에서 1 자 짧음 :~.1^..n@6|@3+6%
Peter Taylor

14

C, 69

f(c){int d=c++%2*2-1;printf("%d%d\n%d%d",(c-d)%6,c%6,c%2+6,(c+d)%6);}

테스트 프로그램에서 언 골프

f(c){
 int d=c++%2*2-1;
 printf("%d%d\n%d%d",(c-d)%6,c%6,c%2+6,(c+d)%6);
}

int n;
main(){
  scanf("%d",&n);
  f(n);
}

설명

펼친 큐브 번호는 다음과 같습니다.

0---7
|   |
| 0 |
|   |
1---2---7 
|   |   |
| 1 | 2 |
|   |   |
6---3---4---7
    |   |   |
    | 3 | 4 |
    |   |   |
    6---5---0
        |   |
        | 5 |
        |   |
        6---1

왼쪽 상단 모서리는면과 번호가 같습니다.

오른쪽 하단에 숫자가 있습니다 (n+2)%6

홀수 n오른쪽 상단 모서리 (n+1)%6와 왼쪽 하단이6

도 들어 n오른쪽 상단 코너 7와 왼쪽 아래입니다(n+1)%6

프로그램은 그림과 같이 홀수를 표시하고 짝수는 180도 회전합니다. 즉, 오른쪽 상단이 항상 (n+1)%6있고 왼쪽 하단이 항상 (n+1)%2+6입니다. 반전 nn+2더 쉬움 ( 추가 및 빼기 또는 필요에 따라 설정 c=n+1및 사용하여 수행 )d1-1

산출

$ ./a
0
21
70

$ ./a
1
12
63

$ ./a
2
43
72

$ ./a
3
34
65

$ ./a
4
05
74

$ ./a
5
50
61

5
+1 이것은 제가 상상했던 우아한 수학 솔루션입니다. 불행히도, 그것은 C에서 구현됩니다 ...
Runer112

1
@ Runer112 감사합니다. 불행히도 C는 내가 가장 잘 알고있는 언어입니다. 저는 루비를 배우고 있지만 아직 초보자입니다. 루비는이 점수를 부술 수는 있지만 아마도 Cjam과 경쟁하지는 않을 것입니다. 어쩌면 나중에 루비에 게시 할 예정입니다, 또는 내 C의 대답에 약간의 개선을 찾을 수 있습니다 (변경하여 예를 c%6c%=6하고 먼저 때문에, 어떤 계수 계산을 제거 할 수 있어야 얼굴을 회전.) IS 실험하는 또 다른 일을 얼굴 라벨링을 한 곳씩 이동하므로 n-1,n,n+1대신에 얻을 수 n,n+1,n+2있습니다.
Level River St

@ steveverrill은 이미 n전역 적으로 선언 하고 있으므로 더 높게 선언하여 몇 바이트를 절약하고 서명을 f()? 아니면 f여기서 만 기능을 보고 있습니까?
dwcanillas

@dwcanillas "You may write a function instead of a program"이므로 함수 만 계산합니다. 어쨌든 이것은 내가 가장 친숙한 언어로 된 개념 증명 일뿐입니다. 처음부터 이미 이보다 훨씬 짧은 Ruby 답변을 줄이는 데 더 관심이 있습니다.
Level River St

8

요소, 18

_4:2%6+``2+6%`-5+`

많은 고급 골프 언어와 달리 Element에는 압축 연산자가 없으므로 솔루션의 간결성은 사용되는 정확한 번호 매기기 체계와 밀접한 관련이 있습니다. 몇 가지 실험 후, 간단한 산술 연산만으로 정점을 계산할 수있는 새로운 번호 체계를 만들었습니다.

  1-----0          1-----0          2-----5
 /|    /|         /  4  /|         /  3  /|
4-----6 |        4-----6 |        3-----7 |
| |   | |        |     |0|        |     |5|
| 7---|-5        |  2  | 5        |  1  | 0
|/    |/         |     |/         |     |/ 
3-----2          3-----2          4-----1  

왼쪽 상단 모서리는 짝수이면 6이고 홀수이면 7입니다. 오른쪽 상단은 얼굴 번호 자체입니다. 왼쪽 하단은면 번호에 2, mod 6을 더한 값입니다. 오른쪽 하단은 5에서면 번호를 뺀 값입니다.

다음은 코드에 대한 설명입니다.

_4:2%6+``2+6%`-5+`
_4:                    take input and make several copies of it
   2%6+`               take face #, mod 2, add 6, and output
        `              output input, which already has the newline attached
         2+6%`         take face #, add 2, mod 6, and output
              -5+`     negate face #, add 5, and output

각면의 출력은 다음과 같습니다.

0
60
25

1
71
34

2
62
43

3
73
52

4
64
01

5
75
10

+1 : 코드를 해독 할 수 없지만 골프 언어로이 점수가 어떻게 나오는지 확인하는 것이 좋습니다. 당신은 현재 2 개의 CJam 답변 : Peter Taylor와 Runer 112 뒤에 공동 3 위에있는 것 같습니다.
Level River St

이제는 2 위를 차지했지만 CJam을 때리는 것으로 예상하지는 않습니다.
PhiNotPi

6

옥타브 108 100 68 50 바이트

물론 저의 접근 방식은 이전의 접근 방식 인 일반 하드 코딩보다 더 우아하게 수행하는 방법입니다. Octave가 Matlab =보다 codegolf에 더 적합한 방법에 놀랐습니다.

f=@(n)['040201375767';'261345154623'](:,2*n+(1:2))

나열한 것:

(죄송합니다. 이것을 추가하는 것을 잊었습니다.)

큐브 레이아웃

  1-----5          1-----5          6-----7
 /|    /|         /  2  /|         /  5  /|
0-----4 |        0-----4 |        2-----3 |
| |   | |        |     |4|        |     |3|
| 3---|-7        |  0  | 7        |  1  | 5
|/    |/         |     |/         |     |/ 
2-----6          2-----6          0-----1  

이전 버전 :

f=@(n)[0 4 0 2 0 1 3 7 5 7 6 7;2 6 1 3 4 5 1 5 4 6 2 3](:,2*n+(1:2))

더 오래된 버전 :

이것은 실제로 2x2x2 배열을 만들고 '슬라이스'를 선택합니다. 우리는 3D 행렬 순열을 수행하고 매번 상단 또는 하단 슬라이스를 선택할 수 있습니다. (이것은 행렬이 아닌 표현식의 색인으로 인해 matlab에서 작동하지 않습니다) 더 짧은 방법을 수행하는 더 직접적인 방법이있을 것이라고 확신합니다.

f=@(n)squeeze(permute(reshape(0:7,2,2,2),circshift((1:3)',n))(n=fix(n/3)+1,circshift((1:2)',n-1),:))

f=@(n)squeeze(permute(reshape(0:7,2,2,2),circshift((1:3)',n))(floor(n/3)+1,circshift((1:2)',floor(n/3)),:))

5

CJam, 31 28 (또는 26) 바이트

8,2/W%_1m<]z[D75K46]2/+ri=N*

이것은 또한 26 바이트 버전 으로 기본 변환을 사용하여 압축 될 수 있습니다 .

큐브가 다음과 같다고 가정합니다.

  7-----1
 /|    /|
5-----3 |
| |   | |
| 6---|-0
|/    |/
4-----2

같은 얼굴로

  7-----1      .-----.      .-----.      .-----.
 /  4  /|     /  4  /|     /  4  /|     /  0  /|
5-----3 |    .-----. |    .-----. |    .-----. |
|     |2|    |     |1|    |     |0|    |     |5|
|  1  | 0    |  0  | .    |  3  | .    |  3  | .
|     |/     |     |/     |     |/     |     |/ 
4-----2      .-----.      .-----.      .-----.    

여기에서 온라인으로 사용해보십시오


4

CJam (25 바이트)

"ñRXµ  roM~"(ib65b2/q~=N*

여기에는 인쇄 할 수없는 문자와 탭 (StackExchange 소프트웨어에서 엉망이 됨)이 xxd 형식으로 포함됩니다.

0000000: 22f1 5258 1fb5 0972 6f4d 7e22 2869 6236  ".RX...roM~"(ib6
0000010: 3562 322f 717e 3d4e 2a                   5b2/q~=N*

온라인 데모

입방체:

  1-----0        Faces:
 /|    /|        10 46
4-----6 |        14 37
| |   | |        20 31
| 3---|-2        23 57
|/    |/         56 20
7-----5          57 64

이것은 기본 압축성을 최대화하기 위해 큐브 정점을 선택한 순수한 하드 코딩입니다. 2 자리 숫자로 디코딩하므로 0으로 시작할 수 없습니다. 7로 시작하는 것도 원하지 않습니다. 두 번째 밑이 너무 높아지기 때문입니다. 따라서 0과 7은 긴 대각선에 있어야합니다. 인코딩하는 값을 줄이기 위해 10 개의 가장자리를 먼저 원합니다. 그 외에는 바이트 수를 변경하지 않고도 상당한 유연성이 있습니다.

마법의 문자열에서 첫 번째 문자를 팝 한 것이 약간 실망 스럽습니다.베이스 변환의 기본으로 사용하기 전에 int로 캐스팅해야합니다. 앞으로의 CJam 버전이 바이트를 절약 할 수 있기를 바랍니다.


4

자바 스크립트 (ES6), 53 62

편집 저장 8 템플릿 문자열 들으 @NinjaBearMonkey를 사용하여 바이트. 따옴표 안의 줄 바꿈은 중요하며 축소 할 수 없습니다.

Javascript로는 영리 할 수 ​​없으며 너무 장황합니다.

f=n=>`01
23
45
67
01
31
5702
64`.substr(n-4?n*3:20,5)

산출 for(i=0;i<6;i++)console.log(f(i),i)

01
23
0

23
45
1

45
67
2

67
01
3

02
64
4

31
57
5

숫자 협회 (veify하는 스 니펫을 참조 재미)


1
ES6 템플릿 문자열 을 사용하는 경우에는 대신에 줄 바꿈 문자를 사용할 수 있으므로 \n8 바이트가 절약됩니다.
NinjaBearMonkey

템플릿 문자열에는 따옴표 대신`표시를 사용해야합니다.
NinjaBearMonkey

맞습니다. 그것이 실제로 테스트 한 방법입니다.
edc65

4

루비 개정 1, 40 36

->(c){print(c^1,c,"\n",6|c,(c+3)%6)}

4 바이트를 절약하기 위해 람다를 사용하도록 제안하는 @rcrmn에게 감사드립니다. 나는 그것을 익명으로 두는 것에 대해 확신하지 못했지만 여기서 메타에 대해 논의 된 것으로 보이며 이것이 정상이라고 결정했습니다.

여기에 내 Rev 0 Ruby 답변과 비교하기 위해 40 바이트 함수가 있습니다 (원본 C 답변은 별도의 게시물에 있습니다).

def f(c)print(c^1,c,"\n",6|c,(c+3)%6)end

Runer112의 추가 영감 : 최신 (16 바이트!) 답변에 사용 된 번호 체계를 수정 한 결과입니다. PhiNotPi의 체계의 직접적인 포트는 같은 점수를 줄 것입니다.

Rev 0에서 번호 매기기를 한 단계 씩 이동하고 모든 XOR 1을 취하면 다음 큐브를 얻습니다.

4---7
|   |
| 1 |
|   |
1---0---7
|   |   |
| 0 | 3 |
|   |   |
6---3---2---7
    |   |   |
    | 2 | 5 |
    |   |   |
    6---5---4
        |   |
        | 4 |
        |   |
        6---1

산출

0
10
63

1
01
74

2
32
65

3
23
70

4
54
61

5
45
72

루비 레브 0, 56 52 50

()%6에서 불필요한 부분 을 제거 c-d하고 다른 2 (runer112에서 영감을 받음)를 제거하여 4 바이트를 절약했습니다 6+c%2 --> 6|c.

점수는 첫 번째 행인 함수에 대한 것입니다. 나는 Ruby를 처음 접했고 사용자 입력 번호를 n으로 가져 오는 12 자 (11 + 개행)보다 짧은 방법을 찾을 수 없다는 것에 놀랐습니다. 결과적으로 프로그램 대신 함수를 수행하면 1 바이트가 절약됩니다.

def f(c)d=c%2*2-1;print((c+d)%6,c,"\n",c|6,c-d)end

n=gets.to_i
f(n)

이것은 내 C 답변의 포트입니다. C에서 %연산자는 음수의 음수 값을 반환합니다. 루비에서는 항상 양수 값을 반환하므로에 1을 추가 할 필요가 없습니다 c. 결과적으로 다음과 같이면의 번호를 1 씩 변경하는 것이 유리합니다.

0---7
|   |
| 1 |
|   |
1---2---7 
|   |   |
| 2 | 3 |
|   |   |
6---3---4---7
    |   |   |
    | 4 | 5 |
    |   |   |
    6---5---0
        |   |
        | 0 |
        |   |
        6---1

새로운 얼굴 번호 매기기를 사용하면 위와 같이 짝수를 인쇄하고 확률은 180도 회전합니다.

1
21
70

2
12
63

3
43
72

4
34
65

5
05
74

0
50
61

람다를 사용하여 함수를 단축 할 수 있다고 생각합니다. ->(x){...code...}이는 함수 정의를 4 자 더 짧게 만듭니다. 그런 다음 그것을 사용하는 변수에 할당해야하고, #call로 전화
rorlork

@rcrmn 감사합니다. 맞습니다. f=->(c){print(c^1,c,"\n",6|c,(c+3)%6)}실행하고 2 자 더 짧습니다 (을 생략하면 4 자 더 짧습니다 f=). 공정이 생략되어야하는지 확실 f=하지 않지만 질문에 기능이 익명 일 수 없다고 말하는 것은 아닙니다. 내가 이상하게 생각하는 것은이 구문이 초보자에게 보여지는 구문과 완전히 다르다는 것입니다.이 구문은 중괄호 안에 전달 된 매개 변수가 있습니다.f=lambda{|c|print(c^1,c,"\n",6|c,(c+3)%6)}
Level River St

이것이 람다 리터럴입니다. 그리고 나는 항상 구문을 기억할 필요가있을 때 참조를 찾기가 어렵다는 것을 알게된다…
rorlork

3

피스, 30

2 바이트 주셔서 감사합니다.

Jc2jkfx>Q2!.&T^2%Q3U8jb?_J%Q2J

여기에서 시도하십시오.

pyth 전문가의 골프 조언은 은혜롭게 받아 들여질 것입니다. 특히 출력 섹션이 약간 개선 될 수 있다고 생각합니다.

다음 파이썬의 포트 : ...

파이썬, 109

Q=input()
s=''.join(map(str,filter(lambda v:(Q<3)^(v&(1<<Q%3)>0),range(8))))
print s[1-Q%2::2],'\n',s[Q%2::2]

...의 포트입니다

퓨어 배쉬, 130

설명의 목적으로 :

for v in {0..7};{
if(($1/3));then((v&(1<<$1%3)))&&a+=$v
else((v&(1<<$1%3)))||a+=$v
fi
}
i=$[$1%2*2]
echo "${a:i:2+i}
${a:2-i:4-i}"

큐브 정점은 다음과 같이 번호가 매겨집니다.

  4-----5
 /|    /|
0-----1 |
| |   | |
| 6---|-7
|/    |/
2-----3

그리고 얼굴은 다음과 같이 번호가 매겨집니다.

Face  Vertices  Swap
   0  0,2,4,6
   1  0,1,4,5   x
   2  0,1,2,3
   3  1,3,5,7   x
   4  2,3,6,7
   5  4,5,6,7   x

Swap열은 꼭지점의 순서는 출력 절환되어야 나타낸다.

알고리즘은 모든 정점 {0..7}로 시작합니다. 꼭짓점은 꼭짓점 번호에 설정된 비트에 따라 제거됩니다.

  • 면 0, 1 및 2의 경우 비트 1, 2 또는 3이 각각 지워진 정점이 유지됩니다.
  • 면 3, 4 및 5의 경우 각각 비트 1, 2 또는 3이 설정된 정점이 유지됩니다.

"kept"버텍스가 문자열에 추가됩니다. 스왑 플래그 (face number mod 2)의 설정 여부에 따라 문자열은 출력 문자 0,1, 2,3 또는 그 반대로 출력됩니다.


1

J-26 바이트

얼굴 번호를 인수로 받아서 자릿수를 반환하는 함수.

0{.@":"0@{0&(|:|.)&(i.3#2)

우리는 다음 큐브를 사용하고 있습니다 :

  4-----5    Face numbers:
 /|    /|     0 - front
0-----1 |     1 - top
| |   | |     2 - left
| 6---|-7     3 - back
|/    |/      4 - bottom
2-----3       5 - right

예 ( tryj.tk 에서 직접 시도하십시오 ) :

   0{.@":"0@{0&(|:|.)&(i.3#2) 3         NB. inline
76
54
   f =: 0{.@":"0@{0&(|:|.)&(i.3#2)      NB. named
   f each 0 1 2 3 4 5                   NB. all results
+--+--+--+--+--+--+
|01|40|64|76|37|13|
|23|51|20|54|26|57|
+--+--+--+--+--+--+

빵과 버터는 0&(|:|.)입니다. 이것은 반복적으로 적용될 때 모든 얼굴을 방문하는 방식으로 큐브를 뒤집고 회전시키는 동사입니다. 이것은 입력 인수를 사용하는 것입니다. 큐브의 꼭짓점은에 의해 생성 i.3#2되므로 시작점으로 사용 0...{하고 완료되면 앞면을 가져옵니다 .

숫자를 문자열로 인쇄하려면 8 문자가 필요합니다. {.@":"0@단순히 배열을 반환하도록 허용되면 전체 문자 8자를 절약 할 수 있습니다. [주먹을 흔드는 것과 불가분의 그립을 시작한다]


1, 4, 5에 대한 결과가 반대로 나타납니다
Digital Trauma

0

> <> (물고기) , 38 바이트

'/ =/2= 28"H5'a@i-!
noan~\;
~>:?!^1-@~

모든 출력은 2 자리 2 행으로 저장됩니다. 행은 문자열에 문자 코드로 저장됩니다 '/ =/2= 28"H'( 문자열 10뒤에 추가 된 행 은 제외).a ). 첫 번째 문자 ( / = 47)는 두 번째 상호 작용에서 프로그램 흐름을 리디렉션하는 데 사용됩니다.

상단 2*(53-n) 요소는 버리고 (여기서 n은 입력 번호의 문자 코드 임) 다음 두 코드 사이에 줄 바꿈이 인쇄됩니다.

나열한 것:

  3-----2
 /|    /|
4-----7 |
| |   | |
| 5---|-0
|/    |/
6-----1      0 1 2 3 4 5 sides are top front bottom back left right respectively.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.