알파벳 안내


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.