Führe deine Schildkröte an einer Schnur

17

Schreiben Sie ein Programm oder eine Funktion, die eine nicht leere einzeilige Zeichenfolge aus druckbaren ASCII- Zeichen ohne Leerzeichen enthält:

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

Sie können davon ausgehen, dass die Eingabe gültig ist.

Basierend auf der Eingabe, eine neue Zeichenfolge zeichnet auf einem textuellen Raster von Räumen angeordnet ist und neue Zeilen folgenden Schildkröte Grafiken -esque Regeln in dem die Schildkröte immer einen Gitterraum einnimmt und nur die vier Himmelsrichtungen stellen kann.

Geben Sie das erste Zeichen der Eingabezeichenfolge in das Textraster ein. Die Schildkröte beginnt hier nach rechts. Iteriere über den Rest der Zeichen in der Eingabezeichenfolge (stoppe nur, wenn die Schildkröte stecken bleibt) und wiederhole diesen Vorgang:

  1. Wenn die 4 Gitterfelder direkt neben der Schildkröte alle gefüllt sind (dh keines von ihnen ist ein Feld), beenden Sie die Iteration. Die Schildkröte steckt fest und das Gitter ist so vollständig wie möglich.

  2. Sehen Sie sich das aktuelle Zeichen in der Eingabe im Vergleich zum vorherigen Zeichen an:

    • Wenn das aktuelle Zeichen lexikalisch vor dem vorherigen steht, drehen Sie die Schildkröte eine viertel Umdrehung nach links.

    • Wenn das aktuelle Zeichen lexikalisch nach dem vorherigen ist, drehen Sie die Schildkröte um eine Vierteldrehung nach rechts.

    • Wenn das aktuelle Zeichen mit dem vorherigen übereinstimmt, drehen Sie die Schildkröte nicht.

  3. Wenn das Gitterfeld, dem die Schildkröte jetzt zugewandt ist, nicht leer ist (dh kein Feld), drehen Sie die Schildkröte wiederholt eine Vierteldrehung nach links, bis sie einem leeren Gitterfeld zugewandt ist.

  4. Bewegen Sie die Schildkröte einen Rasterschritt vorwärts in die Richtung, in die sie blickt, und drucken Sie das aktuelle Zeichen auf dem Raster an der neuen Position der Schildkröte.

Die resultierende Textrasterzeichenfolge ohne überflüssige Zeilen oder Spalten mit Leerzeichen drucken oder zurückgeben. Zeilen können nachgestellte Leerzeichen bis zur äußersten rechten Spalte mit einem Nicht-Leerzeichen enthalten, jedoch nicht darüber hinaus. Eine einzelne nachgestellte Zeile ist optional zulässig.

Der kürzeste Code in Bytes gewinnt.

Beispiel

Hier sind alle Schritte der Eingabe spattuuxze. Die ^V<>Zeichen geben die Richtung an, in die die Schildkröte blickt. Sie sind nicht Teil der Eingabe oder Ausgabe.

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

Zu diesem Zeitpunkt steckt die Schildkröte fest, sodass sie enie gedruckt wird und die endgültige Ausgabe lautet:

tuu
tzx
ap
 s

Das Folgende ist eine ähnliche, aber ungültige Ausgabe, da sie eine unnötig führende Spalte mit Leerzeichen enthält:

 tuu
 tzx
 ap
  s

Testfälle

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

(Sagen Sie mir bitte sofort, ob einer dieser Fehler vorliegt.)

Calvins Hobbys
quelle
Ich denke, Sie sollten den Testfall hinzufügen PONMLKJIHGFEDCBA, da das Ergebnis nicht nur ein Quadrat ist und im Gegensatz ABCDEFGHIJKLMNOPdazu die Asymmetrie in den Regeln hervorhebt.
Greg Martin

Antworten:

1

Groovy (357 Bytes)

Es wurden keine externen Schildkrötenbibliotheken verwendet und es wurden keine Schildkröten verletzt.

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

Versuchen Sie es hier: https://groovyconsole.appspot.com/edit/5115774872059904


Frühere Versuche

Groovy (397 Bytes)

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

Magische Kraken-Urne
quelle
3
Die Antworten müssen vollständig und gültig sein. Bitte löschen Sie Ihre Antwort oder beenden Sie sie. Außerdem sind 30 Minuten nicht sehr lang. Ich habe mich schon stundenlang mit Antworten beschäftigt.
mbomb007
0

Java, 408 - 406 Byte

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;}

Die Funktion erhält die Eingabe als String und gibt das Ergebnis als String zurück.

Intern verwendet es ein 2D-Zeichen-Array zum Speichern der Buchstaben und behält die verwendeten Min- und Max-Spalten und -Zeilen bei, um das verwendete Sub-Array zurückzugeben.

In der Ergebniszeichenfolge gibt es also keine führenden Spalten mit Leerzeichen, sondern nachgestellte Leerzeichen bis zur äußersten rechten Spalte mit einem Nicht-Leerzeichen-Zeichen. Am Ende wird eine neue Zeile hinzugefügt.

Anregungen zum Golfspielen sind willkommen :-)

Master_ex
quelle
Möglicherweise können Sie mit char [] als Eingabe eine kleinere Bytezahl festlegen. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Auch, + 4% 4 = 0, korrigieren Sie mich, wenn ich falsch liege, aber das Entfernen von +4 sollte sich nicht ändern dein Code.
Magic Octopus Urn
1
@carusocomputing Es ist wahr, dass char [] als Eingabe viele Bytes einspart, aber ich bin mir nicht sicher, ob die Frage dies zulässt. In der Frage wird eine "Eingabezeichenfolge" erwähnt. Außerdem ist +4 erforderlich, da d, das die Richtung ist, die zwischen 0 und 4 begrenzt werden muss, %der Rest in Java ist und negativ sein kann, was nicht erwünscht ist. Danke für die Vorschläge :-)
Master_ex
Ah ... Guter Fang, mein Fehler ist, dass die von OP angebotenen Eingaben alle Szenarien abdeckten ... "LNOPFg1 #" bricht es ohne die +4. Entschuldigung, selbst das Lesen dieses Codes hat eine Minute gedauert.
Magic Octopus Urn
0

Python3, 419 414 Bytes

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()
Jodler
quelle