주사위 굴리기


16

주사위 굴리기

그래서 나는 얼마 전에 주사위를 굴려 도전을 생각했습니다.

입력에서 얻은 그물과 이동 목록이있는 큐브가 주어지면 끝에있는 바닥에서 사각형을 찾으십시오.

큐브 맵

이 이미지를 예제로 사용하겠습니다.

입력

당신은 움직임의 목록과 문자열을합니다. 문자열에는 대문자 ASCII 문자 N, S, W 및 E 만 포함됩니다. 이는 큐브를 한 단계 씩 해당 방향으로 롤링하는 것과 같습니다.

그림에서 하나의 N은 밑면을 6으로 만듭니다.이 이미지에서 북쪽은 카메라에서 멀고 남쪽은 향해 있고 동쪽은 오른쪽이며 서쪽은 왼쪽입니다.

1P 2P 3P 4P 5P 6P 형식의 문자열도 사용합니다. 여기서 각 P는 N, S, W, E, T 및 B의 위치입니다. T & B는 아래쪽과 위쪽입니다.

숫자는 그 숫자의 얼굴이고 문자는 얼굴이있는 위치를 나타냅니다. 명확하지 않은 경우, 그물은 항상 숫자로 정렬되므로 1P 2P 3P 4P 5P 6P, 절대 2B 1T 3N 4S 5W 6E.

이미지의 위치는 1S 2B 3E 4W 5T 6N입니다.

산출

프로그램은 하단을 나타내는 숫자를 출력해야합니다.

테스트 사례

(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4

다른 규칙

또한 큐브가 무한한 평면에 있다고 가정 할 수 있습니다.

찾을 수 없지만 표준 허점은 허용되지 않습니다.

유효하지 않은 입력의 경우, 코드는 묵시록 시작을 제외한 모든 작업을 수행 할 수 있습니다.

이 프로그램은 내 주사위에 맞아야하므로 가능한 작아야합니다. Folders 와 같은 언어의 경우를 제외하고 바이트 단위로 계산 합니다.


2
첫 번째 테스트 사례는 (nothing) -> 2그물이 제공되지 않았거나 어딘가에 그물이 있어야 함을 의미합니까?
Sp3000

2
" 그림에서, 하나의 N은 밑면을 2로 만들 것 "은 밑면이 이미 2가 아닙니까?
paulvs December

@ Sp3000, 편집, 그물을 제공해야하지만 코드는 이동 명령을 처리 할 수 ​​없습니다.
Rɪᴋᴇʀ

1
주사위의 크기를 바이트 단위로 측정합니까?
Cyoce

@Cyoce 아니요, 각 얼굴의 텍스트 만. 따라서 🍄이있는 얼굴은 4 바이트입니다. 이 도전을 위해, 나는 당신이 내 주사위에 쓴 코드에 맞출 수 있기를 원합니다. 이를 위해서는 작은 코드가 필요합니다.
Rɪᴋᴇʀ

답변:


8

CJam, 43 40 37 34 바이트

6 바이트 절약에 도움을 준 Dennis에게 감사합니다.

lW%3/$1f=q{i8%"ÉĔɠƂ!"=i\m!=}/c

여기에서 테스트하십시오.

설명

lW%    e# Read the first line and reverse it.
S/     e# Split it around spaces.
$      e# Sort it. This puts the faces in order [B E N S T W].
1f=    e# Select the second character from each face, which is the number.
q      e# Read the remainder of the input (the instructions).
{      e# For each instruction...
  i8%  e#   Convert the character (NWSE) to an integer and take modulo 8.
  "ÉĔɠƂ!"=i
       e#   Use that to (cyclically) index this string and convert *that* character
       e#   to an integer.
  \    e#   Swap with the list of faces.
  m!   e#   Generate all permutations of the faces.
  =    e#   Select the permutation corresponding to the above integer.
}/     e# At the end of the loop, the bottom face will be the first character.
c      e# Convert the string to a character, which discards everything but the bottom face.

순열에 명령 문자를 매핑하는 방법은 다음과 같습니다.

   i   8%  5%  ""=   i   [0 1 2 3 4 5]m!=

N  78   6   1   Ĕ   276  [2 1 4 0 3 5]
W  87   7   2   ɠ   608  [5 0 2 3 1 4]
S  83   3   3   Ƃ   386  [3 1 0 4 2 5]
E  69   5   0   É   201  [1 4 2 3 5 0]

5%문자열에 대한 순환 색인 작성이 암시 적으로 수행하기 때문에 열을 포함 시켰습니다 . 4 개의 순열의 경우 각각의 두 변이 (대향) 변하지 않고 다른 4 개의 순열을 순열시키는 것을 볼 수 있습니다.


순열을 유니 코드 문자로 어떻게 표현합니까? Ĕ는 N [2 1 4 0 3 5]의 순열을 어떻게 표현합니까? 나는 몇 시간 동안 그것을 쳐다보고있다.
paulvs

1
@paulvs의 문자 코드는 Ĕ입니다 276. 6e!모든 720 순열 목록을 제공합니다 [0 1 2 3 4 5]. 그리고 그 목록에서 276색인 [2 1 4 0 3 5]이됩니다.
Martin Ender

더 많은 사람들이 대답하기를 바랐지만 당신은 가장 짧았습니다. 축하합니다.
Rɪᴋᴇʀ

5

166 158 154 144 139 135 134 132 116 바이트

+1 포함 -p

s/(\d)(.)/$h{$2}=$1/eg;$N='NTSB',$S='STNB',$E='ETWB',$W='WTEB';map{@h{@l}=@h{(@l=$$_=~/./g)[1..3,0]}}/\w/g;$_=$h{B}

의견 :

                                    # example input: "NS, 1S 2B 3E 4W 5T 6N"
s/(\d)(.)/$h{$2}=$1/eg;             # construct %h ( S=>1, B=>2, E=>3, W=>4, B=>2, N=>6 )

                                    # = Transformations =
$N='NTSB',                          # N becomes T, T becomes S, S becomes B, B becomes N
$S='STNB',
$E='ETWB',
$W='WTEB';

map {                               # iterate the moves "NS"
    @h{ @l } =                      # LHS: bulk-assign new values; @l defined in RHS
      @h{                           # RHS: init @l, transform
          (@l=$$_=~/./g)            # get transform, put ('N','T','S','B') in @l for LHS
          [1..3,0]                  # construct a rotated slice for RHS
    }    
} /\w/g;                            # match the movements in list context

$_=$h{B}                            # assign the bottom face to output.


입력 파일:

, 1S 2B 3E 4W 5T 6N
N, 1S 2B 3E 4W 5T 6N
NS, 1S 2B 3E 4W 5T 6N
NWS, 1S 2B 3E 4W 5T 6N
NWSNWS, 1S 2B 3E 4W 5T 6N
NWSS, 1S 2B 3E 4W 5T 6N
NNNNNN, 1S 2B 3E 4W 5T 6N
SNWEEWS, 1N 2T 3E 4W 5B 6S
SNEEWS, 1N 2T 3W 4S 5B 6E

로 실행

perl -p dice.pl < input.txt

산출: 262223564


  • 업데이트 158$N, $S, $E, $W 전역 변수를 사용하는 대신 %t = {N=>, S=>, E=>, $W=>}8 바이트 를 절약합니다.

  • 업데이트 154 프로그램이 숫자를 출력해야하므로 개행을 인쇄하지 않으면 print "$h{B}\n"4 바이트가 절약 print $h{B}됩니다.

  • 144를 업데이트 하여 10 바이트 저장

    ($s)=/^(\w+),/;            s/(\d)(.)/$h{$2}=$1/eg;
    

    대신에

    ($s,@i)=split /,? |\n/;    %h=reverse map{split//}@i;
    
  • update 139 명령의 정규식을 끝까지 이동하여 변수를 제거하고 6 바이트를 절약하십시오.

  • (135) 업데이트 에 저장 4 바이트를 @l[0..3,0]대신 @l[1..3],$l[0].

  • 업데이트 134 할당 @l=split//,$$_을 값 으로 사용하여 1 바이트를 저장하십시오 .

  • 업데이트 132/^\w+/ && $& 대신 2 바이트를 저장하십시오 /^(\w+)/ && $1.

  • update 129 인쇄를 위해 $ _ -p대신에 대신 사용하여 3 바이트를 저장하십시오 -n.

  • 업데이트 116 에 다시 쓰면 13 바이트를 절약 split//, /^\w+/ && $&할 수 /^\w+/g있습니다.



4

파이썬 2, 204 바이트

내 자신의 질문에 대답 할 시간이라고 생각했다.

def x(p,m):
    d={p[3*i-2]:i for i in range(1,7)}
    for j in m:n=2if j in'NE'else-2;x='BSTN'if j in'NS'else'BETW';d[x[0]],d[x[1]],d[x[2]],d[x[3]]=d[x[1+n]],d[x[(2+n)%4]],d[x[(3+n)%4]],d[x[0+n]]
    print d['B']

매우 짧지는 않지만 작동합니다.

다음으로 실행 :

x('1B 2T 3N 4S 5W 6E','SNEEWS')
#Output: 4

편집 : 카운트 바이트가 잘못되었습니다. 이제 더 이상 :(


BTW, 파이썬 매크로에 대한 xnor 감사합니다.
Rɪᴋᴇʀ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.