あなたのカメをひもで導く


17

スペースを除く印刷可能なASCII文字の空でない単一行の文字列を取り込むプログラムまたは関数を記述します。

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

入力が有効であると想定できます。

入力に基づいて、スペースとテキストのグリッド上に配置された新しい文字列を、亀のグラフィックに沿って描画します-亀は常に1つのグリッドスペースを占有し、基本方向のみに面することができる規則です。

入力文字列の最初の文字をテキストグリッドに出力します。カメは右を向いてここから始まります。入力文字列の残りの文字を繰り返し処理します(カメが動けなくなった場合のみ停止します)。このプロセスを繰り返します。

  1. カメに直接隣接する4つのグリッドスペースがすべて満たされている場合(つまり、どれもスペースではない場合)、反復を停止します。カメが立ち往生しており、グリッドは可能な限り完全です。

  2. 前の文字と比較して、入力内の現在の文字を見てください。

    • 現在のキャラクターが前のキャラクターよりも字句的に前にある場合、タートルを左に1/4回転させます。

    • 現在のキャラクターが前のキャラクターよりも字句的に後であれば、タートルを右に1/4回転させます。

    • 現在のキャラクターが前のキャラクターと等しい場合、タートルを回転させないでください。

  3. カメが現在直面しているグリッド空間が空ではない場合(つまり、スペースではない場合)、空のグリッド空間に直面するまで、タートルを左に1/4回転させます。

  4. 亀を彼女が向いている方向に1グリッド先に移動し、亀の新しい場所のグリッドに現在のキャラクターを印刷します。

余計な行や列の空白なしで、結果のテキストグリッド文字列を印刷または返します。行には、右端の列までの間にスペースを含まない末尾スペースがありますが、それを超えてはなりません。単一の末尾の改行はオプションで許可されます。

バイト単位の最短コードが優先されます。

ここに入力のすべてのステップがあります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;}

この関数は、入力を文字列として取得し、結果を文字列として返します。

内部的には、2D char配列を使用して文字を保存し、使用されたサブ配列を返すために使用される最小および最大の列と行を保持します。

そのため、結果の文字列には空白の先頭の列はありませんが、空白文字ではない右端の列まで末尾の空白があります。最後に改行が追加されます。

もっとゴルフをする提案は大歓迎です:-)


入力としてchar []を使用して、より少ないバイトカウントを実行できる場合があります。((c <p?d-1:c> p?d + 1:d)+4)%4また、+ 4%4 = 0、間違っている場合は修正しますが、+ 4を削除しても変わらないはずですあなたのコード。
魔法のタコUr

1
@carusocomputing入力としてchar []が多くのバイトを節約するのは事実ですが、質問でこれが許可されているかどうかはわかりません。質問は「入力文字列」に言及しています。また、+ 4が必要です。これは、方向であるdを0〜4の範囲で区切る必要があるため%、javaの剰余であり、望ましくない負の値になる可能性があるためです。提案をありがとう:-)
Master_ex

ああ...いいですね、OPが提供する入力がすべてのシナリオをカバーしているという誤解です... "LNOPFg1#"は+4なしでそれを壊します。申し訳ありませんが、そのコードを読んでも1分かかりました。
魔法のタコUr

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.