Kaplumbağalarınızı bir String ile Kurşun


17

Boşluk hariç , yazdırılabilir ascii karakterlerin boş olmayan tek satırlık bir dizesini alan bir program veya işlev yazın :

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

Girişin geçerli olduğunu varsayabilirsiniz.

Girdiye dayanarak, kaplumbağa grafiklerini takip eden metin boşlukları ve yeni satırlar üzerinde düzenlenmiş yeni bir dize çizin - kaplumbağanın her zaman bir ızgara alanı kapladığı ve sadece kardinal yönlere bakabileceği benzersiz kurallar.

Giriş dizesindeki ilk karakteri metin ızgarasına yazdırın. Kaplumbağa burada sağa bakacak şekilde başlar. Giriş dizesindeki diğer karakterleri yineleyin (yalnızca kaplumbağa takılırsa durur), bu işlemi tekrarlayın:

  1. Kaplumbağaya doğrudan komşu olan 4 ızgara alanının tümü doldurulursa (yani hiçbiri boşluk değildir), yinelemeyi durdurun. Kaplumbağa sıkışmış ve ızgara olabildiğince eksiksiz.

  2. Önceki karakterle karşılaştırıldığında girişteki geçerli karaktere bakın:

    • Eğer mevcut karakter sözcük olarak öncekinden önce ise, kaplumbağayı çeyrek tur sola döndürün.

    • Eğer mevcut karakter bir öncekinden sonra sözcüksel olarak varsa, kaplumbağayı çeyrek tur sağa döndürün.

    • Mevcut karakter öncekine eşitse, kaplumbağayı döndürmeyin.

  3. Kaplumbağanın şimdi karşı karşıya olduğu ızgara alanı boş değilse (yani boşluk değil), kaplumbağayı boş bir ızgara alanına bakana kadar çeyrek tur sola döndürün.

  4. Kaplumbağayı bir ızgara ileriye doğru bir adım ileriye doğru hareket ettirin ve mevcut karakteri kaplumbağanın yeni konumundaki ızgaraya yazdırın.

Sonuçta ortaya çıkan metin ızgara dizesini, boşluk satırları veya boşlukları olmadan yazdırın veya döndürün. Çizgiler, en sağdaki sütuna kadar boşluk olmayan bir boşluk içerebilir, ancak ötesinde olamaz. İsteğe bağlı olarak tek bir satırsonuna izin verilir.

Bayt cinsinden en kısa kod kazanır.

Misal

İşte girdinin tüm adımları spattuuxze. ^V<>Karakter kaplumbağa karşı karşıya yönünü göstermek, bunlar değil giriş veya çıkış parçası.

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

Bu noktada kaplumbağa sıkışır, böylece easla basılmaz ve son çıktı:

tuu
tzx
ap
 s

Aşağıdakine benzer, ancak geçersiz bir boşluk olduğu için boşluk alanı gereksizdir:

 tuu
 tzx
 ap
  s

Test Durumları

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

(Bunlardan herhangi biri yanlış görünüyorsa hemen söyle.)



Test örneğini eklemeniz gerektiğini düşünüyorum PONMLKJIHGFEDCBA, çünkü sonuç sadece bir kare değil ABCDEFGHIJKLMNOPve kurallardaki asimetriyi vurgulamakla çelişiyor .
Greg Martin

Yanıtlar:


1

Harika (357 Byte)

Hiçbir dış kaplumbağa kütlesi kullanılmamış ve hiçbir kaplumbağa zarar görmemiştir.

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

Burada deneyin: https://groovyconsole.appspot.com/edit/5115774872059904


Önceki Denemeler

Harika (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
Cevaplar eksiksiz ve geçerli olmalıdır. Lütfen cevabınızı silin veya bitirin. Ayrıca, 30 dakika çok uzun değil. Daha önce cevaplara saatler harcadım.
mbomb007

0

Java, 408406 bayt

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

İşlev, girdiyi String olarak alır ve sonucu bir String olarak döndürür.

Dahili olarak harfleri saklamak için bir 2D karakter dizisi kullanır ve kullanılan alt diziyi döndürmek için kullanılan minimum ve maksimum sütunları ve satırları tutar.

Sonuç olarak, String dizesinde beyaz boşlukların önde gelen sütunları yoktur, ancak boşluk olmayan bir karakterle en sağdaki sütuna kadar izleyen beyaz boşluklar vardır. Sonuna bir satırsonu eklenir.

Daha golf için herhangi bir öneri bekliyoruz :-)


Girdi olarak bir char [] kullanarak daha küçük bir bayt sayımı yapabilirsiniz. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Ayrıca, + 4% 4 = 0, orada yanılıyorsam beni düzeltin ama +4'ü kaldırmak değişmemeli senin kodun.
Sihirli Ahtapot Urn

1
@carusocomputing char [] giriş olarak birçok bayt kaydedecek doğrudur ama bu soru tarafından izin verilip verilmediğinden emin değilim. Soru bir "giriş dizesi" nden bahsediyor. Ayrıca +4 gereklidir, çünkü yön olan d, 0 ile 4 arasında sınırlanmalıdır %. Java'da kalan kısımdır ve arzu edilmeyen negatif olabilir. Öneriler için teşekkürler :-)
Master_ex

Ah ... İyi yakaladım, benim tarafımdan OP tarafından sunulan girdilerin tüm senaryoları kapsadığı gerçeği ... "LNOPFg1 #" +4 olmadan kırıyor. Üzgünüm, bu kodu okumak bile bir dakikamı aldı.
Sihirli Ahtapot Urn

0

Python3, 419 414 bayt

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.