グリッド上のロータールーター


10

入力

入力は単一の文字列で、改行によっていくつかの整数の場合2n+1は長さの行に分割されます。整数は入力の一部ではありません。文字列から計算する必要があります。行は「方向文字」で構成されています。改行が問題になる場合は、縦線に置き換えることができます。2n+1n ≥ 0n>^<v|

入力はサイズの正方形のグリッドを形成し、グリッドの(2n+1)x(2n+1)各セルは、4つの基本方向の1つを指すロータールーターとして解釈されます。グリッドの中心にあるルーターにトークンをドロップすると、ルーターは次の方法でトークンを移動します。トークンがルーターに到達すると、ルーターは反時計回りに90度回転し、トークンが指す新しい方向にトークンを1ステップ移動します。別のルーターに到達した場合、プロセスは繰り返されますが、最終的にトークンはグリッドから落ちます。

出力

出力は、入力と同じ形式のルーターの最終構成です。

入力例として、3x3グリッドを考えます

<^<
^><
>^v

中央のルーターがトークンを示すために強調表示されている場所です(少しわかりにくいです)。中央のルーターが回転して北を向き、トークンを一番上の行の中央のセルに移動します。

<^<
^^<
>^v

このルーターは西向きに回転し、トークンを左上隅に送信します。

<<<
^^<
>^v

隅にあるルーターはトークンを南に送信するため、中央の行の左端のセルにあります。

v<<
^^<
>^v

そのルーターは西を向くように回転し、グリッドからトークンを送信します。

v<<
<^<
>^v

これが最終的なグリッド構成なので、プログラムで出力する必要があります。より複雑な例では、グリッドから落ちる前にトークンが同じルーターを複数回通過できることに注意してください。

ルール

関数または完全なプログラムのいずれかを記述できます。これはコードゴルフなので、最小バイト数が優先されます。標準の抜け穴は許可されていません。入力および/または出力に後続の改行があるかどうかを決定できます。

テストケース

Input:
v
Output:
>

Input:
<^<
^><
>^v
Output:
v<<
<^<
>^v

Input:
>>^>>
v<vv<
>^>^<
^<>>^
vvv>>
Output:
>>^>>
>v>>v
^>>vv
^^>>>
v^<<^

Input:
<^^^^^^^^
<<^^^^^^>
<<<^^^^>>
<<<<^^>>>
<<<<^>>>>
<<<vv>>>>
<<vvvv>>>
<vvvvvv>>
vvvvvvvv>
Output:
>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<

「東に回転する」の2つのインスタンスは「西に回転する」と言うべきですか?
Peter Taylor

@PeterTaylor良いキャッチ。私は常に2つを混同しているようです。
Zgarb 2015

入力文字列は改行で終了していますか?
edc65 2015

@ edc65あなたは自分自身、また出力のためにそれを決めることができます。ただし、先行する改行はありません。
Zgarb 2015

回答:


3

CJam、62 61 63バイト

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

Nq_N#):D;+_,2/{:P"^<v>^

"_P4$=#:X)=t_,0PX[1DW*WDSP]=-e>e<}h;1>

展開してコメント:

Nq              "Read the input grid";
_N#):D;         "Calculate the vertical delta (line length + 1)";
+               "Prepend a newline to the grid";
_,2/            "Calculate the initial position as the length of the grid
                 string divided by 2";
{               "Do...";
  :P"^<v>^

"
  _P4$=           "Get the character indexed by the position in the grid";
  #:X             "Map the character to an operation number:
                   '^'=>0, '<'=>1, 'v'=>2, '>'=>3, '^'=>4, '\n'=>5, '\n'=>6
                   (the unreachable duplicate mappings are important below)";
  )=t             "Set the character indexed by the position in the grid to
                   the result of mapping the operation number + 1 backwards";
  _,0PX[1DW*WDSP]="Map the operation number to a negated delta (this occurs
                   after rotating routers, which means that operation n should
                   act like the character corresponding to operation n + 1):
                   0=>1, 1=>-delta, 2=>-1, 3=>delta, 5=>position";
  -e>e<           "Subtract the negated delta from the position and clamp it to
                   [0, length of the grid string] (array indices are circular,
                   so the length of the grid string will act like the index 0
                   and point to the initial newline next iteration, which will
                   *really* set the position to 0)";
}h              "... while the position is not 0 (i.e. not at the initial
                 newline)";
;1>             "Clean up and remove the initial newline";

私のソリューションは入力をフラット文字列として操作するため、追跡する位置の値は1つだけで、実質的に前処理/後処理はありません。グリッドの先頭に改行を追加するための2バイトの前処理と、出力から削除するための2バイトの後処理があります。しかし、これらの4バイトは、改行を保持してルーターのように「実行」できるので、コストに見合う価値がありますが、別の改行に「回転」して位置をゼロに設定します。そして、位置がゼロになるとメインループは終了します。


前の改行は残念ながら行かなければならないと私は決めます。末尾のみ許可されます。
Zgarb 2015

@Zgarb固定、+ 2バイト。
Runer112 2015

あなたのリンクからの出力が正しくないようです
aditsuはSEは悪であるため、終了

@aditsuそうですね。何に触れたのかよくわかりません。調べてみます。
Runer112 2015

@aditsu減算は可換ではないことがわかりました。それが壊れていたことを指摘してくれてありがとう、それは修正するのに十分簡単でした。しかし、コメントの1つがコードに触れています。:(
Runer112 2015


1

JavaScriptの(ES6)121 120 127 129

文字列を入力パラメータとして取得し、出力を返す名前付き関数。
入力文字列が改行で終了すると仮定します。

バグ修正を編集、.search()は上手く動作しませんundefined

F=s=>(o=~s.search('\n'),s=[...s],
R=p=>~(u='^<v>'.indexOf(s[p]))?R(p+[-1,-o,1,o][u],s[p]='<v>^'[u]):s)(-~o*o/2-1)
.join('')

ゴルフをしていないと説明

F=s=>{
  o = s.search('\n')+1; // offset to next row
  s = [...s]; // string to array
  R=p=>{ // recursive search functiom, parameter p is current position in grid
    u = '^<v>'.indexOf(s[p]); // find direction
    if (u<0) return s; // if no direction found, out of grid -> stop recursion
    s[p] = '<v>^'[u] // set new direction into the array cell 
    return R(p+[-1,o,1,-o][u]) // call recursive function with new position
  }
  return R((o-1)*o/2-1) // start recursive search with initial position at grid center
  .join('') // array to string
}

Firefox / FireBugコンソールでテストする

s='<^^^^^^^^\n\
<<^^^^^^>\n\
<<<^^^^>>\n\
<<<<^^>>>\n\
<<<<^>>>>\n\
<<<vv>>>>\n\
<<vvvv>>>\n\
<vvvvvv>>\n\
vvvvvvvv>\n'
console.log(F(s))

出力

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