Conduza sua tartaruga por uma corda

17

Escreva um programa ou função que receba uma seqüência de caracteres de linha única não vazia de caracteres ascii imprimíveis , excluindo espaço:

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

Você pode assumir que a entrada é válida.

Com base na entrada, desenhe uma nova sequência organizada em uma grade de espaços e linhas de texto seguindo os gráficos das tartarugas - regras esquemas em que a tartaruga sempre ocupa um espaço da grade e pode apenas enfrentar as direções cardinais.

Imprima o primeiro caractere na sequência de entrada na grade de texto. A tartaruga começa aqui de frente para a direita. Itere sobre o restante dos caracteres na sequência de entrada (parando apenas se a tartaruga ficar presa), repetindo este processo:

  1. Se os 4 espaços da grade diretamente vizinhos à tartaruga estiverem todos preenchidos (ou seja, nenhum deles é um espaço), pare de repetir. A tartaruga está presa e a grade está o mais completa possível.

  2. Observe o caractere atual na entrada em comparação com o caractere anterior:

    • Se o caractere atual estiver lexicamente anterior ao anterior, gire a tartaruga um quarto de volta à esquerda.

    • Se o caractere atual estiver lexicamente após o anterior, gire a tartaruga um quarto de volta à direita.

    • Se o caractere atual for igual ao anterior, não gire a tartaruga.

  3. Se o espaço da grade que a tartaruga está enfrentando agora não estiver vazio (por exemplo, não é um espaço), gire repetidamente a tartaruga um quarto de volta para a esquerda até que ela esteja enfrentando um espaço vazio na grade.

  4. Mova a grade da tartaruga um passo à frente na direção em que ela está voltada e imprima o caractere atual na grade no novo local da tartaruga.

Imprima ou retorne a sequência de grade de texto resultante sem linhas ou colunas estranhas de espaço em branco. As linhas podem ter espaços à direita até a coluna mais à direita com um não espaço, mas não além. Uma única nova linha à direita é opcionalmente permitida.

O código mais curto em bytes vence.

Exemplo

Aqui estão todas as etapas da entrada spattuuxze. Os ^V<>caracteres mostram a direção que a tartaruga está voltada; eles não fazem parte da entrada ou saída.

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

Nesse ponto, a tartaruga fica presa para que enunca seja impressa e a saída final seja:

tuu
tzx
ap
 s

A seguir, é apresentada uma saída semelhante, mas inválida, pois possui uma coluna inicial desnecessária de espaço em branco:

 tuu
 tzx
 ap
  s

Casos de teste

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

(Diga-me imediatamente se algum deles parecer errado.)

Passatempos de Calvin
fonte
Eu acho que você deve adicionar o caso de teste PONMLKJIHGFEDCBA, pois o resultado não é apenas um quadrado e contrasta com o ABCDEFGHIJKLMNOPde destacar a assimetria nas regras.
Greg Martin

Respostas:

1

Groovy (357 bytes)

Nenhuma lib de tartaruga externa foi usada e nenhuma tartaruga foi prejudicada.

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

Experimente aqui: https://groovyconsole.appspot.com/edit/5115774872059904


Tentativas anteriores

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

Urna de polvo mágico
fonte
3
As respostas devem ser completas e válidas. Exclua sua resposta ou termine-a. Além disso, 30 minutos não é muito longo. Eu passei horas em respostas antes.
mbomb007
0

Java, 408 406 bytes

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

A função obtém a entrada como String e retorna o resultado como uma String.

Internamente, ele usa uma matriz de caracteres 2D para armazenar as letras e mantém as colunas e linhas mínimas e máximas usadas para retornar o subconjunto que foi usado.

Portanto, no String de resultado, não há colunas iniciais de espaços em branco, mas há espaços em branco à direita até a coluna mais à direita com um caractere não-espaço. Uma nova linha é adicionada no final.

Quaisquer sugestões para jogar mais são bem-vindas :-)

Master_ex
fonte
Você pode conseguir uma contagem menor de bytes usando um char [] como entrada. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Além disso, + 4% 4 = 0, corrija-me se eu estiver errado lá, mas remover esse +4 não deve mudar seu código.
Magic Octopus Urn
11
@carusocomputing É verdade que char [] como entrada salvaria muitos bytes, mas não tenho certeza se isso é permitido pela pergunta. A pergunta menciona uma "string de entrada". Além disso, o +4 é necessário porque d, que é a direção que deve ser limitada entre 0 e 4., %é o restante em java e pode ser negativo, o que não é desejado. Obrigado pelas sugestões :-)
Master_ex
Ah ... Boa captura, falácia da minha parte, sendo que os insumos oferecidos pelo OP cobriam todos os cenários ... "LNOPFg1 #" quebra sem o +4. Desculpe, mesmo lendo esse código me levou um minuto.
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()
Yodle
fonte