輪郭に沿って矢印を移動する


28

サンドボックス

一定の時計回りまたは反時計回りの方向に一貫した矢印(各輪郭には独自の方向があります)と正の数nの矢印を持つ、閉じた重複しない2D輪郭(対角線上でも少なくとも1つのスペースで分離)のセットが与えられた場合、矢印を移動しますn輪郭に沿ってそれぞれの方向にステップします。矢印は、> v < ^それぞれ右、下、左、および上方向で表されます。他のキャラクターは、-(水平)、|(垂直)、+(角)です。矢印が角にある場合、矢印は現在の方向を維持し、方向転換が行われた後にのみ変更します。

任意の2つの角の間には常に直線のセグメント(またはスペース)があります(+-+水平の場合と垂直の場合と同様)-つまり、急Uカーブは禁止されています。コーナー間のセグメントは垂直または水平のいずれかであり、コーナーでの屈曲は常に90度です。

入力:

  • 正の整数-- nステップ数
  • 等高線のASCII表現-複数行の文字列、文字列のリスト、文字のリストなどです。

出力:

すべての矢印が同じ輪郭でn、各輪郭の全体方向にステップがシフトしました。

テストケース:

1。

入力:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

出力:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2。

入力:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

出力:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

3。

入力:

n = 3

 +---+   +---+   +-------+      
 |   |   |   v   |       |      
 ^   |   |   |   +-<-+   |      
 |   |   ^   |       |   v      
 |   +---+   +-->----+   |      
 |                       |      
 |   +-------+   +---+   |      
 |   |       |   v   |   |      
 +---+       +---+   +---+      

出力:

 +>--+   ^---+   +-------+
 |   |   |   |   ^       |
 |   |   |   |   +---+   |
 |   |   |   |       |   |
 |   +---+   v----->-+   |
 |                       |
 |   +-------+   +---+   v 
 |   |       |   |   |   |
 +---+       +-<-+   +---+  

4。

入力:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

出力:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5。

入力

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

出力:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6。

入力:

n = 1

^->
^ v
<<v

出力:

^>+
^ v
<<v

上記のタスクを解決する関数またはプログラムを作成します。すべての言語のバイト単位の最短コードが勝ちです。ゴルフ言語に落胆しないでください。アルゴリズムとコードの説明は大歓迎です。


2つの輪郭が対角線上の角に接することはできますか?
xnor

4
「閉じた重なり合わない2D輪郭のセットを考えると、矢印が常に同じ時計回りまたは反時計回りの方向を向いている」と、すべての輪郭が同じ方向を向いているように聞こえますが、テストケースからは矢印は輪郭内でのみ一貫しています。
xnor

3
@xnorコメントありがとうございます!-いいえ、輪郭は対角線上で互いに接触することはできません。-各輪郭には独自の方向があります。説明を更新します。
ガレンイワノフ

2
壁の間にスペースがない入力は可能ですか?例:オンラインでお試しください!。「少なくとも1つのスペースで区切られている」と言っていましたが、それが独立したループだけに適用されるのか、それとも単一のループにも適用されるのかはわかりませんでした。
ジョナ

1
@ジョナいいえ、それは不可能です:There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
ガレン・イワノフ

回答:


14

JavaScript(ES6)、 210 ... 182  180バイト

(m)(n)m

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

オンラインでお試しください!

どうやって?

このリンクたどることができますを、ソースのフォーマットされたバージョンを確認。

ラッパー

gn1n=0

更新方法

更新されていない矢印を更新された矢印で上書きするリスクがあるため、各矢印を一度に1つずつ安全に移動することはできません。代わりに、最初にすべての矢印を削除し、それらの新しい位置を計算します。新しいポジションを再度適用します。

n

n

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

n

新しい位置は、単に実行することによって適用されeval(n)ます。

行き方

d$

10+23

dバツdy

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

コーナー

hddXOR1dXOR3です。

+-|d

注意h$h"$""$""$"

アニメーション版


ご説明ありがとうございます!
ガレンイワノフ

8

K(NGN / K) 183の161 157バイト

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

オンラインでお試しください!

{ }/int left arg nで呼び出された場合、これは関数を{ }n回右のargに適用します

A:"^>v<"

D,:-D:(-1 0;!2) 4つの基本方向の∆y、∆x

s:(#x;#*x) 入力の形状:高さ、幅

c:~^x countours-非スペースの場所を示すブール行列

r:" -+|"c*+/'3'0,c,0各セルのself + upper + lowerをカウントしc、1-> -、2-> を置き換えることにより、countourで矢印なしで文字マトリックスを再作成します+、3->|

t:A?,/x矢印の種類:0 1 2 3の場合^>v<、他のすべてのセルは次のように表されます0N(null)ます

p:+s\&~^t 矢印の座標

$[#p ;;:r] 矢印がない場合は、戻ります r

q:+p+/:D@4!(t^0N)+/:0 1 3 各矢印の3つの可能な新しい位置すべて-前進し続ける場合、左に曲がる場合、および右に曲がる場合

q:q@'*'&'~^x ./:/:q 各矢印に対して、国に着陸する最初のオプションを選択します

@[,/r;s/+q;:;A@D?q-p]平らrにして、新しい位置に矢印を付け、新しい方向に向けます

s# 元の形状に変形する


2
あなたは速い!ゴルフを終えた後にコードを説明してください。
ガレンイワノフ

ご説明ありがとうございます!
ガレンイワノフ

4

、105バイト

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗黧ζι

オンラインでお試しください!リンクは、コードの詳細バージョンです。面倒な入力形式を必要としないようにするために使用される22バイトが含まれています。説明:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

輪郭とステップ数を便利に入力します。

≔>^<vζ

方向文字は数回使用されるため、文字列はここにキャッシュされます。この文字列内の方向文字のインデックスは、方向として知られています。

Pθ

カーソルを動かさずに元の輪郭を印刷します。

Fθ

輪郭内の文字をループします。

¿№ζι«

現在の文字が方向文字の場合...

⊞υ⟦⌕ζιⅉⅈ⟧

...次に、方向と位置をリストに保存します...

§+|-↨EKV›κ ²

...文字を適切な行文字に置き換えます。

»ι

それ以外の場合は、文字を出力して次の文字に進みます。

Fυ«

保存した位置をループします。

J⊟ι⊟ι

保存した位置にジャンプします。

≔⊟ιι

保存した方向を抽出します。

FIη«

適切な数のステップをループします。

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

次のステップの方向を見つけます。これは、逆でも空でもない方向です。

M✳⊗ι

その方向に一歩進んでください。(Moveコマンドのチャコール方向インデックスは、私の方向の値の2倍です。)

»§ζι

適切な方向文字を印刷します。


ご説明ありがとうございます!
ガレンイワノフ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.