นำเต่าของคุณโดยสาย


17

เขียนโปรแกรมหรือฟังก์ชั่นที่รับสายอักขระบรรทัดเดียวแบบไม่มีอักขระที่พิมพ์ได้ซึ่งไม่รวมช่องว่าง:

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

คุณอาจสันนิษฐานว่าอินพุตนั้นถูกต้อง

ขึ้นอยู่กับอินพุตวาดสตริงใหม่ที่จัดเรียงบนตารางต้นฉบับของช่องว่างและบรรทัดใหม่ตามกราฟิกเต่า - กฎที่เต่าที่เต่ามักจะใช้พื้นที่ตารางเดียวและสามารถหันหน้าไปทางทิศทางที่สำคัญเท่านั้น

พิมพ์อักขระตัวแรกในสตริงอินพุตไปยังกริดข้อความ เต่าเริ่มหันมาทางขวา วนซ้ำตัวอักษรที่เหลือในสตริงอินพุต (หยุดเฉพาะเมื่อเต่าติดอยู่) โดยทำซ้ำขั้นตอนนี้:

  1. หากช่องว่างทั้ง 4 ช่องที่อยู่ติดกับเต่านั้นเต็มไปหมด (เช่นไม่มีช่องว่างใด ๆ ) ให้หยุดการทำซ้ำ เต่าติดอยู่และกริดนั้นเสร็จสมบูรณ์เท่าที่จะเป็นไปได้

  2. ดูอักขระปัจจุบันในอินพุตเปรียบเทียบกับอักขระก่อนหน้า:

    • หากตัวละครในปัจจุบันเป็นศัพท์ก่อนหน้าก่อนหน้าหมุนเต่าหนึ่งในสี่เลี้ยวซ้าย

    • หากตัวละครปัจจุบันเป็นคำศัพท์หลังจากก่อนหน้าหมุนเต่าหนึ่งในสี่เลี้ยวขวา

    • หากตัวละครปัจจุบันเท่ากับก่อนหน้าอย่าหมุนเต่า

  3. หากพื้นที่กริดที่เต่ากำลังเผชิญอยู่นั้นไม่ว่างเปล่า (เช่นไม่ใช่ที่ว่าง) ให้หมุนเต่าหนึ่งครั้งในไตรมาสที่เหลือจนกระทั่งเธอหันหน้าเข้าหาพื้นที่กริดที่ว่างเปล่า

  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

(โปรดบอกฉันทันทีหากสิ่งเหล่านี้ดูเหมือนว่าผิด)


คุณไม่ได้ล้อเล่น
R. Kap

ฉันคิดว่าคุณควรเพิ่มกรณีทดสอบPONMLKJIHGFEDCBAเนื่องจากผลลัพธ์ไม่ได้เป็นแค่รูปสี่เหลี่ยมจัตุรัสและตรงกันข้ามกับABCDEFGHIJKLMNOPเพื่อเน้นความไม่สมดุลของกฎ
Greg Martin

คำตอบ:


1

Groovy (357 ไบต์)

ไม่มีการใช้ libs เต่าภายนอกและไม่มีการทำร้ายเต่า

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


ความพยายามก่อนหน้า

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


3
คำตอบจะต้องสมบูรณ์และถูกต้อง โปรดลบคำตอบของคุณหรือทำมันให้เสร็จ นอกจากนี้ 30 นาทีไม่นานมาก ฉันใช้เวลาหลายชั่วโมงกับคำตอบก่อนหน้านี้
mbomb007

0

Java, 408 406 ไบต์

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

ฟังก์ชันรับอินพุตเป็นสตริงและส่งคืนผลลัพธ์เป็นสตริง

ภายในจะใช้อาร์เรย์ถ่าน 2 มิติในการจัดเก็บตัวอักษรและเก็บคอลัมน์และแถวขั้นต่ำและสูงสุดเพื่อใช้ในการส่งคืนชุดย่อยที่ใช้

ดังนั้นในผลลัพธ์ String ไม่มีคอลัมน์นำหน้าของช่องว่างสีขาว แต่มีช่องว่างต่อท้ายสีขาวจนถึงคอลัมน์ด้านขวาสุดที่มีอักขระที่ไม่ใช่ช่องว่าง บรรทัดใหม่จะถูกเพิ่มในตอนท้าย

ข้อเสนอแนะใด ๆ ในการเล่นกอล์ฟมากขึ้นยินดีต้อนรับ :-)


คุณอาจสามารถนับจำนวนไบต์ที่น้อยกว่าโดยใช้อักขระ [] เป็นอินพุตได้ ((c <p? d-1: c> p? d + 1: d) +4)% 4 ด้วย, + 4% 4 = 0, แก้ไขให้ฉันถ้าฉันผิดที่นั่น แต่การลบ +4 นั้นไม่ควรเปลี่ยน รหัสของคุณ
Magic Octopus Urn

1
@carusocomputing มันเป็นความจริงที่ char [] เนื่องจากอินพุตจะช่วยประหยัดจำนวนไบต์ได้ แต่ฉันไม่แน่ใจว่าคำถามนี้ได้รับอนุญาตหรือไม่ คำถามที่กล่าวถึง "สตริงการป้อน" นอกจากนี้ยังจำเป็นต้องมี +4 เพราะ d ซึ่งเป็นทิศทางที่จะต้องมีการล้อมรอบระหว่าง 0 และ 4 %เป็นส่วนที่เหลือใน java และสามารถเป็นลบซึ่งไม่ต้องการ ขอบคุณสำหรับคำแนะนำ :-)
Master_ex

อ่า ... จับได้ดีความเข้าใจผิดในตอนท้ายของฉันคือว่าอินพุตที่ OP เสนอให้นั้นครอบคลุมทุกสถานการณ์ ... "LNOPFg1 #" หยุดพักโดยไม่มี +4 ขออภัยแม้แต่การอ่านรหัสนั้นก็ใช้เวลาสักครู่
Magic Octopus Urn

0

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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.