Роторные маршрутизаторы на сетке


10

вход

Ваш ввод представляет собой одну строку, разделенную новыми 2n+1строками на строки длины 2n+1для некоторого целого числа n ≥ 0. Целое число nне является частью ввода; Вы должны будете вычислить это из строки. Линии состоят из «символов направления» >^<v. Если новые строки представляют проблему, вы можете заменить их вертикальными трубами |.

Входные данные образуют квадратную сетку размера (2n+1)x(2n+1), и каждая ячейка сетки интерпретируется как маршрутизатор ротора , который указывает в одном из четырех основных направлений. Мы продолжаем сбрасывать токен на маршрутизаторе в центре сетки, а затем маршрутизаторы перемещают его следующим образом. Когда токен приземляется на маршрутизаторе, он поворачивается на 90 градусов против часовой стрелки и перемещает токен на один шаг в новом направлении, на которое он указывает. Если он приземляется на другом маршрутизаторе, процесс повторяется, но в итоге токен падает с сетки.

Вывод

Ваш вывод является окончательной конфигурацией маршрутизаторов, в том же формате, что и вход.

пример

В качестве примера ввода рассмотрим 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
^<<<<<<<<

Должны ли два случая «вращаться на восток», сказать «вращается лицом к западу»?
Питер Тейлор

@PeterTaylor Хороший улов. Кажется, я всегда путаю их.
Згарб

Входная строка заканчивается новой строкой?
edc65

@ edc65 Вы можете решить это сами, также для вывода. Тем не менее, нет никаких новых строк.
Згарб

Ответы:


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

Мое решение работает с входом в виде плоской строки, поэтому есть только одно значение позиции для отслеживания и практически нет предварительной / постобработки; есть только 2 байта предварительной обработки, чтобы добавить новую строку в начало таблицы, и 2 байта последующей обработки, чтобы удалить ее из вывода. Но эти 4 байта хорошо стоят своих затрат, так как они позволяют мне сохранять переводы строки и «выполнять» их как маршрутизаторы, но они «вращаются» в другой перевод строки и устанавливают позицию в ноль. И основной цикл заканчивается, когда позиция становится нулевой.


Я постановлю, что предыдущий символ новой строки, к сожалению, должен уйти; разрешены только конечные.
Згарб

@Zgarb Исправлено, +2 байта.
Runer112

Похоже, что вывод по вашей ссылке неправильный
aditsu ушел, потому что SE ЗЛО

@aditsu Вы действительно правы. Я не уверен, что я коснулся, я клянусь, это работало нормально. Я посмотрю на это.
Runer112

@aditsu Оказывается, вычитание не является коммутативным. Спасибо за указание, что он был сломан, это было достаточно легко исправить. Но теперь один из комментариев касается кода. :(
Runer112

2

CJam, 90 69 байтов

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

Огромный сейчас, все еще может быть значительно уменьшен.

Попробуйте онлайн здесь


1
Проклятия, сорванные снова! Я как раз собирался опубликовать 70-байтовое CJam-решение, но, похоже, сейчас потребуется некоторое переосмысление.
Runer112

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
^<<<<<<<<
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.