Poprowadź swojego żółwia sznurkiem

17

Napisz program lub funkcję, która pobiera niepusty łańcuch jednowierszowy znaków drukowalnych ascii bez spacji:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Możesz założyć, że dane wejściowe są prawidłowe.

Na podstawie danych wejściowych narysuj nowy ciąg ułożony na siatce tekstowej spacji i znaków nowej linii zgodnie z żółtymi zasadami graficznymi , w których żółw zawsze zajmuje jedno pole siatki i może być skierowany tylko w kierunku kardynalnym.

Wydrukuj pierwszy znak w ciągu wejściowym do siatki tekstowej. Żółw zaczyna się tutaj w prawo. Iteruj po pozostałych znakach w ciągu wejściowym (zatrzymując się tylko, jeśli żółw utknie), powtarzając ten proces:

  1. Jeśli wszystkie 4 pola siatki bezpośrednio sąsiadujące z żółwiem są wypełnione (tzn. Żadne z nich nie jest spacją), przestań iterować. Żółw utknął, a siatka jest tak kompletna, jak to tylko możliwe.

  2. Spójrz na bieżący znak na wejściu w porównaniu do poprzedniego znaku:

    • Jeśli obecny znak jest leksykalny przed poprzednim, obróć żółwia o ćwierć obrotu w lewo.

    • Jeśli obecna postać jest leksykalna po poprzedniej, obróć żółwia o ćwierć obrotu w prawo.

    • Jeśli obecna postać jest równa poprzedniej, nie obracaj żółwia.

  3. Jeśli pole siatki, przed którym stoi żółw, nie jest puste (tj. Nie jest spacją), kilkakrotnie obróć żółwia o ćwierć obrotu w lewo, aż będzie ona zwrócona w stronę pustego pola siatki.

  4. Przesuń żółwia o jeden stopień do przodu w kierunku, w którym patrzy, i wydrukuj obecną postać na siatce w nowej lokalizacji żółwia.

Wydrukuj lub zwróć wynikowy ciąg siatki tekstowej bez zbędnych wierszy lub kolumn białych znaków. Linie mogą mieć końcowe spacje do kolumny znajdującej się najbardziej na prawo od spacji, ale nie dalej. Pojedynczy znak nowej linii jest opcjonalnie dozwolony.

Najkrótszy kod w bajtach wygrywa.

Przykład

Oto wszystkie etapy wprowadzania spattuuxze. Te ^V<>znaki pokazują kierunek żółwia jest skierowany, są one nie część wejścia lub wyjścia.

s>
^
p
s
<ap
  s
^
t
ap
 s
^
t
t
ap
 s
tu>
t
ap
 s
tuu>
t
ap
 s
tuu
t x
apV
 s
tuu
<zx
ap
 s

W tym momencie żółw utknął, więc e nigdy się nie drukuje, a końcowy wynik to:

tuu
tzx
ap
 s

Poniżej przedstawiono podobne, ale niepoprawne dane wyjściowe, ponieważ ma niepotrzebną wiodącą kolumnę białych znaków:

 tuu
 tzx
 ap
  s

Przypadki testowe

spattuuxze

tuu
tzx
ap
 s

spattuuxxze

tuu
t x
apx
 sze

1111111

1111111

ABCDEFGHIJKLMNOP

PEFG
ODAH
NCBI
MLKJ

`_^]\[ZYXWVUTSR

 ^_RS
\]`UT
[ZWV
 YX

Woo!

W
o
o!

woo!

!o
 o
 w

Wheeee

W
heeee

banana

  a
 an
an
b

Turtle

T
ure
 tl

turTle

  e
tTl
ur

(Powiedz mi od razu, jeśli któreś z nich wydają się nieprawidłowe).

Hobby Calvina
źródło
Myślę, że powinieneś dodać przypadek testowy PONMLKJIHGFEDCBA, ponieważ wynik nie jest tylko kwadratem i kontrastuje z ABCDEFGHIJKLMNOPcelem podkreślenia asymetrii w regułach.
Greg Martin

Odpowiedzi:

1

Groovy (357 bajtów)

Żadnych zewnętrznych libów żółwiowych nie użyto i żadnego żółwia nie skrzywdzono.

R={s->s[0]?[0,-1*s[0]]:[s[1],0]}
L={s->s[0]?[0,s[0]]:[-1*s[1],0]}
def y(s){l=s.length()*2;z(new String[l][l],[l/4,l/4],s,null,[0,1])}
def z(g,l,w,p,h){if(w.length() && !g[(int)(l[0]+h[0])][(int)(l[1]+h[1])]){c=w.getAt(0);w=w.substring(1);if(p && p<c){h=R(h)}else if(p>c){h=L(h)};g[(int)l[0]+h[0]][(int)l[1]+h[1]]=c;z(g,[l[0]+h[0],l[1]+h[1]],w,c,h)}else{g}}

Wypróbuj tutaj: https://groovyconsole.appspot.com/edit/5115774872059904


Poprzednie próby

Groovy (397 bajtów)

rotR={s->s[0]!=0?[0,-1*s[0]]:[s[1],0]}
rotL={s->s[0]!=0?[0,s[0]]:[-1*s[1],0]}
def y(s){z(new String[s.length()][s.length()],[s.length()/2,s.length()/2],s,null,[0,1])}
def z(g,l,w,p,h){if(w.length() && !g[(int)(l[0]+h[0])][(int)(l[1]+h[1])]){c=w.getAt(0);w=w.substring(1);if(p && p<c){h=rotR(h)}else if(p > c){h=rotL(h)};g[(int)l[0]+h[0]][(int)l[1]+h[1]]=c;z(g,[l[0]+h[0],l[1]+h[1]],w,c,h)}else{g}}

https://groovyconsole.appspot.com/script/5179465747398656

Urna Magicznej Ośmiornicy
źródło
3
Odpowiedzi muszą być kompletne i prawidłowe. Usuń swoją odpowiedź lub ją zakończ. Ponadto 30 minut nie jest bardzo długie. Wcześniej spędziłem godziny na odpowiedziach.
mbomb007,
0

Java, 408 406 bajtów

String f(String I){int l=I.length(),x=l,y=x,z=x,t=y,Z=x,T=y,d=1,i=1,a;char[][]g=new char[l*2][l*2];int[]D={-1,0,1,0};for(char c,p=g[x][y]=I.charAt(0);i<l;p=c){c=I.charAt(i++);d=((c<p?d-1:c>p?d+1:d)+4)%4;for(a=0;g[x+D[d]][y+D[3-d]]>0&&a++<4;)d=(d+3)%4;if(a>3)break;g[x+=D[d]][y+=D[3-d]]=c;z=z<x?z:x;Z=Z>x?Z:x;t=t<y?t:y;T=T>y?T:y;}for(I="";z<=Z;z++,I+="\n")for(a=t;a<=T;a++)I+=g[z][a]<1?32:g[z][a];return I;}

Funkcja pobiera dane wejściowe jako ciąg znaków i zwraca wynik jako ciąg znaków.

Wewnętrznie wykorzystuje tablicę znaków 2D do przechowywania liter i zachowuje min. I maks. Kolumny i wiersze używane w celu zwrócenia użytej pod-macierzy.

Tak więc w wyniku String nie ma wiodących kolumn białych spacji, ale są końcowe białe spacje aż do prawej kolumny z charakterem spacji. Na końcu dodawana jest nowa linia.

Wszelkie sugestie dotyczące gry w golfa są mile widziane :-)

Master_ex
źródło
Możesz być w stanie wykonać mniejszą liczbę bajtów używając char [] jako danych wejściowych. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Ponadto, + 4% 4 = 0, popraw mnie, jeśli się mylę, ale usunięcie tego +4 nie powinno się zmienić Twój kod.
Magic Octopus Urn
1
@carusocomputing To prawda, że ​​char [] jako dane wejściowe zaoszczędziłoby wiele bajtów, ale nie jestem pewien, czy pytanie na to pozwala. Pytanie wspomina o „ciągu wejściowym”. Wymagany jest również +4, ponieważ d, który jest kierunkiem, musi być ograniczony od 0 do 4. %jest resztą w java i może być ujemny, co nie jest pożądane. Dzięki za sugestie :-)
Master_ex,
Ach ... Dobry haczyk, błędem z mojej strony jest to, że dane wejściowe oferowane przez OP obejmowały wszystkie scenariusze ... „LNOPFg1 #” łamie go bez +4. Przepraszam, nawet czytanie tego kodu zajęło mi minutę.
Magic Octopus Urn
0

Python3, 419 414 bajtów

Z=input();l=r=c=M=R=C=N=len(Z);t=(r*2)+1;A=[0]*t;J=range
for i in J(t):A[i]=[" "]*t
A[r][c]=Z[0];i=1;Q=[1,0,-1,0];d=q=0
while i<l:
 if Z[i]<Z[i-1]:d+=3
 elif Z[i]>Z[i-1]:d+=1
 while A[r+Q[(d-1)%4]][c+Q[d%4]]!=" "and q<4:d+=3;q+=1
 if q>3:break
 r+=Q[(d-1)%4];c+=Q[d%4];R=min(R,r);C=min(C,c);M=max(M,r);N=max(N,c);A[r][c]=Z[i];i+=1;q=0
for i in J(R,M+1):
 for j in J(C,N+1):print(A[i][j],end="")
 print()
Jodła
źródło