Prowadź alfabet


20

Prowadź alfabet

Biorąc pod uwagę tablicę kierunków, gdzie kierunki są zdefiniowane w następujący sposób:

NW  N  NE
W   .   E
SW  S  SE

Lub jako indeksy (możesz użyć tych indeksów do wskazówek zamiast ciągów powyżej):

0 1 2
3 . 4
5 6 7

Możesz wybrać dowolny format, obsługa obu nie jest wymagana przez wyzwanie. Wygeneruj odpowiedni ciąg alfabetu, który reprezentuje narysowaną ścieżkę, zaczynając od A. Liczba kierunków nigdy nie przekroczy 25, co oznacza, że ​​nigdy nie może przejść Z, więc nie musisz radzić sobie z tym scenariuszem. Żadne inne formaty wejściowe nie będą akceptowane, chyba że wyjaśnisz, dlaczego te formaty nie działają z powodu ograniczeń językowych. Łatwiej to wytłumaczyć na podstawie wypracowanego przykładu.


Spójrzmy więc na szybki przykład:

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

Zawsze zaczynaj od A.

A

Idź na wschód do B.

A-B

Idź na południowy wschód do C.

A-B 
   \
    C

Idź na północ do D.

A-B D
   \|
    C

Wróć na południe do E, zastępując C.

A-B D
   \|
    E

Kontynuuj na południe przez 2 cykle do F i G.

A-B D
   \|
    E
    |
    F
    |
    G

Idź na północny zachód do H.

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

Idź na zachód do I.

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

Koniec na północ w punkcie J.

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

Ostateczną wartością, którą zwrócisz, jest odczytanie końcowego wykresu od lewej do prawej, od góry do dołu:

ABD
JE
IHF
G

Wynikające z:

ABDJEIHFG

To jest , wygrana o najniższej liczbie bajtów.



1
Czy możemy przyjąć jako dane wejściowe 7 odrębnych par wartości zamiast proponowanych wartości? na przykład zamiast 0 otrzymujemy [-1 -1] czy za 1 otrzymujemy [-1 0]?
rahnema1

@ rahnema1 nie, dane wejściowe są zgodne z opisem.
Magic Octopus Urn

Czy możemy zwrócić tablicę znaków zamiast łańcucha
Kritixi Lithos

2
Czy to możliwe, że możesz zwrócić przypadek testowy, w którym wartości kończą się na lewo od Atakiego, Aktóry nie będzie pierwszym wydrukowanym wynikiem?
Suever

Odpowiedzi:


6

MATL , 64 58 57 50 46 40 37 36 35 30 bajtów

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

Wypróbuj w MATL Online

Wyjaśnienie

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
Och wow! Myślałem, że Mendo to zrobiło! Ładny :). Zwykle wygrywa moje pytania matrycowe, dobrze widzieć kogoś innego używającego tego języka. Próbuję też nauczyć się nit.
Magic Octopus Urn

12

JavaScript (ES6), 108 107 94 87 bajtów

Oszczędność 13 bajtów dzięki Tytusowi!
Zaoszczędź jeszcze 7 bajtów, dzięki edc65!

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]));

Jak to działa

Formuła (d += d > 3) * 9 - d % 3 * 8 - 28przekłada wskazówki 0..7na następujące przesunięcia:

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

Używamy tych przesunięć, aby przenieść wskaźnik pdo jednowymiarowej tablicy ri pisać litery w wynikowych pozycjach.

Powtarzamy, [i = 9, ...a]a nie tylko apo to, aby wstawić literę początkową „a”. Bo zainicjować iaby 9w tym samym czasie, wprowadzamy specjalną offset 54 (w wyniku powyższej formuły d = 9). Po pierwszej iteracji, prówna 646 + 54 = 700, co pozostawia tylko tyle miejsca, aby obsługiwać do 25 ruchów do North-West: 25 * -28 = -700. Dlatego pjest inicjowany 646.

Następnie musimy tylko dołączyć do tablicy, aby uzyskać nasz ostatni ciąg. Niezdefiniowane wartości pomiędzy literami są po prostu ignorowane przez join().


d+=d>3,p+=d*9-d%3*8-28oszczędza 11 bajtów.
Tytus

@Titus Dzięki, miłe miejsce! (Mogę teraz zainicjować idefinicję tablicy, oszczędzając jeszcze 2 bajty)
Arnauld

Zgodnie z OP, że małe litery są dozwolone, być może możesz zapisać 7 bajtów, zaczynając od 9 i używając (++i).toString(36)(wciąż nie próbując zrozumieć swojej matematyki, ale wydaje się, że działa)
edc65

@ edc65 Cholera prawa. Dzięki!
Arnauld

5

Oktawa, 145 138 131 131 123 105 103 90 87 85 bajtów

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

Wypróbuj online

Dzięki Suever 2 bajty zapisane!

Poprzednia odpowiedź 103 bajtów:

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

Wypróbuj online!

Najpierw spróbuj 145 bajtów

@(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}

Kilka wyjaśnień

@(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
Uważam, że skoro potrzebujesz imagepakietu, część twojego bajtu musi być ładowaniem pakietu obrazupkg load image
Suever

Dzięki, nie trzeba ładować, jeśli pakiet jest poprawnie zainstalowany, możesz go przetestować w Octave Online
rahnema1

Wierzę, że to tylko dlatego, że Octave Online dzwoni pkg load *na początku. ideone.com może być lepszym wyborem
Suever

pakiet powinien zostać zainstalowany w ten sposób, pkg install -auto image-1.0.0.tar.gzaby mógł się automatycznie ładować. Zobacz instrukcję
rahnema1

Ok, więc może jest w porządku. Właśnie odchodziłem od tego, co tu wcześniej widziałem .
Suever

5

MATLAB, 87 85 bajtów

zaoszczędził 2 bajty dzięki Luisowi Mendo

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

'%&''?AYZ['-64niezła sztuczka ... właściwie 66 bajtów, jeśli przepisujesz oktawę
rahnema1

4

PHP, 93 bajty

Działa na jednej macierzy, takiej jak odpowiedź Kodosa Johnsona .
Ale to ma o wiele więcej pomysłów, które sam opublikowałem.

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

pobiera liczby z argumentów wiersza poleceń. Uruchom z -nr.

przesuwanie kursora

wstępne obliczenia:

$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

gra w golfa:

$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

scalenie przypisań niczego nie zapisuje, ale poprawia czytelność:

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

awaria

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

Python 2, 180 178 176 bajtów

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 bajtów

$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);

Działa to w wierszu polecenia z -rflagą i przyjmuje jako argument tablicę char (ciąg) indeksów.


Możesz zapisać 5 łatwych bajtów ""<$n=$argv[1][$i]zamiast($n=$argv[1][$i])!=null
Tytusa

1

R, 160 bajtów

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="")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.