Izgara üzerinde rotor yönlendiriciler


10

Giriş

Girişiniz , bir tamsayı için 2n+1satır satırları ile uzunluk satırlarına ayrılmış tek bir dizedir . Tam sayı girdinin bir parçası değildir; dizeden hesaplamanız gerekir. Satırlar "yön karakterlerinden" oluşur . Yeni satırlar sorun çıkarsa, bunları dikey borularla değiştirebilirsiniz .2n+1n ≥ 0n>^<v|

Girdi, kare büyüklüğünde bir ızgara oluşturur (2n+1)x(2n+1)ve ızgaranın her hücresi , dört kardinal yönden birine işaret eden bir rotor yönlendirici olarak yorumlanır . Ağın ortasındaki yönlendiriciye bir belirteç bırakmaya devam ediyoruz ve ardından yönlendiriciler aşağıdaki şekilde hareket ettirecek. Jeton bir yönlendiricinin üzerine geldiğinde, yönlendirici saat yönünün tersine 90 derece döner ve jetonu işaret ettiği yeni yönde bir adım taşır. Başka bir yönlendiriciye inerse, işlem tekrarlanır, ancak sonunda belirteç ızgaradan düşecektir.

Çıktı

Çıktınız, yönlendiricilerin girişle aynı biçimde son yapılandırmasıdır.

Misal

Örnek bir girdi olarak, 3x3ızgarayı düşünün

<^<
^><
>^v

merkezi yönlendiricinin belirteci belirtmek için vurgulandığı yerlerde (görmek biraz zor). Merkezi yönlendirici kuzeye bakacak şekilde döner ve jetonu üst sıranın merkezi hücresine taşır:

<^<
^^<
>^v

Bu yönlendirici batıya dönük olarak döner ve jetonu sol üst köşeye gönderir:

<<<
^^<
>^v

Köşedeki yönlendirici jetonu güneye gönderir, bu yüzden şimdi orta sıranın en soldaki hücresindedir:

v<<
^^<
>^v

Bu yönlendirici batıya dönük olarak döner ve jetonu ızgaradan gönderir.

v<<
<^<
>^v

Bu son ızgara yapılandırmasıdır, bu nedenle programınız çıktı almalıdır. Daha karmaşık örneklerde, simgenin ızgaradan düşmeden önce aynı yönlendiriciyi birkaç kez geçirebileceğini unutmayın.

kurallar

Bir işlev veya tam bir program yazabilirsiniz. Bu kod golf, bu yüzden en düşük bayt sayısı kazanır. Standart boşluklara izin verilmez. Girdi ve / veya çıktıda bir satırsonu olup olmadığına karar verebilirsiniz.

Test Durumları

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
^<<<<<<<<

"Doğuya döner" iki örneği "batıya dönüyor" demeli mi?
Peter Taylor

@PeterTaylor İyi yakalama. Her zaman ikisini karıştırıyorum.
Zgarb

Giriş dizesi bir satırsonu ile sonlandırıldı mı?
edc65

@ edc65 Çıktı için de kendiniz karar verebilirsiniz. Yine de önceki satırlar yoktur.
Zgarb

Yanıtlar:


3

CJam, 62 61 63 bayt

Çevrimiçi deneyin

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

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

Genişletilmiş ve yorum yapılan:

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

Benim çözümüm girdi üzerinde düz bir dize olarak çalışıyor, bu yüzden takip etmek için sadece bir konum değeri var ve neredeyse hiçbir ön / son işlem yok; ızgaranın başlangıcına yeni satır eklemek için yalnızca 2 bayt önişlem ve çıktıdan kaldırmak için 2 bayt son işlem vardır. Ancak bu 4 bayt, yeni satırları tutmamı ve yönlendiriciler gibi "çalıştırmamı" sağladıkları için maliyete değer, ancak başka bir yeni satıra "dönüyorlar" ve konumu sıfıra ayarlıyorlar. Ve ana döngü konum sıfır olduğunda sona erer.


Önceki satırsonu maalesef gitmesi gerektiğine hükmedeceğim; sadece izleyenlere izin verilir.
Zgarb

@Zgarb Sabit, +2 bayt.
Run1112

Bağlantınızdaki çıktı doğru değil gibi görünüyor
aditsu çıkmak SE çünkü EVIL

@aditsu Gerçekten haklısın. Neye dokunduğumdan emin değilim, eskiden işe yaradı. Ben bakacağım.
Run1112

@aditsu Çıkarma değişmeli değil. Kırıldığına dikkat çektiğiniz için teşekkür ederiz, düzeltilmesi kolaydı. Ama şimdi yorumlardan biri koda dokunuyor. :(
Runer112

2

CJam, 90 69 bayt

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

Şimdilik çok büyük, hala çok azaltılabilir.

Buradan çevrimiçi deneyin


1
Lanetler, yine başarısız oldu! 70 bayt CJam çözümü ile yayınlamak üzereydim, ama şimdi yeniden düşünmek gerekiyor gibi görünüyor.
Run1112

1

JavaScript (ES6) 121 120 127 129

Dizeyi bir girdi parametresi olarak alan ve çıktıyı döndüren adlandırılmış bir işlev.
Giriş dizesinin yeni satırla sonlandırıldığı varsayılarak.

Düzen hata düzeltme, .search () ile iyi çalışmıyorundefined

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

Açık ve açık

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 konsolunda test et

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

Çıktı

>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.