큐브에 개미


33

개미는 와이어 프레임 큐브의 가장자리 (면이 아닌)를 따라 걷습니다. 접하는 각 정점에는 두 개의 새로운 모서리가 분기되는 포크가 있습니다. 개미는 돌릴 방법을 선택합니다 – left또는 right. 이 방향은 정점을 향하고 큐브 외부에있는 개미를 기준으로합니다. 당신의 목표는 개미가 취한 순서 left/ right선택에서 시작한 위치에서 끝나는지를 결정하는 것입니다.

예를 들어, 개미가 네 번 좌회전 ( left left left left)하면 시계 반대 방향으로 사각형을 가로 지르고 시작했던 곳에서 끝납니다. 그러나이 경우 left left left left right큐브의 다른 지점에서 끝납니다. 또한가되면 left right right right left시작 가장자리에서 끝나지만 반대쪽 정점을 향하게되어 동일한 위치로 계산되지 않습니다.

개미의 경로는 시작한 가장자리를 포함하여 가장자리를 반복 할 수 있지만 중요한 것은 전체 시퀀스 후 끝이 끝나는 위치입니다.

개미의 턴 순서를 취하고 개미가 시퀀스 후 시작 위치로 돌아 왔는지 여부를 출력 하는 명명 된 함수 를 작성하십시오 . 명명되지 않은 함수를 변수에 할당하면 명명 된 함수로 만들 수 있습니다.

(편집 : 언어에서 명명 된 함수를 만들 수없는 경우 대신 STDIN / 인쇄 또는 스택을 통해 입력 및 출력으로 함수를 구현할 수 있습니다. 가능하지 않은 경우 입력 및 출력이 저장되는 스 니펫으로 만드십시오. 변수.)

입력

의 순서 left/ right길이의 결정 031당신의 선택의 형식으로 표시 포함. 문자 문자열 R/ L, 숫자 목록 1/ -1또는 부울 배열 일 수 있습니다. 코드에 유용한 메소드 이름이나 문자열을 갖는 것만 큼 치즈 같은 것은 없습니다.

아래 테스트 사례와 다른 경우 테스트 사례를 형식으로 게시하십시오.

산출

True/ False, 0/ 1또는 해당 언어의 유사체.

우승 기준

가장 적은 바이트가 이깁니다. 명명 된 기능을 제공해야합니다. 함수 외부에 코드를 가질 수 있지만 해당 바이트도 계산됩니다. 여러 번 호출하면 함수가 올바르게 작동해야합니다.

테스트 사례

True 사례 (한 줄에 하나씩, 두 번째는 빈 목록입니다) :

1 1 1 1

-1 -1 -1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 1 1 -1 -1
-1 1 1 -1 -1 1 1 -1
1 1 1 -1 -1 -1 -1 1
1 -1 -1 1 -1 -1
1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
-1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

False 사례 (한 줄에 하나씩) :

1
1 1
1 1 1
-1 1
1 -1 -1 -1 1
1 -1 -1 1 1
-1 1 -1 1
1 1 1 1 -1
-1 -1 1 -1 1 -1 -1 1
1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1

다음과 같은 테스트 케이스의 L의와 R의를.

True 사례 :

RRRR

LLLL
RLRLRL
RRLLRRLL
LRRLLRRL
RRRLLLLR
RLLRLL
RRRRLLLLRLLRLL
LLLRLLRRLRLRRRRRRRRRRRRRRRRR

False 사례 :

R
RR
RRR
LR
RLLLR
RLLRR
LRLR
RRRRL
LLRLRLLR
RLRRRRLLLRRLLL

추가 신용 챌린지

같은 것이지만 정육면체 보다는 십이 면체 가 있습니다. 아이디어 는 Wumpus 사냥을 참조하십시오 .


명명 된 함수없이 언어를 사용할 수 없습니까?
Mike Precup

@MikePrecup 그런 언어의 예를 들어 주시겠습니까? 대안을 살펴 보겠습니다.
xnor

> <> 에서 모든 코드 골프 제출을 수행하므로 요청합니다. 스택에는 args를 맨 위에로드 한 다음 결과를 스택에 남겨 둘 수 있지만 정확히 명명 된 함수는 아닙니다.
Mike Precup

@MikePrecup 좋아, 나는 그것을 위해 수당을 넣었다. 일부 언어에 여전히 문제가있는 경우 언어를 제외하고 싶지 않습니다.
xnor

나는 befunge와> <> 그리고 이런 종류의 언어를 생각할 수있다
자랑스런 Haskeller

답변:


21

GolfScript, 24 자 (기능 본문의 경우 19 자)

수학 FTW!

{3,.@{[+~@\{@}*~]}/=}:f;

이 솔루션을 온라인으로 테스트하십시오.

이 함수는 이진 배열을 입력으로 사용하고 (왼쪽은 0, 오른쪽은 1) true는 1, false는 0을 반환합니다.

개념적으로, 그것은 개미가 항상 같은 위치와 방향을 유지하도록 큐브 를 회전시키고 큐브 가 처음 시작한 것과 같은 방향으로 끝나는 지 확인함으로써 작동합니다.

특히 좌회전과 우회전을 3 차원으로 2 개의 선형 맵으로 나타낼 수 있습니다. 여기서 좌회전은 x 축을 중심으로 90 ° 회전합니다. 즉 맵 ( x , y , z ) → ( x , z , − y ), 우회전은 y 축을 중심으로하는 90 ° 회전 , 즉 맵 ( x , y , z ) → ( z , y , -x )에 해당합니다.

함수의 시작 부분에서 고유 한 양수 값 (1, 2, 3)을 포함하는 3 요소 벡터를 설정하고 회전 맵 시퀀스를 적용하고 결과 벡터가 초기 벡터와 같은지 확인합니다.

(사실, 몇 개의 문자를 저장하기 위해 초기 벡터가 (0, 1, 2)이고 맵이 ( x , y , z ) → ( x , z , −1− y ) 되도록 좌표를 실제로 변환합니다. 및 ( x , y , z ) → ( z , y , −1− x )이지만 최종 결과는 동일합니다.)

추신. 이 솔루션의 원래 버전에서 버그를 발견 한 것에 대해 자랑스런 haskeller 에게 감사합니다 .


펄, 58 자

의견에서 요청한 것처럼 Perl로 포팅 된 동일한 솔루션이 있습니다. (이 버전은 변환이 Perl에 문자를 저장하지 않기 때문에 실제로 변환되지 않은 좌표를 사용합니다.)

sub f{@a=@b=1..3;@a[$_,2]=($a[2],-$a[$_])for@_;"@a"eq"@b"}

이 솔루션을 온라인으로 테스트하십시오.


보너스 : 십이 면체에 개미 (골프 스크립트, 26 자)

{5,.@{{2*2%[~\]}*(+}/=}:f;

이 솔루션을 온라인으로 테스트하십시오.

위의 ant-on-a-cube 함수와 마찬가지로이 함수는 이진 배열을 입력으로 사용하고 (왼쪽은 0, 오른쪽은 1) 개미가 시작된 위치와 같은 위치와 방향으로 끝나는 경우 1을 반환합니다. 그렇지 않으면.

이 솔루션은 위의 큐브 솔루션보다 약간 더 추상적 인 표현을 사용합니다. 구체적으로, 12 면체회전 대칭 그룹이 교번 그룹 A 5 에 대해 동형 이며, 즉 5 개의 원소의 짝수 순열의 그룹을 사용한다는 사실을 이용한다 . 따라서, 십이 면체의 각 가능한 회전 (가장자리를 에지에 정점에 정점에 정점으로 매핑)은 5 개의 요소 배열 의 순열 로 고유하게 표시 될 수 있으며 , 연속 회전은 해당 순열을 순서대로 적용하는 것에 해당합니다.

따라서 왼쪽과 오른쪽 회전을 나타낼 수 있는 두 개의 순열 LR 을 찾기 만하면 됩니다. 특히,이 순열 5주기 할 필요 (그래서 원래의 상태로 다섯 개 번 반환을 적용하는 것을) 그들이 (즉, 서로의 힘이 아니어야 RL N 어떤을위한 N ), 그들은 관계를 만족해야합니다 ( LR ) 5 = (1), 여기서 (1)은 항등 치환을 나타냅니다. 실제로이 기준은 경로 LRLRLRLRLR가 원래 위치로 돌아와야 한다는 것을 나타냅니다 .

L 순열을 왼쪽으로의 간단한 배럴 시프트로 수정 , 즉 매핑 ( a , b , c , d , e ) → ( b , c , d , e , a ) : GolfScript에서 단 2 개로 구현할 수 있기 때문에 문자 ( (+)에서 R 순열에 대해 5 가지 가능한 선택이 있음을 발견했습니다 . 그 중에서 나는 매핑 ( a , b , c , d , e ) → ( c , e , d ,b ) a )도 비교적 컴팩트 한 GolfScript 구현을 가지고 있기 때문입니다. (실제로, 나는 먼저 2*2%( a , c , e , b , d ) 를 얻기 위해 요소를 인터리빙 한 다음 마지막 두 요소를 [~\]으로 바꾸고 마지막으로 L 순열을 무조건 적용하여 a 를 끝 으로 이동 하여 구현 합니다.

위의 온라인 데모 링크에는 다음과 같이 12 면체에서 유효한 경로의 일부 테스트 사례가 포함되어 있습니다.

           # empty path
1 1 1 1 1  # clockwise loop
0 0 0 0 0  # counterclockwise loop
1 0 0 0 0 1 1 0 0 0 0 1  # figure of 8
1 0 1 0 1 0 1 0 1 0      # grand circle
1 0 0 0 1 0 0 0          # loop around two faces 
1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0  # Hamilton cycle

좋은 해결책! 이것은 개미가 다른 방향에서 같은 정점으로 돌아 오는 경우를 제외합니까?
xnor

이해가 안됩니다-기본적으로 여기에서하는 일은 3 비트를 사용하여 개미의 위치를 ​​나타내는 것이지만 가능한 위치는 24 개입니다. 방법?
자부심을 가진 haskeller

1
@proudhaskeller : 버그를 찾아 주셔서 감사합니다. 나는 그것을 고치고 반례를 내 테스트 스위트에 추가했다.
Ilmari Karonen

1
@ xnor : 12 면체에 대한 솔루션도 추가되었습니다.
Ilmari Karonen

1
십이 면체에 대한 좋은 순열입니다. 내가 사용되는 것들 헌트는 wumpus 사는 한 문자 이상이 될 것입니다 : {[~@]-1%}*[~@]또는 ){[~@]-1%}*-1%당신의 교체{2*2%[~\]}*(+
피터 테일러

7

파이썬, 68

1과 -1의 목록을 가져옵니다. 3D 회전 기준 : 일련의 회전을 적용한 후 점 (3,2,1)이 동일한 위치에서 끝나는 지 확인합니다. 1과 -1에 해당하는 두 가지 가능한 회전이 있습니다. 각각은 두 개의 좌표를 치환하고 그 중 하나의 부호를 변경하여 수행됩니다. 변경할 정확한 좌표와 치환 할 부호는 중요하지 않습니다.

def f(l):
 p=[3,2,1]
 for d in l:p[d],p[0]=-p[0],p[d]
 return[3,2]<p

편집 : 이것은 실제로 "Perl, 58"과 동일한 솔루션입니다.


당신 말이 맞아, 그것은 사실이다.
자랑스런 Haskeller

+1, 그것은 여전히 ​​파이썬 솔루션에서의 시도보다 짧습니다. 그러나 내가 가진 것을 살펴보면 입력을 0과 1로 가져 와서 마지막 요소를 p별도의 변수로 분할하여 몇 가지 문자를 더 절약 할 수 있다고 생각합니다 .
Ilmari Karonen

3
와우, 나는 이 문제를 테스트 할 때 변수 이름을 제외하고 문자에 대해 정확히 동일한 해결책 인 문자를 썼습니다 !
xnor

5

매스 매 티카

Ilmari Karonen의 솔루션에서 영감을 얻었습니다. 큐브의 회전 대칭 그룹은 S 4 와 동형 입니다.

큐브, 51 바이트

Fold[Part,r=Range@4,{{2,3,4,1},{3,4,2,1}}[[#]]]==r&

1s 및 -1s 목록을 입력으로 사용합니다.

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

십이 면체, 55 바이트

Fold[Part,r=Range@5,{{2,3,4,5,1},{3,5,4,2,1}}[[#]]]==r&

1s 및 -1s 목록을 입력으로 사용합니다.

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


S3와 동형이라는 것을 어떻게 알 수 있습니까?
자부심을 가진 haskeller

죄송합니다. "S4에 동형 인 것을 어떻게 발견 / 증명할 수 있습니까?"
자랑스런 Haskeller

@proudhaskeller 여기에서 찾을 수 있습니다 : en.wikipedia.org/wiki/Octahedral_symmetry
alephalpha

5

C (GCC) , 118 (116) 107 105 바이트

ceilingcat 덕분에 -2 바이트

f(char*s){char*p,n[]="@ABCDEFG",y;for(;*s;s++)for(p=n;*p;*p++^=*s^82?y%2+1:4-(y&2))y=*p/2^*p;y=n[2]==66;}

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

큐브에 다음과 같은 좌표를주었습니다.

            (1,1,1)       (1,1,0)
          G +--------------+ C
           /|             /|
          / |            / |
         /  |    (0,1,0)/  |
(0,1,1) +--------------+ D |
      H |   |          |   |
        |   |          |   |
        | F +----------|---+ (1,0,0)
        |  /(1,0,1)    |  / B           x
        | /            | /           y / 
        |/             |/            |/  
      E +--------------+ A      z ---*   
        (0,0,1)       (0,0,0)

D 코너에서 시작하면 C 또는 H로 이동하는 것이 대신 큐브를 회전시키는 것으로 생각할 수 있습니다. 오른쪽으로 이동한다는 것은 Z 축을 기준으로 시계 반대 방향으로 회전하는 것을 의미하고 왼쪽으로 이동하면 X 축을 기준으로 시계 방향으로 회전하는 것을 의미합니다. 이것들은 우리가 신경 써야 할 두 가지 회전입니다. 각 회전이 정확히 90도이므로 모서리가 모서리를 따라 "미끄럼 이동"한다고 상상할 수 있습니다. 오른쪽으로 이동하는 경우 A-> B, B-> C, C-> D, D-> A와 반대쪽 E-> F 등을 의미합니다. 왼쪽으로 이동하면 A-> E, E- > H 등

각 모서리는 모서리를 따라 만 미끄러지므로 각 점의 치수 중 하나만 각 회전마다 변경됩니다. B가 C로 이동하면 y 구성 요소 만 변경되고 H가 D로 이동하면 z 구성 요소 만 변경됩니다. 또한 좌표가 0과 1로 제한되어 있기 때문에 각 점을 이진수로 생각할 수 있으며 이동시 적절한 비트가 뒤집 힙니다.

오른쪽으로 이동하면 A와 C는 x를, D와 B는 y를 뒤집습니다. 큐브 헤드의 측면을 보도록 관점을 변경하고 z 구성 요소를 무시하면 (이 회전에 대해서는 변경되지 않음) 다음을 얻습니다.

D (0,1)         C (1,1)
 +-------------+
 |             |
 |             |
 |             |
 |             |
 |             |
 |             |
 +-------------+
A (0,0)         B (1,0)

패턴이 나타납니다. x를 뒤집는 점의 경우 x == y 인 반면 y가 뒤집힌 점의 경우에는 반대입니다. 이것은 다른 유형의 회전에도 적용되지만 x 대신 z가 사용됩니다.

다른 말로:

Right
    if (x == y) x = !x
    if (x != y) y = !y

Left
    if (z == y) z = !z
    if (z != y) y = !y

이제 모든 회전을 쉽게 수행 할 수 있으며 마지막 D가 초기 D와 일치하는지 확인합니다.

각 포인트를 단일 숫자로 저장하는 것이 제공되지만 C에서는 char 배열을 할당하는 것이 int 배열보다 훨씬 간단합니다. 우리는 하위 3 비트가 000..111과 일치하는 문자를 선택하므로 나머지 비트는 무시할 수 있습니다. 좌표를 뒤집는 것은 단순히 적절한 비트 마스크를 사용하여 XOR하는 것입니다.


1
긴 설명에 감사드립니다. 다른 답변은 내 머리를 클릭하지 않았지만 이것은 즉시 의미가 있습니다.
Nit

4

파이썬-110, 150

-1좌회전, 우회전 으로 정수 목록을 1받습니다.

큐브, 110 :

def f(l):
    c,p='07'
    for d in l:a="100134462634671073525275"[int(c)::8];c,p=a[(a.index(p)+d)%3],c
    return'1'>c

테스트:

l=map(int,'1 1 1 1'.split())
print f(l)

십이 면체, 150 :

def f(l):
    c,p='0J'
    for d in l:a="I5H76E8BBA8F76543100JI0J21D3A5C7E9CJI2132H4GF94C6D98AHGBEDGF"[int(c,36)::20];c,p=a[(a.index(p)+d)%3],c
    return'1'>c

1
3 분 안에 이것을 어떻게 작성했는지는 상당히 인상적입니다
:-P

6
이 보스 질문이 스폰 될 때까지 꽤 오랫동안 기다리고있었습니다. ;-)
벡터화

파이썬 3.2에서 이것을 실행할 때 "TypeError : 예상 된 버퍼 인터페이스를 가진 객체"가 나타납니다.
xnor

@ xnor python 2에서 편집되었습니다. 희망이 있습니다.
벡터화

4

놀라운 188

새로운 언어를 보여주기위한 Ilmari Karonen 알고리즘의 수치 스러운 절도 .

이 스크립트는 stdin에서 왼쪽에 0x00, 오른쪽에 0x01의 문자열이 필요하며 그 뒤에 0x0A (줄 바꾸기)가 필요합니다. 실패한 경우 "0"을, 성공하면 "1"을 출력합니다.

......@5@3FF
@0@1@2\\]]@5
010203@4=A@4
&0&0&0&0/\
MVMVMVMV..
@0@1@2@3..!!
:MV
}2}2}1}0}1}0}3
&0&1&0&1~~~~<A@P
{0{1{1{0&1&0=0&1
}0}1}2@P{2{2&030
=1=2=3&2FF}3..//
&2&2&231&2{3
\/\/\/&2!!..//

예제 실행 :

# echo -e "\x0\x0\x0\x1\x0\x0\x1\x1\x0\x1\x0\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1" | marbelous.py ant-on-a-cube.mbl
1

1
언어 설명을 읽을 때까지이 답변이 얼마나 미친 지 몰랐습니다. 이것은 골프 언어에 대한 정말 멋진 개념입니다!
xnor

@xnor은 이제까지 골프 분야에서 심각한 경쟁자가 될 확률이 낮다, 그러나 :) 여전히 다소 재미
Sparr

4

파이썬 2 , 57 바이트

f=lambda l:reduce(lambda n,x:n%4*64+n/4*16**x%63,l,27)<28

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

순열 표현을 사용합니다.

0: abcd -> dabc
1: abcd -> dcab

여기서 좌우 (0과 1)는 4 요소의 길이 -4주기에 해당합니다. 표시된 순열을 적용하여 입력을 반복하고 결과가 초기 값과 같은지 확인합니다.

우리 a,b,c,d는 네 가지 요소로 시작 합니다 0,1,2,3. 우리는 밑줄 4에 해당하는 n=abcd초기 값 으로 단일 밑줄 -4 숫자로 압축합니다 . 우리는 각 순열을 산술적으로 인스턴스화합니다 .n=270123n

모두 결과로 시작하기 때문에 d, 우리는 할 수 n%4추출물에 d다음 n%4*64올바른 위치로 이동합니다 d___. 다른 숫자는 abc로 추출됩니다 n/4. 더 낮은 세 자리 값에 삽입해야합니다.

방향 x=0에 대해 그대로 삽입 abc하고에 대해 x=1로 회전합니다 cab. 로 회전이 달성 될 수 *16%63소요되며, abcabc00cab. ((가) %63에 잘못 것 a==b==c==3, 그러나이 값은 가능하지 않습니다.) 단지 일을하지 않기 때문에 %63아무 조합입니다, 방향에 의존하는 표현 *16**x%63제공 abc또는 cab필요에 따라.


파이썬 2 , 55 바이트

f=lambda l:reduce(lambda n,x:n^(n*8%63|7*8**x),l,10)<11

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


3

하스켈, 104 (103) 99 (97) 96 / (67) 64 개 문자

오른쪽 / 왼쪽에 해당하는 데이터 유형 방향이 다음과 같습니다.

Direction = R | L

그래서 나는 대답에서 그것들이 가능하다고 가정했다.
편집 : 실제로 부울은 코드가 더 짧아 질 것임을 깨달았습니다. True는 왼쪽 회전을 나타내고 False는 오른쪽 회전을 나타냅니다 (기술적으로 코드가 뒤집힌 경우 동일하게 작동하지만 대칭 임)

96 자 :

m[p,l,r]b|b=[p%l,7-r-l,r]|0<1=[p%r,l,7-r-l]
p%x|odd$div p x=p-x|0<1=p+x
g l=foldl m[0..2]l<[0,2]

g는 방향 목록이 주어지면 개미가 제자리로 돌아 오지 않은 날씨를 반환하는 함수입니다.

위치 표현에 대한 설명 : 개미의 위치는 정수의 세 튜플로 코딩됩니다. 첫 번째 정수는 개미가 향하는 정점을 나타냅니다. 첫 번째 비트는 정점이 위 / 아래 절반에 있는지, 두 번째는 왼쪽 / 오른쪽 절반에, 세 번째 비트는 앞 / 뒤 절반을 나타냅니다. 이것은 한 비트를 뒤집어서 정점에서 인접 정점으로 이동하는 것이 가능하도록 수행됩니다.

두 번째 정수는 개미의 정점이 왼쪽으로 이동하면 변경되는 양입니다. 예를 들어, 개미가 정점 3에 있고 두 번째 정수가 4 인 경우, 정점을 왼쪽으로 돌린 후에는 7이됩니다. 1 개의 정점을 이동하여 정확히 1 비트가 반전되기 때문에 항상 2의 거듭 제곱입니다.

세 번째 정수는 동일하지만 올바르게 진행됩니다. 나는 이것이 처음 두 사람에 의해 계산 될 수 있다는 것을 알고 있지만 어떻게 해야할지 모르겠다. 당신이 아이디어를 가지고 있다면, 알려주세요.

주목해야 할 것은 왼쪽으로 돌리면 세 번째 정수는 동일하게 유지되고 두 번째 정수는 2와 4 사이의 정수가되어 두 번째 정수 또는 세 번째 정수는 7과 동일하지 않습니다. 두 번째 정수-세 번째 정수

(앞 단락에서 언급했듯이) 다음 위치를 계산하는 것이 쉽지 않기 때문에 위치를 나타내는이 방법을 선택했습니다.

기능 설명 :

(%) 함수는 현재 정점과 그 양을 변경하여 변경하는 함수입니다. 그것은 변화 할 비트에 도달하고 (매우 수치적인 방식으로) 뒤집습니다.

m 함수는 개미의 위치와 방향을 취하는 함수이며 앞에서 언급 한 메모를 사용하여 새 위치를 반환합니다.

m 함수는 foldl을 사용하여 결합됩니다 (이것은 reduce자바 스크립트와 비슷하지만 조금 더 표현력이 있습니다).이 질문에 대한 답변 g를 만듭니다.


하스켈, 64 자

@alphaalpha의 답변에서 영감을 얻은 다음은 haskell로 이식 된 버전입니다.

m[a,b,c,d]p|p=[b,c,d,a]|0<1=[b,d,a,c]
g l=foldl m[0..3]l<[0,1,3]



편집 : 이제 lmari Karonen의 답변으로 인해 엄청나게 바보 같은 느낌이 들었습니다. 어쩌면 나는 그의 답변을 하스켈로 옮길 것이다. 또 다른 편집 : 그의 대답은 같은 바보 같은 기분이 안 되는 잘못
편집 : 자신으로 목록을 사용하여 실제로 튜플을 사용 전환 Ord인스턴스와 [ ... ]문법 설탕이 짧은합니다


1
이것은 특히 우아하게 보입니다. [0,1,2,3]변수 에 할당 하기 위해 더 많은 문자를 저장 하고 표현식의 입력 및 결과 확인으로 사용할 수 있습니까?
xnor

@ xnor 귀하의 의견이 내 마음에 golfng로 올라 오기로 결정했기 때문에 [0..3]... 나는 왜 그렇게 일찍 눈치 채지 못했는지 모르겠습니다. 감사. 그러나 지금 당신의 트릭은 작동하지 않습니다. 오 잘.
자랑스런 Haskeller


3

APL (Dyalog Unicode) , 22 바이트 ( Adám의 SBCS )

f←{x∊(-@3∘⌽⌽)/⍵,x←⊂⍳3}

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

H.PWiz 는 단계를 거꾸로해도 차이가 없으며 -2 바이트가 발생한다고 제안했습니다.

음, GolfScript보다 짧게 만들어 졌기 때문에 당황 스럽습니다. 적어도 나는 노력했다.

이 함수의 이름 f은이며 테스트 사례에서는 1왼쪽 회전 (부울 true)을 0나타내고 오른쪽 회전 (부울 false)을 나타냅니다. 빈 목록을 나타냅니다.



3

배쉬 , 71 65 바이트

f()(a=1234;for i;{ a=`tr 1-4 4$[$i?123:312]<<<$a`;};((a==1234));)

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

많은 이전 답변과 마찬가지로 1234-> 4123 및 1234-> 4312에 의해 생성 된 큐브의 회전 그룹을 나타냅니다. 문자 대신 숫자를 사용하여 산술 확장과 함께 삼항 연산자를 사용할 수 있습니다. 공백으로 구분 된 0과 1로 입력을 예상하고 종료 코드를 통해 출력합니다.

@manatwork의 의견 덕분에 6 바이트가 절약되었습니다!


1
참조 데니스배쉬 팁 매개 변수 목록을 통해 반복에 관한.
manatwork

3

brainfuck , 119 바이트, 137 바이트

큐브의 회전 그룹이 동형 원이라는 사실을 사용합니다. 에스4. Brainfuck에는 이름이나 다른 기능이 전혀 없으므로 STDIN을 통해 입력을 받고 STDOUT으로 출력하는 전체 프로그램입니다. (변수를 고집하는 경우 프로그램이 끝나는 셀의 값이 변수라고 가정하십시오.)

큐브, 119 바이트

++++>+++>++>+>,[+++[->+++<]<<<<[->>>>+<<<<]>[>]<+[[-]<[->+<]<<<[->>>+<<<]>[>]],]<[[<]>[->]<[>>]<]<[>>-<]-[----->+<]>--.

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

++++>+++>++>+    Initialize tape as 4 3 2 1

>,[              For each input byte:

  +++[->+++<]       Add 3 and multiply by 3; if input is R, this will be 255

  <<<<[->>>>+<<<<]  Move first number to end (BCDA)

  >[>]<+[           If input wasn't R:

    [-]                Zero input cell (which is now negative 18)

    <[->+<]            Move previously moved number one slot further (BCD_A)

    <<<[->>>+<<<]      Move first number into vacated slot (CDBA)

  >[>]]

,]

<[[<]>[->]<[>>]<]     Determine whether tape is still 4 3 2 1

<[>>-<]               If not: subtract 1 from output cell

-[----->+<]>--.       Create "1" in output cell and output

십이 면체, 137 바이트

+++++>++++>+++>++>+>,[+++[->+++<]<<<<<[>>>>>+[<]>-]>[>]<+[[-]<<[[->>+<<]<<]>[>>>>>>+[<]<-]>>[>]],]<[[<]>[->]<[>>]<]<[>>-<]-[----->+<]>--.

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

두 프로그램의 유일한 차이점은 설정과 순열입니다. 여기에 사용 된 왼쪽 순열은 DCAEB입니다.


1

젤리 , 14 바이트

3RðW;ṙN1¦ṚƊ/⁼⁸

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

1 = 좌회전, 0 = 우회전. 내 Dyalog 솔루션을 기반으로합니다.

불행히도, Jelly는 기능 명을 가지고 있지 않습니다. 암시 적 입력을 사용할 수없고 변수에 있다고 가정해야하는 경우 동일한 길이의 버전이 수행합니다.

3RµW;®ṙN1¦ṚƊ/⁼

입력이 레지스터에 있다고 가정합니다 (© / ®).


0

펄-120, 214

부울의 배열 (목록)을 가져옵니다.

큐브 (120) :

sub e{$a=$b=0;for$c(@_){$_=(13,62,53,40,57,26,17,'04')[$b];$d=s/$a/($b-1)%8/e;($a,$b)=($b,substr($_,$c^$d,1))}return!$b}

십이 면체 (214) :

sub e{$a=$b='00';for$c(@_){$_=('01041102090307040500061807160308091502101114121019131714151016081706131819051200'=~/\d{4}/g)[$b];$d=s/$a/sprintf'%02d',($b-1)%20/e;($a,$b)=($b,substr($_,($c^$d)*2,2));}return!($b+0)}

2
매직 넘버 인코딩은 무엇입니까?
xnor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.