Учитывая набор замкнутых непересекающихся 2d контуров (разделенных хотя бы одним пробелом даже по диагонали) со стрелками, ориентированными последовательно в одном и том же направлении по часовой стрелке или против часовой стрелки (каждый контур имеет свое направление) и положительным числом n
, переместите стрелки n
шаги по контурам в соответствующем направлении. Стрелки обозначены > v < ^
соответственно для направления вправо, вниз, влево и вверх. Там другие символы -
(горизонтальный), |
(вертикальный) и +
(угол). Когда стрелка находится в углу, она сохраняет свое текущее направление и меняет его только после выполнения поворота.
Между любыми двумя углами всегда будет прямой отрезок (или пространство) (как +-+
для горизонтали, так и для вертикали) - другими словами, резкие 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
Напишите функцию или программу, решающую вышеуказанную задачу. Самый короткий код в байтах на каждом языке выигрывает. Не разочаровывайтесь языками игры в гольф. Объяснение алгоритма и кода высоко ценится.
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.
Ответы:
JavaScript (ES6),
210 ... 182180 байт(m)(n)
Попробуйте онлайн!
Как?
Вы можете перейти по этой ссылке, чтобы увидеть отформатированную версию источника.
обертка
Метод обновления
Мы не можем безопасно перемещать каждую стрелку по одной за раз, потому что мы рискуем перезаписать не обновленные стрелки новыми. Вместо этого мы сначала удаляем все стрелки и вычисляем их новые позиции. Мы применяем новые позиции во второй раз.
Новые позиции применяются просто делая
eval(n)
.Направления
$
уголки
+
-
|
$
"$"
"$"
"$"
Анимированная версия
Показать фрагмент кода
источник
К (нгн / к) ,
183 161157 байтПопробуйте онлайн!
{
}/
при вызове с левым аргументом int, функция будет применена{
}
n раз к правому аргументуA:"^>v<"
стрелыD,:-D:(-1 0;!2)
∆y, ∆x для 4-х основных направленийs:(#x;#*x)
Форма ввода: высота, ширинаc:~^x
countours - логическая матрица, показывающая, где находятся непробелыr:" -+|"c*+/'3'0,c,0
воссоздать матрицу символов с контуром, но без стрелок, считая self + upper + lower для каждой ячейкиc
и заменяя 1->-
, 2->+
, 3->|
t:A?,/x
типы стрелок: 0 1 2 3 для^>v<
, все остальные ячейки представлены как0N
(ноль)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#
изменить первоначальную формуисточник
Древесный уголь , 105 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Включает 22 байта, используемых, чтобы избежать необходимости громоздкого входного формата. Объяснение:
Удобно вводим контуры и количество шагов.
Символы направления используются несколько раз, поэтому строка кэшируется здесь. Индекс символа направления в этой строке называется его направлением.
Напечатайте исходные контуры без перемещения курсора.
Обведите символы в контуре.
Если текущие символы являются символом направления ...
... затем сохраните направление и позицию в списке ...
... и замените символ соответствующим символом строки.
В противном случае выведите символ и перейдите к следующему символу.
Зациклите сохраненные позиции.
Перейти в сохраненную позицию.
Извлеките сохраненное направление.
Зациклиться на соответствующем количестве шагов.
Найдите направление следующего шага - любое направление, которое не является ни обратным, ни пустым.
Сделайте шаг в этом направлении. (Индексы направления древесного угля для
Move
команды в два раза больше моего направления.)Напечатайте соответствующий символ направления.
источник
APL (Dyalog Unicode) , 111 байтов SBCS
Попробуйте онлайн!
похоже на мой ответ
источник