Представьте себе поджигателя, гуляющего по городу и собирающего его жертв в соответствии с очень специфическим рисунком (или, альтернативно, представьте себе пчелу, летящую по саду и собирающую цветы для опыления в соответствии с очень специфическим рисунком ). Скажем, город представляет собой матрицу N × N , где N - это целое число, большее или равное 2 . Поджигатель начинает с верхнего левого угла и последовательно устанавливает точки дома М перед собой (где М - номер дома, в котором они находятся), изменяя направление движения после каждого пожара в следующем порядке: Восток, Юг, Запад, Север, Восток, Юг ... и так далее. колыбельнаяПоджигатель - это значение М, которое заставляет их покинуть город (то есть последний дом, который они посещают перед тем, как остановить мерзость). Это гораздо проще понять на примере. Возьмите следующую матрицу, например:
3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Мы начинаем в верхнем левом углу, поэтому M = 3 (
X
отмечает текущую и предыдущую позиции поджигателя):X 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Согласно известному порядку, он сначала идет на восток (3) пятна и приземляется на 2, поэтому M изменяется соответственно:
X 2 3 X 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Тогда это идет на юг 2 пятна, и M теперь 1 :
X 2 3 X 7 3 1 4 1 6 2 5 3 X 1 4 4 3 2 4 1 1 1 1 1
- Теперь он перемещается на 1 позицию на запад, а М становится 3 :
X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
- После того, как он движется на 3 точки на север, он выходит из города! Следовательно, 3 - это колыбельная этого поджигателя:
Икс X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
Учитывая N × N матрицу (вы также можете принять N в качестве входных данных), найдите колыбельную поджигателя. Я написал программу, с помощью которой вы можете сгенерировать больше тестов и визуализировать путь поджигателя: попробуйте онлайн!
- Можно предположить , что поджигатель делает есть колыбельную (то есть, на самом деле может выйти из матрицы).
- Для простоты матрица будет содержать только положительные целые числа, меньшие или равные 9 (цифрам). Решения, которые обрабатывают любое положительное целое число, полностью приветствуются.
- Обратите внимание, что поджигатель может приземлиться в месте, где он уже сожжен, в случае, если смысл, в котором он движется, отличается от первого раза. В таком случае просто возьмите значение этого элемента и двигайтесь снова, как обычно.
- Вы можете соревноваться на любом языке программирования и можете принимать и выводить данные любым стандартным методом , при этом отмечая, что эти лазейки по умолчанию запрещены. Это код-гольф , поэтому выигрывает самое короткое представление (в байтах) для каждого языка .
Контрольные примеры
------------- 9 2 3 1 7 2 8 7 6 Колыбельная: 9 ------------- 2 1 2 1 3 1 1 2 1 2 2 1 1 1 1 3 Колыбельная: 2 ------------- 3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1 Колыбельная: 3 ------------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Колыбельная: 2 ------------- 3 2 1 2 1 1 1 2 3 2 3 2 1 1 2 1 1 1 3 1 2 3 1 1 1 1 1 1 4 5 2 3 1 1 1 1 2 1 2 1 2 2 1 2 2 3 2 1 2 Колыбельная: 3 -------------
Матрицы в другом формате:
[[9, 2, 3], [1, 7, 2], [8, 7, 6]] [[2, 1, 2, 1], [3, 1, 1, 2], [1, 2, 2, 1], [1, 1, 1, 3]] [[3, 2, 3, 2, 7], [3, 1, 4, 1, 6], [2, 5, 3, 1, 1], [4, 4, 3, 2, 4], [ 1, 1, 1, 1, 1]] [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]] [[3, 2, 1, 2, 1, 1, 1], [2, 3, 2, 3, 2, 1, 1], [2, 1, 1, 1, 3, 1, 2], [ 3, 1, 1, 1, 1, 1, 1], [4, 5, 2, 3, 1, 1, 1], [1, 2, 1, 2, 1, 2, 2], [1, 2, 2, 3, 2, 1, 2]]
Пятый контрольный пример очень интересен для визуализации .
источник
Ответы:
MATL , 32 байта
Попробуйте онлайн! Или проверьте все тестовые случаи .
Как это работает
Входная матрица дополняется рамкой из пяти нулей, например,
становится
Рамка нулей используется для определения того, когда пчела-
поджигательпокинула матрицу. Расширение с пятью нулями гарантирует, что модульное смещение длины вплоть до9
любого направления от любой ненулевой записи будет корректно попадать в ноль, не переходя к некоторой ненулевой записи.В матричных координатах пчела начинается с входа
(6,6)
в расширенную матрицу. Он читает эту запись и обновляет координаты по мере необходимости, применяя (модульное) смещение длины считывания в соответствующем направлении. Это повторяется в цикле, пока не будет прочитано значение0
. Запись, которая была прочитана до этого (то есть последняя ненулевая запись), является выходной.Координаты на самом деле хранятся в виде комплексного числа, например,
(6,6)
становится6+6j
. Таким образом, четыре циклических направления могут быть реализованы как степени мнимой единицы. Соответствующая мощность (j
,1
,-j
или-1
) умножаются на записи для чтения , чтобы получить сложное перемещение , которое используется для обновления координат.Последовательные считанные значения хранятся в стеке. Когда цикл завершается, в стеке содержатся все ненулевые значения чтения по порядку, затем последнее значение чтения
0
, а затем последние комплексные координаты. Таким образом, третий верхний элемент - это требуемый результат.источник
JavaScript (ES6),
7068 байтПопробуйте онлайн!
комментарии
Учитывая, что по модулю в JS используется знак дивиденда, направление обновляется следующим образом:
источник
Древесный уголь ,
2518 байтПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Напечатайте входную строку, но не перемещайте позицию печати.
Поверните шарнир влево, чтобы направление печати стало вверх.
Повторите, пока под позицией печати находится символ.
Сохраните символ в переменной.
Приведите персонажа к числу и выведите столько строк перевода. Поскольку направление печати увеличено, печать заканчивается горизонтально. В результате мы переместили позицию печати в желаемом направлении на величину, указанную числом под позицией печати.
Поверните ось поворота, чтобы следующие новые строки переместили позицию печати в следующем направлении по часовой стрелке для следующего прохода цикла.
К сожалению, у нас все еще есть входные данные, загромождающие наш холст, и еще более к сожалению, если мы очищаем холст, мы также очищаем нашу переменную. Итак, это небольшая хитрость: список пустой строки и переменной зацикливается. На первом проходе цикла переменная цикла пуста, поэтому холст, переменная цикла и переменная результата очищаются. Но цикл еще не закончен! На втором проходе цикла мы все равно получаем доступ к нашей переменной, тщательно сохраненной в нашем списке циклов. Осталось просто напечатать его.Очистите холст и распечатайте сохраненную переменную. (Спасибо @ ASCII-только за исправление углем.)
источник
Python 2 ,
8584 байтаПопробуйте онлайн!
Совет о»шляпа г Xcoder на 1 байт.
источник
Древесный уголь ,
504946343326 байтовПопробуйте онлайн
Ссылка на подробную версию кода
Ввод должен быть N на отдельной строке, затем строки массива на отдельных строках после этого.
Любые способы сбить байты приветствуются и желательны, так как я не очень хороший игрок в древесный уголь!
-12 байт благодаря @Neil! -1 байт благодаря @ ASCII-only! -7 байт благодаря @ ASCII-only (исправлена ошибка, приводившая к
Clear
сбросу переменных)источник
Красный , 145 байт
Попробуйте онлайн!
Более читабельно:
источник
Perl 6 , 62 байта
Попробуйте онлайн!
Принимает матрицу как плоский список и ширину.
источник
Чисто , 141 байт
Попробуйте онлайн!
Определяет функцию
? :: {#{#Int}} -> Int
, беря распакованный массив неупакованных массивов целых чисел и возвращая результат.источник
Java 8, 121 байт
Попробуйте онлайн.
Альтернатива с таким же байтовым числом 121 байта:
Использует try-finally вместо проверки, находится ли
x,y
-coordinate в границах.Попробуйте онлайн.
Объяснение:
источник
Perl 5 , 92 байта
Попробуйте онлайн!
Как?
Набор вложенных карт и объединение производят это:
который затем оценивается, чтобы определить, заканчивается ли цикл. Поскольку логическое значение оценивается слева направо, значение
$n
фактически изменяется (до) четыре раза в течение оценки. Поскольку булево логическое короткое замыкание в Perl, значением$n
является колыбельная при выходе из цикла.источник
Python 3 ,
8584 байтаxcoder: -1 (я никогда не помню трюк + ~)
Попробуйте онлайн!
Вместо того, чтобы двигаться в разных направлениях (E, S, W, N), это решение всегда перемещается на восток и поворачивает сетку против часовой стрелки после каждого движения. После поворота последний столбец стал первой строкой, поэтому, если индекс строки меньше нуля, это означает, что мы сбежали с доски.
источник
-d-1
=>+~d
Сетчатка , 161 байт
Попробуйте онлайн!
источник