用绳子带领你的乌龟


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进行对比以突出规则中的不对称性。
格雷格·马丁

Answers:


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'9

0

Java,408406字节

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

该函数以字符串形式获取输入,并以字符串形式返回结果。

在内部,它使用2D char数组存储字母,并保留使用的最小和最大列和行,以便返回所使用的子数组。

因此,在结果字符串中,没有空白的前导列,但是直到最右列的尾随空格都有非空格字符。最后添加一个换行符。

任何更多关于高尔夫的建议都欢迎:-)


您可以使用char []作为输入来执行较小的字节计数。((c <p?d-1:c> p?d + 1:d)+4)%4另外,+ 4%4 = 0,如果我错了,请更正我,但删除+4应该不会改变您的代码。
魔术章鱼缸

1
@carusocomputing确实,char []作为输入将节省许多字节,但是我不确定问题是否允许这样做。问题提到了“输入字符串”。另外+4是必需的,因为方向d必须限制在0和4之间%。java中的余数是d,它可以为负,这是不希望的。感谢您的建议:-)
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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.