내 루빅스 큐브에 개미가있다


44

해결 된 표준 3 × 3 × 3 Rubik 's Cube 는 6 개의 서로 다른 색상의 얼굴을 가지고 있으며, 각 얼굴은 한 색상의 3 × 3 격자 사각형입니다. 하얀 얼굴은 노랑 반대, 빨강 반대 오렌지, 파랑 반대 녹색, 흰색이 위를 향하면 빨강은 파랑의 왼쪽에 있습니다.

루빅스 큐브 레이아웃

개미가 하얀 얼굴의 중앙 광장에 앉아 붉은 얼굴을 향한다고 상상해보십시오. 그에게 세 가지 명령을 줄 수 있습니다.

  • 앞으로 ( ^)-필요한 경우 큐브의 가장자리를 밟아 다음 그리드 사각형을 향한 방향으로 한 단계 씩 이동합니다.
  • 오른쪽 ( >)-같은 격자 사각형을 유지하면서 오른쪽 (시계 방향)으로 90 ° 회전합니다.
  • 왼쪽 ( <)-같은 그리드 사각형에 유지하면서 왼쪽 (시계 반대 방향)으로 90 ° 회전합니다.

임의의 명령 목록이 주어지면 개미가 방문하는 사각형의 색상을 찾으십시오 (흰색 시작 사각형은 포함하지 않음).

예를 들어, 명령 순서 ^^>^^<^^^에는 다음과 같은 경로가 있습니다.

예제 경로

시작 사각형을 세지 않고 순서대로 방문한 격자 사각형의 색상은 white red red green green green yellow, 또는 wrrgggy입니다.

명령 문자의 문자열을 가져와 큐브 위의 개미 경로에 해당 <^>하는 문자열 wyrobg(흰색, 노란색, 빨간색 주황색, 파란색, 녹색)을 인쇄하거나 반환 하는 프로그램이나 함수를 작성 하십시오 .

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker가 이전 답변입니다.

노트

  • 입방체는 공중에 있고 개미는 효과적인 풀리를 가지고있어 입방체 전체를 가로지 릅니다.
  • 큐브는 항상 해결 된 상태로 유지됩니다.
  • 사각형의 색상은 회전이 아닌 사각형으로 이동할 때만 기록됩니다. 시작 흰색 사각형은 기록하지 않아야합니다.
  • 하나의 선택적 후행 줄 바꿈이 입력 및 / 또는 출력에 존재할 수 있습니다.

테스트 사례

input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy


2
@ MartinBüttner 개미에는 다리가 6 개, 입방체에는 6 개의면이 있습니다. <shrug> 난 몰라 ...
Digital Trauma 1

4
이것은 초보자 골프 도전이 아닙니다 ..... 나는 하드 코딩되지 않은 좌표계를 내 마음을 잃고 있습니다.
Matt

2
@DigitalTrauma이 도전은 Hexagony 답변을 비명입니다 :-)
Luis Mendo

1
지금까지 본 최악의 PowerShell 코드와 너무 가깝습니다.
Matt

답변:


18

156 143 134 128 127 125 120 119 117 113 109 바이트

에 +1 포함 -p

STDIN에서 제어 문자열로 실행

perl -p rubic.pl <<< "^^>^^<^^^"

rubic.pl:

@1=wryobg=~/./g;s##$n=w&$&;$y+=$x-=$y+=$x,@1[0,4,2,5,3,1]=@1while--$n%9;@{$n&&--$y%3}[3,0..2]=@1;$1[$n+9]#eg

설명

이전 버전 :

@f=gboyrw=~/./g;s##$n=w&$&;$y+=$x-=$y+=$x,@f=@f[2,4,1,3,0,5]while--$n%9;@f=@f[0,$y=1,5,2..4]if$n&&$y--<0;$f[$n+8]#eg

이 질문의 과제는 개미의 위치와 방향을 쉽게 추적하고 여전히 얼굴의 정체성을 쉽게 얻을 수있는 좌표계를 찾는 것입니다.

내가 선택한 시스템 (x,y)은 개미가 얼굴 y의 중심을 향한 상태에서 항상 음의 방향을 향하도록 개미가있는면에 표준 좌표 를 배치하는 것이 었습니다 (0,0). 그래서:

rotate right: (x',y') <- (-y,  x)
rotate left:  (x',y') <- ( y, -x)  alternatve: 3 right rotations
Step forward:   y' <- y-1

y이미 -1개미가 있었다면 개미는 현재 얼굴을 남겨두고 다음 얼굴로 밟습니다. 새로운 좌표계에서는 x그 값을 유지하지만 y'1이됩니다.

이것은 얼굴 내에서 쉬운 좌표계를 제공합니다. 나는 또한 얼굴 자체를 위해 무언가가 필요하다. 거기에 구성된 배열을 사용합니다.

The face to right of the ant            g in the initial position
The face to the left of of the ant      b
The face behind the ant                 o
The face opposite to the ant            y
The face before the ant                 r
The face the ant is on                  w

따라서 초기 배열은 (g,b,o,y,r,w)입니다. 다음면으로 이동하면 마지막 4 개 요소를 회전하는 것과 일치하므로 흰색에서 빨간색으로 이동하면이 작업이 수행 (g,b,w,o,y,r)됩니다. 오른쪽으로 돌리는 것은 처음 5 개 요소의 순열입니다 (o,r,b,y,g,w). 왼쪽으로 돌리는 것은 단순한 순열이지만 오른쪽으로 세 번 돌려서 수행 할 수도 있으므로이 순열을 3 번 적용하십시오. 그리고 순열을 8 번 적용하여 전혀 회전하지 않을 수도 있습니다. 실제로 순열을 5 번 적용하여 오른쪽으로 돌리는 것도 가능합니다.

이 프로그램을 아는 것은 다소 간단합니다.

@f=gboyrw=~/./g                 Set up the initial face orientation
s## ... #eg                     Process each control string character
                                {this is equivalent to s#.#...#eg because
                                the empty regex repeats the last
                                succesful regex)
$n=w&$&                         Calculate n, the number of right
                                rotations+1 modulo 9.
                                This abuses a coincidence of the control
                                characters:
                                 "<" & "w" = "4" -> 3 right rotations
                                 ">" & "w" = "6" -> 5 right rotations
                                 "^" & "w" = "V" = 0 but that is 9 mod 9
                                 so leads to 8 right rtations

$y+=$x-=$y+=$x,                 This is the same as ($x,$y)=(-$y,$x), so
                                a right rotation of the face coordinates
@f=@f[2,4,1,3,0,5]              Right rotation of the face array
   while --$n%9                 Rotate right n-1 times. After this n=0
                                If this was a step then n was effectively 0.
                                So rotate right 8 times leaving n=-9

    ... if $n                   If a step...
               $y--             ... decrease y ...
             &&$y--<0           ... but if y was already negative ...
@f=@f[0,$y=1,5,2..4]            ... change face and set y to 1

$f[$n+8]                        return the last element (current face)
                                if this was a step, otherwise empty

따라서 마지막 명령문 회전은 빈 문자열로 이어지고 앞으로 진행하면 현재면으로 이어집니다. 따라서 $_각 단계에서 방문한면으로 교체됩니다.


내가 여기서 무슨 일이 일어나고 있는지 이해한다면, 그 @1비트는 끔찍한 언어 기능처럼 보이는 것에 대한 놀라운 남용입니다.
아니 찰스

@NotthatCharles 예, 그것은 보이는 것처럼 정확하게 악합니다. 심각한 perl 프로그램에서 가장 먼저해야 할 일은를 사용하여 해당 기능을 끄는 것입니다 use strict. 그런데 모듈로 3에 감사드립니다.
Ton Hospel

12

Brachylog , 287 바이트

:1:2222:"w":"y":["r":"b":"o":"g"]{h""|[L:I:N:A:B:[C:D:E:F]]hhM("^",(NhI,CwX,EY,B:D:A:FZ;AwX,BY,[C:D:E:F]Z),NhJ,(I1,2313O;I2,(Nh2,N$($(O;Nh1,2222O;Nbh1,3223O;3322O);3322N,2332O;3223N,2233O;2233N,3132O;2332N,3231O);IJ,AX,BY,(M"<",[C:D:E:F]$(Z,N$(O;M">",[C:D:E:F]$)Z,N$)O)),Lb:J:O:X:Y:Z:1&}

이동을 입력으로 포함하는 문자열을 예상하고 출력이 없습니다 (예 : STDOUT에 brachylog_main("^^>^^<^^^",_).쓰기) wrrgggy.

설명

§ There are 3 types of tiles we can be on: centers (noted 1), edges (2) and corners (3)
§ When we are on a tile, we can denote adjacent tiles in order: front, left, back, right
§ Similarly, we can denote the adjacent colors depending on the current one of the face
§
§ We start on the center (1) of face white ("w"). The adjacent tiles are 4 edges (2222)
§ The adjacent colors of white are red, blue, orange and green ("r":"b":"o":"g")
§ Yellow is opposite of white ("y")

§ We pass those initial conditions in an array, with the sequence of moves as first
§ element, as input to subpredicate 1


:1:2222:"w":"y":["r":"b":"o":"g"]{...}


§ SUB-PREDICATE 1

h""  § If the sequence of moves is empty, terminate the recursion
|    § Else...

§ Here are the variables' names of the input (which correspond to what's described in
§ the first few paragraphs)
[L:I:N:A:B:[C:D:E:F]]

§ If the move is "^"...
hhM("^",

   § The only way we change from one face to another is if the tile we end up on is of the
   § same type as the tile we started from
   (NhI,      § If this is the case
    CwX,      § Then write the color of the face we're facing, this face will now be the
              § current color
    EY,       § The third color in the list is now the opposite color
    B:D:A:FZ  § The opposite color is now the one we face, the color behind us (the third
              § in the list) is the one we were on, and the other 2 don't change

    § If the tiles are not the same type, then we don't change color
    ; 
    AwX,         § Write the current color, this will remain the color
    BY,          § Opposite color stays the same
    [C:D:E:F]Z), § Other colors stay in the same order since we moved forward
    NhJ,              § The new tile type is the one we were facing
       (I1,2313O;     § If we were on the center, then the adjacent tiles are 2313
       I2,            § Else if we were on an edge
         (Nh2,N$($(O; § then if we were facing an edge (changed face), then the new types
                      § of tiles are a double circular permutation of the previous types
         Nh1,2222O;   § Else if we were facing a center, then the new tiles are 2222
         Nbh1,3223O;  § Else (corners) if the tile to our left is the center, then 3223
         3322O)       § Else 3322

       ;              § Else if we were on a corner
       3322N,2332O;   § then one of those 4 possibilities applies
       3223N,2233O;
       2233N,3132O;
       2332N,3231O)

§ Else if the move is NOT "^"
;
IJ,AX,BY,         § We stay on the same type of tile, same color, same opposite color
(M"<",            § if the move is "turn left"
    [C:D:E:F]$(Z, § Then we circular permute the adjacent colors to the left
    N$(O          § we also circular permute the adjacent tiles to the left
;M">",            § Else if the move is "turn right"
    [C:D:E:F]$)Z, § Then we do the same but with right circular permutations
    N$)O)
),
Lb:J:O:X:Y:Z:1&   § Recursively call sub-predicate 1 with the new input, and the next move

동등한 SWI- 프롤로그 코드

Brachylog의 컴파일러를 방해하지 않으려면 다음 코드를 사용하여 SWI-Prolog에서이 솔루션을 실행할 수 있습니다 (이는 Brachylog의 컴파일러에 의해 생성됨).

:- style_check(-singleton).

:- use_module(library(clpfd)).

brachylog_main(Input,Output) :-
    1=1,
    brachylog_subpred_1([Input,1,2222,"w","y",["r","b","o","g"]],V0).


brachylog_subpred_1(Input,Output) :-
    1=1,
    brachylog_head(Input, "").

brachylog_subpred_1(Input,Output) :-
    1=1,
    [L,I,N,A,B,[C,D,E,F]] = Input,
    brachylog_head([L,I,N,A,B,[C,D,E,F]], V0),
    brachylog_head(V0, M),
    ( 1=1,
    "^" = M,
    ( 1=1,
    brachylog_head(N, I),
    brachylog_write(C, X),
    Y = E,
    Z = [B,D,A,F]
    ;
    1=1,
    brachylog_write(A, X),
    Y = B,
    Z = [C,D,E,F]
    ),
    brachylog_head(N, J),
    ( 1=1,
    I = 1,
    O = 2313
    ;
    1=1,
    I = 2,
    ( 1=1,
    brachylog_head(N, 2),
    brachylog_math_circular_permutation_left(N, V1),
    brachylog_math_circular_permutation_left(V1, O)
    ;
    1=1,
    brachylog_head(N, 1),
    O = 2222
    ;
    1=1,
    brachylog_behead(N, V2),
    brachylog_head(V2, 1),
    O = 3223
    ;
    1=1,
    O = 3322
    )
    ;
    1=1,
    N = 3322,
    O = 2332
    ;
    1=1,
    N = 3223,
    O = 2233
    ;
    1=1,
    N = 2233,
    O = 3132
    ;
    1=1,
    N = 2332,
    O = 3231
    )
    ;
    1=1,
    J = I,
    X = A,
    Y = B,
    ( 1=1,
    "<" = M,
    brachylog_math_circular_permutation_left([C,D,E,F], Z),
    brachylog_math_circular_permutation_left(N, O)
    ;
    1=1,
    ">" = M,
    brachylog_math_circular_permutation_right([C,D,E,F], Z),
    brachylog_math_circular_permutation_right(N, O)
    )
    ),
    brachylog_behead(L, V3),
    brachylog_call_predicate([V3,J,O,X,Y,Z,1], V4).



brachylog_behead(X,Y) :-
    string(X),!,
    sub_string(X, 1, _, 0, Y)
    ;
    number(X),!,
    number_codes(X,[_|T]),
    catch(number_codes(Y,T),_,Y=[])
    ;
    atom(X),!,
    atom_codes(X,[_|T]),
    atom_codes(Y,T)
    ;
    X = [_|Y].

brachylog_math_circular_permutation_left(X,Y) :-
    string(X),!,
    string_codes(X,C),
    C = [H|T],
    append(T,[H],D),
    string_codes(Y,D)
    ;
    number(X),!,
    number_codes(X,C),
    C = [H|T],
    append(T,[H],D),
    number_codes(Y,D)
    ;
    atom(X),!,
    atom_codes(X,C),
    C = [H|T],
    append(T,[H],D),
    atom_codes(Y,D)
    ;
    X = [H|T],!,
    append(T,[H],Y).

brachylog_math_circular_permutation_right(X,Y) :-
    string(X),!,
    string_codes(X,C),
    append(T,[H],C),
    D = [H|T],
    string_codes(Y,D)
    ;
    number(X),!,
    number_codes(X,C),
    append(T,[H],C),
    D = [H|T],
    number_codes(Y,D)
    ;
    atom(X),!,
    atom_codes(X,C),
    append(T,[H],C),
    D = [H|T],
    atom_codes(Y,D)
    ;
    append(T,[H],X),
    Y = [H|T].

brachylog_call_predicate(X,Y) :-
    reverse(X,R),
    R = [N|RArgs],
    number(N),
    reverse(RArgs, Args),
    (
    N = 0,!,
    Name = brachylog_main
    ;
    atom_concat(brachylog_subpred_,N,Name)
    ),
    (
    Args = [UniqueArg],!,
    call(Name,UniqueArg,Y)
    ;
    call(Name,Args,Y)
    ).

brachylog_write(X,Y) :-
    X = [List,Format],
    is_list(List),
    string(Format),!,
    format(Format,List),
    flush_output,
    Y = List
    ;
    write(X),
    flush_output,
    Y = X.

brachylog_head(X,Y) :-
    string(X),!,
    sub_string(X, 0, 1, _, Y)
    ;
    number(X),!,
    number_codes(X,[A|_]),
    number_codes(Y,[A])
    ;
    atom(X),!,
    atom_codes(X,[A|_]),
    atom_codes(Y,[A])
    ;
    X = [Y|_].

4

PowerShell, 882 바이트

용법

코드를 스크립트에 저장하고 명령 행에서 이와 같이 호출하십시오. 작업 디렉토리가 현재 디렉토리라고 가정합니다.

.\WalkingAntcg.ps1 "^^>^^<^^^"

암호

$o=[char[]]"grbowy";[int]$c=4;[int]$global:x=1;[int]$global:y=1;[int]$f=1;[int]$n=5;
$u={$c=$args[0];$1="341504251435240503210123".Substring($c*4,4);$2=$1*2-match".$($args[1]).";$3=$Matches[0];"$3";"012345"-replace([char[]]"$1$c"-join"|")}
function t{param($o,$x,$y)if($o){switch($y){0{switch($x){0{$x=2}1{$y=1;$x=2}2{$y=2}}}1{switch($x){0{$y=0;$x=1}2{$y=2;$x=1}}}2{switch($x){0{$x=0;$y=0}1{$x=0;$y=1}2{$x=0}}}}}else{switch($y){0{switch($x){0{$y=2}1{$x=0;$y=1}2{$x=0}}}1{switch($x){0{$y=2;$x=1}2{$y=0;$x=1}}}2{switch($x){0{$x=2}1{$x=2;$y=1}2{$y=0;$x=2}}}}}$global:x=$x;$global:y=$y}
([char[]]$args[0]|%{switch($_){'^'{$global:y++;if($global:y-eq3){$global:y=0;$c="$f";$f="$n";$z=&$u $c $f;$f,$n="$($z[0][1])","$($z[1])"}$o[$c]}
"<"{$z=&$u $c $f;$f,$n="$($z[0][0])","$($z[1])";t 0 $global:x $global:y}
">"{$z=&$u $c $f;$f,$n="$($z[0][2])","$($z[1])";t 1 $global:x $global:y}}})-join""

설명이 적은 골프 코드

# Recorded order of cube colours and their indexes
# Green=0,Red=1,Blue=2,Orange=3,White=4,Yellow=5
$o=[char[]]"grbowy"
[int]$c=4   # Ant is currently on this colour
[int]$global:x=1   # X coordinate on this face
[int]$global:y=1   # Y coordinate on this face
[int]$f=1   # Colour that the Ant is facing
[int]$n=5   # Colour beyond that the ant is facing.
# If the ant moves of this cube to the next this value becomes the one he is facing.
# It is also the only colour not neighboring this current colour.

# Anonymous function that will return the colour facing left and right
$u = {
# Cube relationships relative to position. Groups of 4 colours that are important given the order...
# Green=0-3,Red=4-7,Blue=8-11,Orange=12-15,White=16-19,Yellow=20-23
# Get the colours surrounding the current colour we are on and the surrounding ones
# String version: "owrygwbyrwoybwgygrbogrbo"
$c=$args[0]
#  "341504251435240501230123"
$1="341504251435240503210123".Substring($c*4,4)
# double the string so that we can get the characters before and after the facing colour reliably
# Assign the output to surpress a boolean. $2 is not used. Shorter than a cast
$2=$1*2-match".$($args[1]).";$3=$Matches[0]
# Return two values. First is the colours to the left,current and right as a string.
# Second is the colour beyond the one we are facing. If we were to move forward two blocks
# we would end up on this colour
"$3";"012345"-replace([char[]]"$1$c"-join"|")
}

# function that will transpose the ants position based on right/left rotation.
# Using current x and y determines what the tranposed values are and return them.
function t{
    param($o,$x,$y)
    # X = $1; Y = $2
    # Left 0 Right 1
    if($o){
        # Right Transpose
        # All values are hard coded to rotate to their new positions
        switch($y){
            0{switch($x){0{$x=2}1{$y=1;$x=2}2{$y=2}}}
            # 1,1 is in the center and nothing changes
            1{switch($x){0{$y=0;$x=1}2{$y=2;$x=1}}}
            2{switch($x){0{$x=0;$y=0}1{$x=0;$y=1}2{$x=0}}}
        }
    }else{
        # Left Transpose
        # All values are hard coded to rotate to their new positions
        switch($y){
            0{switch($x){0{$y=2}1{$x=0;$y=1}2{$x=0}}}
            # 1,1 is in the center and nothing changes
            1{switch($x){0{$y=2;$x=1}2{$y=0;$x=1}}}
            2{switch($x){0{$x=2}1{$x=2;$y=1}2{$y=0;$x=2}}}
        }

    }
    # Update global variables with the ones from this function
    $global:x=$x
    $global:y=$y
}

# Process each character passed by standard input
([char[]]$args[0]|%{
    switch($_){
        # Moving Forward
        '^'{
        $global:y++
        if($global:y-eq3){
            # We have walked of the colour onto the next one. Update coordinates to the next colour
            $global:y=0
            $c="$f"
            $f="$n"
            # Get the new neighboring colour indexes
            $z=&$u $c $f
            $f,$n="$($z[0][1])","$($z[1])"
        }  
        # Output the colour we have just moved to.
        $o[$c]
        }
        # Turn Left
        "<"{$z=&$u $c $f;$f,$n="$($z[0][0])","$($z[1])"
        # Transpose the ants location by passing current location to the transposition function.
        t 0 $global:x $global:y
        }
        # Turn Right
        ">"{$z=&$u $c $f;$f,$n="$($z[0][2])","$($z[1])"
        # Transpose the ants location by passing current location to the transposition function.
        t 1 $global:x $global:y
        }
    }
}) -join ""
# Line above converts the output to a single string. 

개미 현재 상태 (컬러, 위치 및 방향)를 기록하는 데 사용되는 많은 단일 문자 변수를 사용합니다. 개미는 항상 위를 향하고 있습니다. 회전 명령을 읽으면 큐브가 해당 방향으로 바뀝니다. 현재 위치를 기반으로 새 위치를 결정하는 데 사용되는 하드 코딩 된 전치 행렬

코드는 문제의 모든 예를 충족시킵니다.


이것은 더 골프를 칠 수 있지만 지금은 작동하므로 반복을 제거해야합니다.
Matt

3

Tcl / Tk, 422 바이트

rename split S
array se {} [S wyywroorgbbg {}]
proc R a {foreach x [lassign $a y] {lappend b $x}
lappend b $y}
proc < {V H} {set ::H $V
set ::V [lreverse [R $H]]}
proc > {V H} [string map {V H H V} [info b <]]
proc ^ {V H} {
lassign $V x
lassign [set ::V [R $V]] y
set ::H [string map "$x $y $::($x) $::($y)" $::H]
puts -nonewline $y}
set V [S wwrrryyyooow {}]
set H [S wwgggyyybbbw {}]
foreach p [S {*}$argv {}] {$p $V $H}

아아, 나는 그것을 더 작게 얻을 수 없다. 난독 화 버전 :

array set opposites [split wyywroorgbbg {}]

proc lrotate xs {
  foreach x [lassign $xs y] {
    lappend ys $x
  }
  lappend ys $y
}

proc < {V H} {
  set ::H $V
  set ::V [lreverse [lrotate $H]]
}

proc > {V H} {
  set ::H [lreverse [lrotate $V]]
  set ::V $H
}

proc ^ {V H} {
  lassign $V x
  lassign [set ::V [lrotate $V]] y
  set ::H [string map [list $x $y $::opposites($x) $::opposites($y)] $::H]
  puts -nonewline $y
}

set V [split wwrrryyyooow {}]
set H [split wwgggyyybbbw {}]
foreach p [split {*}$argv {}] {$p $V $H}
puts {}

가로 및 세로 셀 색상 목록을 유지하여 작동합니다. ^ <및>는 모두 목록을 올바르게 치환하는 명령입니다. 현재 셀은 각 목록에서 첫 번째입니다.


3

루비, 132

m=?w
g="bgoyr"
x=z=1
gets.bytes{|c|(m,g[2,3]=g[4],m+g[2,2]if(x+=1)%3<1
$><<m)if 93<c.upto(64){x,z,g=2-z,x,g[4]+g[2]+g[0]+g[3]+g[1]}}

이 직책 시스템은 슬프게도 다른 답변과 매우 유사합니다. xz함께 현재의 얼굴에 당신의 위치를 추적 +x이동 방향 인. 앞으로는 항상 x+=1이고 각면의 경계는 3으로 나눌 수 있습니다 (우리는 숫자를 신경 쓰지 않고 계수는 3을 사용합니다).

m 현재 얼굴입니다 (바이트를 절약합니다)

g배치되고, [left, right, behind, opposite, front]우리는 변경하지 않도록 g[0..1]^

<>세 번만 하면됩니다 .


2

자바, 619605 바이트

글쎄, 여기 아무것도 없어 ...

적어도 그것은 파워 쉘을 이겼다!

@KevinCruijssen 덕분에 -14 바이트

String t(String f){int h[]={0,0,1},p[]={0,2,0},n[],i,s,r;String o="",d[]="w,g,r,b,o,y".split(",");for(char c:f.toCharArray()){r=r(p);n=h;if(c==94){s=3;for(i=0;i<3;i++)if(h[i]==p[i]&p[i]!=0){if(r==0)n[1]=-1;if(r==1)n[0]=1;if(r==2)n[2]=-1;if(r==3)n[0]=-1;if(r==4)n[2]=1;if(r==5)n[1]=1;s=i;break;}i=0;for(int a:n)p[i++]+=a;if(s<3)h[s]=0;o+=d[r(p)];}s=r>-1&r<2?2:r>2&r<5?1:0;i=r==3|r==5?2:r>0&r<3?1:0;r=h[s];if(c==62){if(r==0){h[s]=h[i];h[i]=0;}else{h[i]=-r;h[s]=0;}}if(c==60){if(r==0){h[s]=-h[i];h[i]=0;}else{h[i]=r;h[s]=0;}}}return o;}int r(int[] p){return p[0]>1?3:p[0]<-1?1:p[1]>1?0:p[1]<-1?5:p[2]>1?2:4;}

설명:

2 차원 좌표계를 사용했던 다른 답변들과 달리, 나는 3 차원 시스템을 사용하여 개미의 위치를 ​​추적했습니다.

방향은 또한 3D 방식으로 유지되어 측면 전환과 움직임을 용이하게합니다.

각면에는 좌표 중 하나 인 x, y 또는 z가 있으며, 어떤면인지를 나타 내기 위해 2 (또는 반대면의 경우 -2)로 설정되었습니다.

개미가 떨어지려고하는지 (포지션과 제목은 같지만 0이 아닌) 값을 확인하고 대각선으로 다음에 "떨어져"있는지 확인하고 제목이 아닌 것으로 변경하여면을 전환했습니다. -대각선. 놀라 울 정도로 쉬웠다.

터닝은 더 어려웠습니다. 항상 같은 방향으로 진행되도록하려면 각 문자의 검사 내부에 여분의 if-else 문이 필요하므로 많은 바이트가 필요합니다. 또한 "위"축과 "오른쪽"축은 각면에 하드 코딩되어 있어야합니다.

Ungolfed 코드

(방법의 명확성을 위해 이전 편집에서 변경되지 않음)

private static String[] sides="w,g,r,b,o,y".split(",");
public static String traverse(String commands)
{
  int[] heading = {0,0,1};
  int[] pos = {0,2,0};
  int[] newheading;
  int i;
  int saved;
  String out = "";
  for(char command:commands.toCharArray())
  {
     if(command=='^')
     {
        newheading=heading;
        saved=3;
        for(i=0;i<3;i++)
        {
           if(heading[i]==pos[i]&pos[i]!=0)
           {
              saved=determineSide(pos);
              if(saved==0)newheading[1]=-1;
              if(saved==1)newheading[0]=1;
              if(saved==2)newheading[2]=-1;
              if(saved==3)newheading[0]=-1;
              if(saved==4)newheading[2]=1;
              if(saved==5)newheading[1]=1;
              saved=i;
              break;
           }
        }
        i=0;
        for(int c:newheading)
        {
           pos[i++]+=c;
        }
        if(saved<3)heading[saved]=0;
        out+=sides[determineSide(pos)];
     }
     newheading=getPlane(determineSide(pos));
     if(command=='>')
     {
        saved=heading[newheading[0]];
        if(saved==0)
        {
           heading[newheading[0]]=heading[newheading[1]];
           heading[newheading[1]]=0;
        }
        else
        {
           heading[newheading[1]]=-saved;
           heading[newheading[0]]=0;
        }
     }
     if(command=='<')
     {
        saved=heading[newheading[0]];
        if(saved==0)
        {
           heading[newheading[0]]=-heading[newheading[1]];
           heading[newheading[1]]=0;
        }
        else
        {
           heading[newheading[1]]=saved;
           heading[newheading[0]]=0;
        }
     }
  }
  return out;
}
public static int determineSide(int[] pos)
{
  return pos[0]==2?3:pos[0]==-2?1:pos[1]==2?0:pos[1]==-2?5:pos[2]==2?2:4;
}
public static int[] getPlane(int side)
{
  int[] out=new int[2];
  out[0]=side==0|side==1?2:side==3|side==4?1:0;
  out[1]=side==3|side==5?2:side==1|side==2?1:0;
  //side==0?{2,0}:side==1?{2,1}:side==2?{0,1}:side==3?{1,2}:side==4?{1,0}:{0,2};
  return out;
}

1
아파요 .. 지금 골프를 해보겠다고 맹세합니다! :)
Matt

1
나는 이것이 1 년 전에 게시되었다는 것을 알고 있지만 골프에는 몇 가지 작은 것들이 있습니다 d[]={"w","g","r","b","o","y"}.-> "w,g,r,b,o,y".split(",")(-1 byte); 2x- '^'> 94(-2 바이트); 3x- ==0> <1(-3 바이트); 2x- ==1> <2(-2 바이트); 등을위한 ==2, ==3, ==4, ==5.
Kevin Cruijssen

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