Pimpin Turtle Anda dengan Senar

17

Tulis program atau fungsi yang menggunakan string baris-tunggal karakter ascii yang dapat dicetak tanpa spasi:

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

Anda dapat menganggap input tersebut valid.

Berdasarkan input, gambarkan string baru yang tersusun pada kisi-kisi tekstual spasi dan baris baru mengikuti grafik kura - kura - aturan yang menarik di mana kura-kura selalu menempati satu ruang kisi dan hanya bisa menghadapi arah mata angin.

Cetak karakter pertama dalam string input ke kisi teks. Penyu mulai di sini menghadap ke kanan. Ulangi sisa karakter dalam string input (hanya berhenti jika kura-kura macet), ulangi proses ini:

  1. Jika 4 ruang kisi yang bersebelahan langsung dengan kura-kura semuanya terisi (yaitu tidak ada satupun yang merupakan ruang), berhentilah iterasi. Kura-kura tersangkut dan kisi-kisi selengkap mungkin.

  2. Lihatlah karakter saat ini di input dibandingkan dengan karakter sebelumnya:

    • Jika karakter saat ini leksikal sebelum yang sebelumnya, putar kura-kura seperempat belok ke kiri.

    • Jika karakter saat ini adalah leksikal setelah sebelumnya, putar penyu seperempat belok ke kanan.

    • Jika karakter saat ini sama dengan karakter sebelumnya, jangan putar kura-kura.

  3. Jika ruang kisi yang kura-kura hadapi sekarang tidak kosong (artinya bukan spasi), putar kura-kura berulang kali seperempat belok kiri sampai dia menghadapi ruang kotak kosong.

  4. Pindahkan kura-kura satu langkah maju ke arah yang dia hadapi dan cetak karakter saat ini pada kotak di lokasi baru kura-kura

Cetak atau kembalikan string kotak teks yang dihasilkan tanpa baris atau kolom asing. Baris mungkin memiliki spasi tambahan hingga kolom paling kanan dengan non-spasi, tetapi tidak di luar. Sebuah baris baru yang membuntuti secara opsional diizinkan.

Kode terpendek dalam byte menang.

Contoh

Inilah semua langkah dari input spattuuxze. The ^V<>karakter menunjukkan arah penyu menghadap, mereka tidak bagian dari input atau output.

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

Pada titik ini kura-kura macet sehingga etidak pernah dicetak dan hasil akhirnya adalah:

tuu
tzx
ap
 s

Berikut ini adalah output yang serupa tetapi tidak valid karena memiliki kolom spasi kosong terkemuka:

 tuu
 tzx
 ap
  s

Uji Kasus

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

(Katakan segera jika ada yang salah.)

Hobi Calvin
sumber
Saya pikir Anda harus menambahkan test case PONMLKJIHGFEDCBA, karena hasilnya bukan hanya kotak dan kontras dengan ABCDEFGHIJKLMNOPmenyoroti asimetri dalam aturan.
Greg Martin

Jawaban:

1

Groovy (357 Bytes)

Tidak ada penyu eksternal yang digunakan dan tidak ada penyu yang terluka.

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

Cobalah di sini: https://groovyconsole.appspot.com/edit/5115774872059904


Usaha Sebelumnya

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

Guci Gurita Ajaib
sumber
3
Jawaban harus lengkap dan valid. Harap hapus jawaban Anda atau selesaikan. Juga, 30 menit tidak terlalu lama. Saya telah menghabiskan berjam-jam untuk jawaban sebelumnya.
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;}

Fungsi mendapatkan input sebagai String dan mengembalikan hasilnya sebagai String.

Secara internal ia menggunakan array char 2D untuk menyimpan surat-surat dan membuat kolom dan baris min dan max digunakan untuk mengembalikan sub-array yang digunakan.

Jadi, dalam String hasil tidak ada kolom spasi putih, tetapi ada spasi putih hingga kolom paling kanan dengan karakter non-spasi. Baris baru ditambahkan di akhir.

Ada saran untuk bermain golf lebih lanjut :-)

Master_ex
sumber
Anda mungkin dapat melakukan penghitungan byte yang lebih kecil menggunakan char [] sebagai input. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Juga, + 4% 4 = 0, koreksi saya jika saya salah tetapi menghapus bahwa +4 seharusnya tidak berubah kode Anda.
Magic Octopus Mm
1
@carusocomputing Memang benar bahwa char [] sebagai input akan menghemat banyak byte tetapi saya tidak yakin apakah ini diizinkan oleh pertanyaan. Pertanyaannya menyebutkan "string input". +4 juga diperlukan karena d yang arahnya harus dibatasi antara 0 dan 4. %adalah sisanya di java dan bisa negatif yang tidak diinginkan. Terima kasih atas sarannya :-)
Master_ex
Ah ... Tangkapan bagus, kekeliruan di pihak saya adalah bahwa input yang ditawarkan oleh OP mencakup semua skenario ... "LNOPFg1 #" memecahkannya tanpa +4. Maaf, bahkan membaca kode itu memerlukan waktu sebentar.
Magic Octopus Mm
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()
Yodle
sumber