Router rotor pada Grid

10

Memasukkan

Input Anda adalah string tunggal, dipisahkan oleh baris baru menjadi 2n+1garis panjang 2n+1, untuk beberapa bilangan bulat n ≥ 0. Bilangan bulat nbukan bagian dari input; Anda harus menghitungnya dari string. Garis-garis terdiri dari "karakter arah" >^<v. Jika baris baru menimbulkan masalah, Anda dapat menggantinya dengan pipa vertikal |.

Input membentuk ukuran kotak persegi (2n+1)x(2n+1), dan setiap sel dari grid ditafsirkan sebagai router rotor , yang menunjuk pada salah satu dari empat arah mata angin. Kami melanjutkan untuk menjatuhkan token pada router di pusat grid, dan kemudian router akan memindahkannya dengan cara berikut. Saat token mendarat di router, router memutar 90 derajat ke arah berlawanan arah jarum jam, dan memindahkan token satu langkah ke arah baru yang ditunjuknya. Jika mendarat di router lain, proses ini diulangi, tetapi akhirnya, token akan jatuh dari grid.

Keluaran

Output Anda adalah konfigurasi final dari router, dalam format yang sama dengan input.

Contoh

Sebagai contoh input, perhatikan 3x3kisi

<^<
^><
>^v

di mana router pusat telah disorot untuk menunjukkan token (agak sulit untuk dilihat). Router pusat berputar untuk menghadap ke utara, dan memindahkan token ke sel pusat dari baris atas:

<^<
^^<
>^v

Router ini berputar untuk menghadap ke barat, dan mengirimkan token ke sudut kiri atas:

<<<
^^<
>^v

Perute di sudut mengirimkan token selatan, jadi sekarang di sel paling kiri dari baris tengah:

v<<
^^<
>^v

Router itu berputar untuk menghadap ke barat dan mengirimkan token dari grid.

v<<
<^<
>^v

Ini adalah konfigurasi kisi terakhir, jadi program Anda harus menampilkannya. Perhatikan bahwa dalam contoh yang lebih kompleks, token dapat melewati router yang sama beberapa kali sebelum jatuh dari grid.

Aturan

Anda dapat menulis fungsi atau program lengkap. Ini adalah kode-golf, sehingga jumlah byte terendah menang. Celah standar tidak diijinkan. Anda dapat memutuskan apakah ada baris tambahan di input dan / atau output.

Uji Kasus

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
^<<<<<<<<
Zgarb
sumber
Haruskah dua contoh "berputar ke timur" mengatakan "berputar untuk menghadap ke barat"?
Peter Taylor
@ PeterTaylor Tangkapan yang bagus. Saya sepertinya selalu membingungkan keduanya.
Zgarb
Apakah string input diakhiri dengan baris baru?
edc65
@ edc65 Anda dapat memutuskan sendiri, juga untuk hasilnya. Tidak ada baris baru sebelumnya.
Zgarb

Jawaban:

3

CJam, 62 61 63 byte

Cobalah online

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

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

Diperluas dan dikomentari:

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

Solusi saya beroperasi pada input sebagai string datar, jadi hanya ada satu nilai posisi untuk dilacak dan hampir tidak ada pra / pasca pemrosesan; hanya ada 2 byte preprocessing untuk menambahkan baris baru ke awal grid dan 2 byte postprocessing untuk menghapusnya dari output. Tetapi 4 byte ini sepadan dengan biayanya karena mereka membiarkan saya menjaga baris baru dan "mengeksekusi" mereka seperti router, tetapi mereka "memutar" ke baris baru lainnya dan mengatur posisi ke nol. Dan loop utama berakhir ketika posisi menjadi nol.

Runer112
sumber
Sayangnya saya akan memutuskan bahwa baris sebelumnya harus pergi; hanya yang tertinggal yang diizinkan.
Zgarb
@Zgarb Diperbaiki, +2 byte.
Runer112
Tampaknya keluaran dari tautan Anda tidak benar
aditsu berhenti karena SE adalah EVIL
@aditsu Anda memang benar. Saya tidak yakin apa yang saya sentuh, saya bersumpah itu berfungsi dengan baik. Saya akan memeriksanya.
Runer112
@aditsu Ternyata pengurangan tidak komutatif. Terima kasih telah menunjukkan bahwa itu rusak, itu cukup mudah untuk diperbaiki. Tetapi sekarang salah satu komentar menyentuh kode. :(
Runer112
2

CJam, 90 69 byte

q_,mqi):L_*Lm2/(:X;{_X_@="^<v>"_@#_[WL1LW*]=X+:X;)=tX)L%XW>XLL(*<**}g

Besar untuk sekarang, masih bisa dikurangi banyak.

Cobalah online di sini

Pengoptimal
sumber
1
Kutukan, digagalkan lagi! Saya baru saja akan memposting oleh solusi CJam 70 byte, tetapi sepertinya itu akan membutuhkan pemikiran ulang sekarang.
Runer112
1

JavaScript (ES6) 121 120 127 129

Fungsi bernama yang mendapatkan string sebagai parameter input dan mengembalikan output.
Dengan asumsi string input diakhiri dengan baris baru.

Edit perbaikan bug, .search () tidak berfungsi dengan baikundefined

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('')

Tidak diikat dan dijelaskan

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
}

Uji di Firefox / konsol FireBug

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

Keluaran

>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<
edc65
sumber