Веди свою черепаху за верёвочку


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

Функция получает входные данные в виде строки и возвращает результат в виде строки.

Внутренне он использует массив двумерных символов для хранения букв и сохраняет минимальные и максимальные столбцы и строки, используемые для возврата использованного подмассива.

Итак, в итоговой строке нет начальных столбцов пробелов, но есть конечные пробелы до самого правого столбца с непробельным символом. Новая строка добавляется в конце.

Любые предложения по гольфу больше приветствуются :-)


Вы могли бы сделать меньшее количество байтов, используя 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

Ах ... Хороший улов, с моей стороны ошибка в том, что входные данные, предложенные OP, охватывали все сценарии ... "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.