Dẫn Rùa của bạn bằng một chuỗi


17

Viết chương trình hoặc hàm nhận một chuỗi ký tự ascii có thể in không có ký tự không bao gồm khoảng trắng:

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

Bạn có thể cho rằng đầu vào là hợp lệ.

Dựa trên đầu vào, vẽ một chuỗi mới được sắp xếp trên một lưới văn bản gồm các khoảng trắng và dòng mới theo quy tắc đồ họa của rùa trong đó rùa luôn chiếm một không gian lưới và chỉ có thể đối mặt với các hướng chính.

In ký tự đầu tiên trong chuỗi đầu vào vào lưới văn bản. Con rùa bắt đầu từ đây phải đối mặt. Lặp lại phần còn lại của các ký tự trong chuỗi đầu vào (chỉ dừng lại nếu rùa bị kẹt), lặp lại quy trình này:

  1. Nếu 4 không gian lưới trực tiếp lân cận rùa đều được lấp đầy (tức là không có không gian nào trong số chúng là khoảng trắng), hãy dừng lặp lại. Con rùa bị mắc kẹt và lưới điện hoàn chỉnh như nó có thể.

  2. Nhìn vào ký tự hiện tại trong đầu vào so với ký tự trước:

    • Nếu nhân vật hiện tại là từ vựng trước đó, hãy xoay con rùa một phần tư rẽ trái.

    • Nếu nhân vật hiện tại là từ vựng sau lần trước, xoay rùa một phần tư rẽ phải.

    • Nếu ký tự hiện tại bằng với trước đó, đừng xoay rùa.

  3. Nếu không gian lưới mà rùa hiện đang đối mặt không trống (tức là không phải là khoảng trắng), liên tục xoay rùa một phần tư rẽ trái cho đến khi cô ấy đối mặt với không gian lưới trống.

  4. Di chuyển con rùa một bước về phía trước theo hướng cô ấy đối mặt và in ký tự hiện tại lên lưới ở vị trí mới của con rùa.

In hoặc trả về chuỗi lưới văn bản kết quả không có hàng hoặc cột không gian bên ngoài. Các dòng có thể có các khoảng trắng ở cột ngoài cùng bên phải với một khoảng trắng, nhưng không vượt quá. Một dòng mới duy nhất được tùy chọn cho phép.

Mã ngắn nhất tính bằng byte thắng.

Thí dụ

Dưới đây là tất cả các bước của đầu vào spattuuxze. Các ^V<>nhân vật cho thấy hướng rùa đang đối mặt, chúng không phải là một phần của đầu vào hoặc đầu ra.

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

Tại thời điểm này, rùa bị mắc kẹt nên ekhông bao giờ được in và đầu ra cuối cùng là:

tuu
tzx
ap
 s

Dưới đây là một đầu ra tương tự nhưng không hợp lệ vì nó có một cột khoảng trắng hàng đầu không cần thiết:

 tuu
 tzx
 ap
  s

Các trường hợp thử nghiệm

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

(Đừng nói với tôi ngay nếu bất kỳ điều nào trong số này có vẻ sai.)



Tôi nghĩ bạn nên thêm trường hợp thử nghiệm PONMLKJIHGFEDCBA, vì kết quả không chỉ là một hình vuông và tương phản với ABCDEFGHIJKLMNOPđể làm nổi bật sự bất cân xứng trong các quy tắc.
Greg Martin

Câu trả lời:


1

Groovy (357 byte)

Không có libs rùa bên ngoài đã được sử dụng và không có rùa bị tổn hại.

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

Dùng thử tại đây: https://groovyconsole.appspot.com/edit/5115774872059904


Những nỗ lực trước đây

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
Câu trả lời phải đầy đủ và hợp lệ. Vui lòng xóa câu trả lời của bạn hoặc hoàn thành nó. Ngoài ra, 30 phút không dài lắm. Tôi đã dành hàng giờ cho câu trả lời trước đây.
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;}

Hàm lấy đầu vào là Chuỗi và trả về kết quả dưới dạng Chuỗi.

Trong nội bộ, nó sử dụng một mảng char 2D để lưu trữ các chữ cái và giữ các cột và hàng tối thiểu và tối đa được sử dụng để trả về mảng con đã được sử dụng.

Vì vậy, trong Chuỗi kết quả, không có các cột hàng đầu của khoảng trắng nhưng có các khoảng trắng ở cuối cột bên phải với một ký tự không phải là khoảng trắng. Một dòng mới được thêm vào cuối.

Bất kỳ đề xuất nào để chơi gôn đều được chào đón :-)


Bạn có thể thực hiện đếm byte nhỏ hơn bằng cách sử dụng char [] làm đầu vào. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Ngoài ra, + 4% 4 = 0, hãy sửa tôi nếu tôi sai ở đó nhưng xóa +4 thì không nên thay đổi ma cua ban.
Bạch tuộc ma thuật Urn

1
@carusocomputing Đúng là char [] làm đầu vào sẽ tiết kiệm được nhiều byte nhưng tôi không chắc liệu câu hỏi này có được phép không. Câu hỏi đề cập đến một "chuỗi đầu vào". Ngoài ra, +4 là bắt buộc vì d là hướng phải được giới hạn trong khoảng từ 0 đến 4. %là phần còn lại trong java và nó có thể là âm không mong muốn. Cảm ơn các đề xuất :-)
Master_ex

À ... Bắt tốt, sai lầm của tôi là các đầu vào do OP cung cấp bao gồm tất cả các kịch bản ... "LNOPFg1 #" phá vỡ nó mà không có +4. Xin lỗi, thậm chí đọc mã đó đã làm tôi mất một phút.
Bạch tuộc ma thuật 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.