Menez votre tortue par une chaîne

17

Écrivez un programme ou une fonction qui accepte une chaîne non vide de caractères ascii imprimables, sans espace:

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

Vous pouvez supposer que l'entrée est valide.

Sur la base de l'entrée, dessinez une nouvelle chaîne disposée sur une grille textuelle d'espaces et de nouvelles lignes suivant les règles graphiques de la tortue où la tortue occupe toujours un espace de grille et ne peut faire face qu'aux directions cardinales.

Imprimez le premier caractère de la chaîne d'entrée dans la grille de texte. La tortue commence ici face à droite. Itérer sur le reste des caractères de la chaîne d'entrée (arrêt uniquement si la tortue est coincée), en répétant ce processus:

  1. Si les 4 espaces de grille directement voisins de la tortue sont tous remplis (c'est-à-dire qu'aucun d'entre eux n'est un espace), arrêtez d'itérer. La tortue est coincée et la grille est aussi complète que possible.

  2. Regardez le caractère actuel dans l'entrée par rapport au caractère précédent:

    • Si le personnage actuel est lexicalement avant le précédent, tournez la tortue d'un quart de tour à gauche.

    • Si le personnage actuel est lexicalement après le précédent, tournez la tortue d'un quart de tour à droite.

    • Si le caractère actuel est égal au précédent, ne faites pas tourner la tortue.

  3. Si l'espace de grille auquel la tortue fait face n'est pas vide (c'est-à-dire pas un espace), tournez la tortue de façon répétée d'un quart de tour vers la gauche jusqu'à ce qu'elle soit face à un espace de grille vide.

  4. Déplacez la tortue d'un pas de grille vers l'avant dans la direction dans laquelle elle se trouve et imprimez le personnage actuel sur la grille dans le nouvel emplacement de la tortue.

Imprimez ou renvoyez la chaîne de grille de texte résultante sans lignes ou colonnes superflues superflues. Les lignes peuvent avoir des espaces de fin jusqu'à la colonne la plus à droite avec un non-espace, mais pas au-delà. Une seule nouvelle ligne de fin est éventuellement autorisée.

Le code le plus court en octets gagne.

Exemple

Voici toutes les étapes de l'entrée spattuuxze. Les ^V<>caractères indiquent la direction dans laquelle la tortue fait face, ils ne font pas partie de l'entrée ou de la sortie.

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

À ce stade, la tortue est bloquée, elle n'est donc ejamais imprimée et le résultat final est:

tuu
tzx
ap
 s

Ce qui suit est une sortie similaire mais non valide car elle a une première colonne inutile d'espaces blancs:

 tuu
 tzx
 ap
  s

Cas de 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

(Dites-moi tout de suite si l'un de ces éléments semble incorrect.)

Loisirs de Calvin
la source
Je pense que vous devriez ajouter le cas de test PONMLKJIHGFEDCBA, car le résultat n'est pas juste un carré et contraste avec ABCDEFGHIJKLMNOPpour mettre en évidence l'asymétrie dans les règles.
Greg Martin

Réponses:

1

Groovy (357 octets)

Aucune bibliothèque externe de tortues n'a été utilisée et aucune tortue n'a été blessée.

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

Essayez-le ici: https://groovyconsole.appspot.com/edit/5115774872059904


Tentatives précédentes

Groovy (397 octets)

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

Urne de poulpe magique
la source
3
Les réponses doivent être complètes et valides. Veuillez supprimer votre réponse ou la terminer. De plus, 30 minutes ne sont pas très longues. J'ai passé des heures sur les réponses auparavant.
mbomb007
0

Java, 408 406 octets

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 fonction obtient l'entrée en tant que chaîne et renvoie le résultat en tant que chaîne.

En interne, il utilise un tableau de caractères 2D pour stocker les lettres et conserve les colonnes et lignes min et max utilisées afin de renvoyer le sous-tableau utilisé.

Ainsi, dans le résultat String, il n'y a pas de colonnes de début d'espaces blancs mais il y a des espaces blancs de fin jusqu'à la colonne la plus à droite avec un caractère non-espace. Une nouvelle ligne est ajoutée à la fin.

Toutes les suggestions pour jouer au golf sont les bienvenues :-)

Master_ex
la source
Vous pourriez être en mesure de faire un nombre d'octets plus petit en utilisant un char [] en entrée. ((c <p? d-1: c> p? d + 1: d) +4)% 4 De plus, + 4% 4 = 0, corrigez-moi si je me trompe, mais supprimer ce +4 ne devrait pas changer votre code.
Urne de poulpe magique
1
@carusocomputing Il est vrai que char [] en entrée économiserait beaucoup d'octets mais je ne sais pas si cela est permis par la question. La question mentionne une "chaîne d'entrée". De plus, le +4 est requis car d qui est la direction doit être borné entre 0 et 4. %est le reste en java et il peut être négatif ce qui n'est pas souhaité. Merci pour les suggestions :-)
Master_ex
Ah ... Bonne prise, erreur de ma part étant que les entrées offertes par OP couvraient tous les scénarios ... "LNOPFg1 #" le casse sans le +4. Désolé, même la lecture de ce code m'a pris une minute.
Urne de poulpe magique
0

Python3, 419 414 octets

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()
Yodle
la source