Guida la tua tartaruga con una corda


17

Scrivere un programma o una funzione che includa una stringa a riga singola non vuota di caratteri ASCII stampabili escluso lo spazio:

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

Si può presumere che l'input sia valido.

Sulla base dell'input, disegna una nuova stringa disposta su una griglia testuale di spazi e newline seguendo le regole della grafica della tartaruga in cui la tartaruga occupa sempre uno spazio della griglia e può solo affrontare le direzioni cardinali.

Stampa il primo carattere nella stringa di input sulla griglia di testo. La tartaruga inizia qui rivolta a destra. Scorrere sul resto dei caratteri nella stringa di input (fermandosi solo se la tartaruga si blocca), ripetendo questo processo:

  1. Se i 4 spazi della griglia direttamente adiacenti alla tartaruga sono tutti riempiti (ovvero nessuno di essi è uno spazio), interrompere l'iterazione. La tartaruga è bloccata e la griglia è completa come può essere.

  2. Guarda il carattere corrente nell'input rispetto al carattere precedente:

    • Se il personaggio attuale è lessicale prima del precedente, ruota la tartaruga di un quarto di giro a sinistra.

    • Se il personaggio attuale è lessicale dopo il precedente, ruota la tartaruga di un quarto di giro a destra.

    • Se il personaggio attuale è uguale al precedente, non ruotare la tartaruga.

  3. Se lo spazio della griglia rivolto verso la tartaruga non è vuoto (ovvero non uno spazio), ruotare ripetutamente la tartaruga di un quarto di giro a sinistra fino a quando non si trova di fronte a uno spazio vuoto.

  4. Sposta la tartaruga di un passo avanti nella direzione in cui è rivolta e stampa il personaggio attuale sulla griglia nella nuova posizione della tartaruga.

Stampa o restituisce la stringa di griglia di testo risultante senza righe o colonne estranee di spazi bianchi. Le linee possono avere spazi finali fino alla colonna più a destra con un non spazio, ma non oltre. È consentita una singola riga finale finale.

Vince il codice più breve in byte.

Esempio

Ecco tutti i passaggi dell'input spattuuxze. I ^V<>caratteri mostrano la direzione della tartaruga sta affrontando, essi sono non parte della ingresso o uscita.

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

A questo punto la tartaruga è bloccata, quindi enon viene mai stampata e l'output finale è:

tuu
tzx
ap
 s

Di seguito è riportato un output simile ma non valido poiché ha una colonna iniziale non necessaria di spazi bianchi:

 tuu
 tzx
 ap
  s

Casi test

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

(Dimmi subito se qualcuno di questi sembra sbagliato.)



Penso che dovresti aggiungere il test case PONMLKJIHGFEDCBA, dato che il risultato non è solo un quadrato e contrasta ABCDEFGHIJKLMNOPper evidenziare l'asimmetria nelle regole.
Greg Martin,

Risposte:


1

Groovy (357 byte)

Non sono state utilizzate lib libere da tartaruga e nessuna tartaruga è stata danneggiata.

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

Provalo qui: https://groovyconsole.appspot.com/edit/5115774872059904


Tentativi precedenti

Groovy (397 byte)

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


3
Le risposte devono essere complete e valide. Elimina la tua risposta o finiscila. Inoltre, 30 minuti non sono molto lunghi. Ho passato ore a trovare risposte prima.
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;}

La funzione ottiene l'input come String e restituisce il risultato come String.

Internamente utilizza un array di caratteri 2D per archiviare le lettere e mantiene le colonne e le righe min e max utilizzate per restituire l'array secondario utilizzato.

Quindi, nel risultato String non ci sono colonne iniziali di spazi bianchi ma ci sono spazi bianchi finali fino alla colonna più a destra con un carattere non spaziale. Una nuova riga viene aggiunta alla fine.

Tutti i suggerimenti per giocare a golf sono i benvenuti :-)


Potresti essere in grado di fare un conteggio di byte più piccolo usando un carattere [] come input. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Inoltre, + 4% 4 = 0, correggimi se sbaglio lì ma rimuovendo quel +4 non dovrebbe cambiare il tuo codice.
Magic Octopus Urn,

1
@carusocomputing È vero che char [] come input salverebbe molti byte, ma non sono sicuro che ciò sia consentito dalla domanda. La domanda menziona una "stringa di input". Inoltre è richiesto +4 perché d che è la direzione deve essere delimitato tra 0 e 4. %è il resto in java e può essere negativo che non è desiderato. Grazie per i suggerimenti :-)
Master_ex,

Ah ... Buona cattura, errore da parte mia che gli input offerti da OP hanno coperto tutti gli scenari ... "LNOPFg1 #" lo rompe senza il +4. Mi dispiace, anche la lettura di quel codice mi ha richiesto un minuto.
Magic Octopus Urn,

0

Python3, 419 414 byte

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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.