끈으로 거북이를 이끌다 비교하십시오. 현재 문자가 이전 문자보다 어휘

공백을 제외하고 인쇄 할 수없는 ASCII 문자 로 구성된 비어 있지 않은 한 줄 문자열을 취하는 프로그램이나 함수를 작성하십시오 .

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

입력이 유효하다고 가정 할 수 있습니다.

입력을 기반으로 거북이가 항상 하나의 격자 공간을 차지하고 기본 방향을 향할 수있는 규칙 과 같은 거북이 그래픽 에 따라 텍스트 공간과 줄 바꿈에 배치 된 새 문자열을 그립니다 .

입력 문자열의 첫 번째 문자를 텍스트 격자에 인쇄하십시오. 거북이가 오른쪽을 향하여 여기에서 시작됩니다. 입력 문자열의 나머지 문자를 반복하고 (거북이 막힌 경우에만 중지)이 프로세스를 반복하십시오.

  1. 거북이에 직접 인접한 4 개의 그리드 공간이 모두 채워지면 (즉, 공간이없는 공간) 반복을 중지합니다. 거북이가 붙어 있고 그리드는 가능한 한 완벽합니다.

  2. 입력에서 현재 문자를 이전 문자와 비교하십시오.

    • 현재 문자가 이전 문자보다 어휘 적으로 앞면 거북이를 1/4 바퀴 왼쪽으로 돌립니다.

    • 이전 문자 다음에 현재 문자가 어휘 적으로 나오는 경우 거북이를 1/4 회전 오른쪽으로 돌립니다.

    • 현재 문자가 이전 문자와 같으면 거북이를 회전시키지 마십시오.

  3. 거북이가 지금보고있는 격자 공간이 비어 있지 않은 경우 (즉, 공백이 아님), 거북이가 빈 격자 공간을 향할 때까지 거북이를 왼쪽으로 1/4 바퀴 돌립니다.

  4. 거북이를 자신이 향하는 방향으로 한 그리드 앞으로 이동시키고 거북이의 새로운 위치에있는 격자에 현재 캐릭터를 인쇄하십시오.

공백이없는 행이나 열이없는 결과 텍스트 그리드 문자열을 인쇄하거나 반환합니다. 줄은 공백이 아닌 맨 오른쪽 열까지 후행 공백을 가질 수 있지만 그 범위를 넘어서는 안됩니다. 단일 후행 줄 바꿈이 선택적으로 허용됩니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

입력의 모든 단계는 다음과 같습니다 spattuuxze. ^V<>문자 거북이가 향하는 방향을 표시들은되어 있지 입력 또는 출력의 일부.

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

이 시점에서 거북이가 붙어서 e인쇄되지 않으며 최종 출력물은 다음과 같습니다.

tuu
tzx
ap
 s

다음은 공백의 불필요한 선행 열이 있기 때문에 비슷하지만 유효하지 않은 출력입니다.

 tuu
 tzx
 ap
  s

테스트 사례

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

(이들 중 하나라도 잘못되면 즉시 알려주십시오.)



답변

그루비 (357 바이트)

외부 거북이 라이브러리는 사용되지 않았으며 거북이도 피해를 입지 않았습니다.

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

여기에서 시도하십시오 :
https://groovyconsole.appspot.com/edit/5115774872059904


이전 시도

그루비 (397 바이트)

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


답변

자바, 408406 바이트

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

이 함수는 입력을 문자열로 가져오고 결과를 문자열로 반환합니다.

내부적으로 2D 문자 배열을 사용하여 문자를 저장하고 사용 된 하위 배열을 반환하기 위해 사용 된 최소 및 최대 열과 행을 유지합니다.

따라서 결과 문자열에는 공백으로 된 선행 열이 없지만 공백이 아닌 문자를 사용하여 맨 오른쪽 열까지 후행 공백이 있습니다. 줄 바꿈이 끝에 추가됩니다.

더 골프에 대한 제안은 환영합니다 🙂


답변

Python3, 419 414 바이트

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