알파벳 안내


20

알파벳 안내

길 찾기 배열이 주어지면 길 찾기가 다음과 같이 정의됩니다.

NW  N  NE
W   .   E
SW  S  SE

또는 색인으로 사용하십시오 (위의 문자열 대신이 색인을 지시에 사용할 수 있습니다).

0 1 2
3 . 4
5 6 7

챌린지에서 두 가지를 모두 지원할 필요는 없습니다. A로 시작하여 그려진 경로를 나타내는 해당 알파벳 문자열을 생성합니다. 길 찾기의 수는 25를 초과 할 수 없으므로 절대로 지나갈 수 없으므로이 Z시나리오를 처리 할 필요가 없습니다. 언어 제한으로 인해 이러한 형식이 작동하지 않는 이유를 설명 할 수 없으면 다른 입력 형식은 허용되지 않습니다. 자세한 예제를 사용하면 쉽게 설명 할 수 있습니다.


따라서 간단한 예를 살펴 보겠습니다.

[E,SE,N,S,S,S,NW,W,N] or [4,7,1,6,6,6,0,3,1]

항상 A로 시작하십시오.

A

동쪽으로 B로 이동

A-B

동남쪽으로 이동 C.

A-B 
   \
    C

북쪽으로 D로 가십시오.

A-B D
   \|
    C

C를 덮어 쓰고 남쪽으로 이동

A-B D
   \|
    E

F와 G 모두 2주기 동안 남쪽으로 계속하십시오

A-B D
   \|
    E
    |
    F
    |
    G

노스 웨스트에서 H로 가십시오.

A-B D
   \|
    E
    |
  H F
   \|
    G

서쪽으로 나

A-B D
   \|
    E
    |
I-H F
   \|
    G

J 지점에서 북쪽으로 끝납니다.

A-B D
   \|
J   E
|   |
I-H F
   \|
    G

최종 값은 왼쪽에서 오른쪽, 위에서 아래로 읽는 것입니다.

ABD
JE
IHF
G

를 야기하는:

ABDJEIHFG

이것은 , 가장 낮은 바이트 수의 승리입니다.



1
제안 된 값 대신 7 개의 고유 한 값 쌍을 입력으로 사용할 수 있습니까? 예를 들어 0 대신에 [-1 -1]을 얻거나 1에 대해 [-1 0]을 얻습니까?
rahnema1 2012 년

@ rahnema1 아니오, 입력은 설명과 같습니다.
Magic Octopus Urn

문자열 대신 문자 배열을 반환 할 수 있습니까?
Kritixi Lithos

2
이 값이에 결국 어디 테스트 케이스를 반환 할 가능성이 왼쪽A같은 A첫 번째 결과가 인쇄되지 않습니다?
Suever

답변:


6

MATL , 64 58 57 50 46 40 37 36 35 30 바이트

O'!":<TUV '59-G)hYsIH$6#u64+c!

MATL Online 에서 사용해보십시오

설명

O           % Push the number 0 to the stack
'!":<TUV '  % String literal
59-         % Converts this string literal into [-26 -25 -1 1 25 26 27 -27]. These
            % are deltas for the linear indexes into the matrix corresponding to each
            % of the directions. Note that the -27 is at the end since a 0 index wraps
            % around to the end
i)          % Grab the input and use it to index into the delta array 
h           % Horizontally concatenate this with the 0 (our starting point)
Ys          % Take the cumulative sum to get the absolute linear index (location) of
            % each successive letter
IH$6#u      % Find the index of the last (sorted) occurrence of each location
64+         % Add 64 to this index to create ASCII codes
c!          % Convert to character, transpose, and display

1
오 와우! 나는 Mendo가 이것을했다고 생각했다! 좋은 :). 보통 그는 내 매트릭스 질문에서 이기고, 다른 사람이이 언어를 사용하는 것을 보게되어 기쁘다. 나는 니트도하려고합니다.
Magic Octopus Urn

12

자바 스크립트 (ES6) 108 107 94 87 바이트

Titus 덕분에 무려 13 바이트를 절약했습니다!
edc65 덕분에 7 바이트 더 절약되었습니다!

let f =

a=>[i=9,...a].map(d=>r[p+=(d+=d>3)*9-d%3*8-28]=(++i).toString(36),r=[],p=646)&&r.join``

console.log(f([4,7,1,6,6,6,0,3,1]));

작동 원리

이 수식 (d += d > 3) * 9 - d % 3 * 8 - 28은 방향 0..7을 다음 오프셋 으로 변환합니다 .

0   1   2       -28 -27 -26
3   x   4  -->   -1  x   +1
5   6   7       +26 +27 +28

이 오프셋을 사용하여 포인터 p를 1 차원 배열로 이동 r하고 결과 위치에 문자를 씁니다.

시작 문자 'a'를 삽입하기 위해서가 [i = 9, ...a]아니라 반복합니다 a. 우리 는 동시에 초기화 i하기 때문에 954의 특수 오프셋 (위의 공식 결과 d = 9)을 소개합니다. 첫 번째 반복 후 pequals 646 + 54 = 700는 북서쪽으로 최대 25 개의 이동을 지원하기에 충분한 공간을 남겨 둡니다 25 * -28 = -700. 이것이 p로 초기화되는 이유 입니다 646.

그런 다음 배열을 결합하여 최종 문자열을 가져와야합니다. 문자 사이에 정의되지 않은 값은 단순히 무시됩니다 join().


d+=d>3,p+=d*9-d%3*8-2811 바이트를 절약합니다.
Titus

@Titus 감사합니다, 좋은 자리! (이제 i배열 정의에서 초기화 하여 2 바이트를 더 절약 할 수 있음 )
Arnauld

영업 이익은 지정된대로 그 소는 어쩌면 당신은 7 바이트 (9)에서 시작하여 저장할 수 있습니다 허용됩니다 (++i).toString(36)(여전히 수학을 이해하려고 노력하지,하지만 작동하는 것 같다)
edc65

@ edc65 젠장. 감사!
Arnauld

5

옥타브 145 138 131 123 105 103 90 87 85 바이트

@(a){[~,k]=unique(cumsum([1 fix((z=a+(a>3))/3);1 mod(z,3)]'-1),'rows');[k'+64 '']}{2}

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

Suever 덕분에 2 바이트가 절약되었습니다!

이전 답변 103 바이트 :

@(a)[nonzeros(accumarray(cumsum([1 fix((z=a+(a>3))/3);1 mod(z,3)]'-1)+30,65:nnz(++a)+65,[],@max)')' '']

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

먼저 145 바이트 시도

@(a){[x y]=find(~impad(1,1,1));c=cumsum([0 0;([y x]-2)(++a,:)]);c=c-min(c)+1;n=nnz(a);[nonzeros(sparse(c(:,1),c(:,2),65:n+65,'unique')')' '']}{5}

일부 설명

@(a){
    [x y]=find([1 0 1]|[1;0;1]);                            %generate 2d coordinates corresponding to 1d input indices
    XY = [y x]-2;
    c=cumsum([0 0;XY(++a,:)]);                              %cumulative sum of coordinates to find position of characters
    c=c-min(c)+1;n=nnz(a);
    [nonzeros(sparse(c(:,1),c(:,2),65:n+65,'unique')')' ''] %using sparse matrix to place characters at specified positions
    }{5}

1
나는 당신이 필요로하기 때문에 믿고 image당신의 bytecount가의 패키지 부분은 이미지 패키지로드되어야합니다pkg load image
Suever

감사합니다. 패키지가 제대로 설치되어 있으면로드 할 필요가 없습니다. Octave Online
rahnema1

옥타브 온라인 (Octave Online pkg load *)이 처음에 전화하기 때문이라고 생각합니다 . ideone.com이 더 나은 선택 일 수 있습니다
Suever

패키지는 이런 식으로 설치해야 pkg install -auto image-1.0.0.tar.gz자동으로로드 할 수 있습니다 매뉴얼을 참조하십시오
rahnema1

그럼 괜찮을지도 몰라 방금 전에 본 것에서 벗어 났습니다 .
Suever

5

MATLAB, 87 85 바이트

Luis Mendo 덕분에 2 바이트 절약

function a=f(s);i='()*BD\]^'-67;[~,a]=unique([0 cumsum(i(s+1))],'last');a=[a'+64,''];

'%&''?AYZ['-64멋진 트릭 ... 옥타브로 다시
쓰면

4

PHP, 93 바이트

Kodos Johnson의 답변 과 같은 단일 어레이에서 작동합니다 .
그러나 이것은 내가 더 많은 아이디어를 내 자신에 게시했습니다.

for($r=[$c=A];""<$d=$argv[++$i];)$r[$p+=($d+=$d>3)*9-$d%3*8-28]=++$c;ksort($r);echo join($r);

명령 행 인수에서 숫자를 가져옵니다. 로 실행하십시오 -nr.

커서 이동

초기 계산 :

$d+=$d>3;           // if $d>3, add 1
$p+= ($d/3-1|0)*26  // add/subtract 26 for line change
    +$d%3-1;        // add/substract 1 for column change

골프 :

$d+=$d>3;$p+=($d/3-1|0)*27+$d%3-1;          // +0: multiple of 3 instead of 26
$d+=$d>3;$p+=($d/3|0)*27-27+$d%3-1;         // +1: distribute `line-1`
$d+=$d>3;$p+=($d/3)*27-$d%3/3*27-27+$d%3-1; // +8: distribute `|0`
$d+=$d>3;$p+=$d*9-$d%3*9-27+$d%3-1;         // -8: `/3*27` -> `*9`
$d+=$d>3;$p+=$d*9-$d%3*8-28;                // -7: combine duplicates

할당을 병합하면 아무것도 저장되지 않지만 가독성이 향상됩니다.

for(init;input loop;$p=$d...)$d+=$d>3;
for(init;input loop;)$p=($d+=$d>3)...;

고장

for($r=[$c=A];                  // init result, init letter
    ""<$d=$argv[++$i];)         // loop through command line arguments
    $r[
        $p+=($d+=$d>3)*9-$d%3*8-28  // move cursor
    ]=++$c;                         // increment letter, plot
ksort($r);                      // sort result by index
echo join($r);                  // print result

3

파이썬 (2), 180 (178) 176 바이트

def f(d,a=[[""]*26 for _ in[1]*26],x=0,y=0,j=66):
 a[0][0]="A"
 for i in d:y+=(i>4)-(i<3);x+=(`i`in'247')-(`i`in'035');a[y][x]=chr(j);j+=1
 return"".join("".join(i)for i in a)

2

PHP, 121 바이트

$r[0]=chr(65);for(;($n=$argv[1][$i])!=null;)$r[$c+=[-27,-26,-25,-1,1,25,26,27][$n]]=chr($i+++66);ksort($r);echo join($r);

이것은 -r플래그와 함께 명령 행에서 실행되며 인덱스로 구성된 문자 배열 (문자열)을 인수로 사용합니다.


당신과 함께 5 쉽게 바이트를 저장할 수 있습니다 ""<$n=$argv[1][$i]대신($n=$argv[1][$i])!=null

1

R, 160 바이트

a=scan()
e=f=26
x=matrix(0,51,51)
x[e,f]="A"
for(i in a){g=function(q)grepl(q,i)
T=T+1
f=f-g("N")+g("S")
e=e-g("W")+g("E")
x[e,f]=LETTERS[T]}
cat(x[x>0],sep="")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.