Ведіть свою черепаху струною


17

Напишіть програму або функцію, яка містить непорожній однорядковий рядок для друку символів ascii, виключаючи пробіл:

!"#$%&'()*+,-./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

(Скажіть мені відразу, якщо щось із цього здається неправильним.)



Я думаю, вам слід додати тестовий випадок PONMLKJIHGFEDCBA, оскільки результат не просто квадрат, а контраст, ABCDEFGHIJKLMNOPщоб виділити асиметрію в правилах.
Грег Мартін

Відповіді:


1

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


Попередні спроби

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

Функція отримує введення як String і повертає результат у вигляді String.

Внутрішньо він використовує двовимірний масив char для зберігання літер і зберігає стовпці min та max та рядки, що використовуються для повернення використовуваного підмасиву.

Так, у результаті String немає провідних стовпців пробілів, але є пробіли білих пробілів аж до самого правого стовпця з символом, що не має пробілу. Новий рядок додається в кінці.

Будь-які пропозиції про те, щоб пограти в гольф більше, вітаються :-)


Можливо, ви зможете зробити менший кількість байтів, використовуючи char [] в якості вхідного даних. ((c <p? d-1: c> p? d + 1: d) +4)% 4 Крім того, + 4% 4 = 0, виправте мене, якщо я помиляюся там, але видалення цього +4 не повинно змінюватися свій код.
Чарівна восьминога урна

1
@carusocomputing Це правда, що char [] як вхід врятує багато байтів, але я не впевнений, чи це дозволено питанням. У питанні зазначається "рядок введення". Також необхідний +4, тому що d, який є напрямом, повинен бути обмежений між 0 і 4. %- залишок у java, і він може бути негативним, що не бажано. Дякую за пропозиції :-)
Master_ex

Ах ... Хороший улов, помилковість, на моєму рахунку, що вхідні дані, запропоновані ОП, охоплювали всі сценарії ... "LNOPFg1 #" перериває його без +4. Вибачте, навіть прочитання цього коду зайняло мені хвилину.
Чарівна восьминога урна

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.