Идея
Мы делали матричные спирали и раньше, и полные вращения, и даже диагональные вращения , но не, насколько я могу найти, змеиные повороты !
Что такое вращение змеи?
Представьте себе строки матрицы, извивающиеся взад-вперед, с разделителями между ними, как разделителями длинной очереди:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Теперь представьте, что эти элементы вращаются на 2. Каждый элемент движется вперед, как люди, движущиеся по линии, и элементы в конце выплескиваются и возвращаются в начало:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
Если количество строк нечетное, оно выйдет справа, но все равно будет перенесено в начало. Например, вот 3 поворота:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
Отрицательное вращение унесет вас назад. Вот вращение -2:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
Соревнование
Ваша функция или программа займет 2 входа в любом удобном формате:
- Матрица
- Целое число (положительное или отрицательное), указывающее, сколько мест его можно повернуть.
Он вернется:
- Вращаемая матрица
Заметки:
- Код гольф. Побеждает несколько байтов.
- Матрицы не обязательно должны быть квадратными, но должны содержать как минимум 2 строки и 2 столбца
- Положительные целые числа повернут ряд 1 вправо
- Отрицательные целые числа повернут строку 1 влево
- Вы можете изменить значение положительных / отрицательных чисел вращения, если это удобно
- Число вращения может быть больше, чем количество предметов. В этом случае он будет завернут. То есть оно будет эквивалентно числу по модулю количества предметов.
- Матрица будет содержать только целые числа, но может содержать любые целые числа, включая повторы
Тестовые случаи
Формат:
- матрица
- Номер поворота
- Ожидаемое возвращаемое значение
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
Ответы:
Желе , 10 байт
Диадическая ссылка, принимающая матрицу слева и целое число вращения справа (использует обратное значение положительного / отрицательного)
Попробуйте онлайн!
Как?
источник
R ,
121110101 байтПопробуйте онлайн!
Прохождение
источник
Python 3.8 (pre-releaseasSSSse) , 119 байт
Безымянная функция принятия,
matrix, rotation
которая дает новую матрицу.Использует противоположный знак вращения.
Попробуйте онлайн!
Как?
Мы настроили
n=-1
заранее, чтобы сэкономить на скобках позже и принять матрицу какm
и вращение какr
.Новая матрица строится с такими же размерами, как
m
- с ширинойw
(w:=len(m[0])
) и высотойh
(h:=len(m)
).Все остальные строки этой матрицы обращены (
[::n**j]
).Поиск значений производится путем вычисления их строки и столбца в оригинале
m
с использованием текущей строки элементовi
и столбцаj
...Мы настроены
s
наr+i
иk
к(j+s//w)%h
.k
строка оригинала для доступа к нашему текущему элементу.Чтобы легко получить доступ к нечетным индексированным строкам справа, мы обращаем такие строки перед доступом к их элементам (с помощью
[:n**k]
), это означает, что интересующий элемент находится вs%w
.источник
J ,
413021 байт-11 байт благодаря Ионе!
-9 байт благодаря FrownyFrog & ngn!
Попробуйте онлайн!
Перевернутый
+/-
источник
$@]t@$(|.,@(t=.#\,`(|.@,)/.]))
( Попробуйте онлайн! )&.
я пытался все время проигрывать левый аргумент, я сдался.JavaScript (Node.js) , 102 байта
Принимает вход как
(matrix)(integer)
. Значение знака целого числа инвертировано.Попробуйте онлайн!
Вспомогательная функция
Вспомогательная функцияграмм используется для «snakify» или «unsnakify» матрицы путем обращения строк с нечетными индексами.
Основная функция
источник
05AB1E , 16 байтов
Попробуйте онлайн!
Спасибо Эмигне за -5. К сожалению, я не вижу, как сыграть в гольф лишнюю часть. :(
источник
Древесный уголь , 36 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Обратные чередующиеся строки ввода.
Свести массив.
Поверните сплющенный массив.
Разбейте массив обратно на строки.
Обратные чередующиеся строки.
Конвертируйте каждую запись в строку и выводите в формате вывода по умолчанию, который представляет собой одно число на строку со строками с двойным интервалом. (Форматирование с разделителем обойдется в длину разделителя.)
источник
Pyth, 20 байтов
Попробуйте это онлайн здесь .
источник
Japt , 28 байт
Попытайся
Порт Арнаулда ответ . Самой большой проблемой было создание функции многократного использования. В частности, есть вспомогательная функция, которая переворачивает все остальные строки. Подход, который я использую, состоит в том, чтобы сделать рекурсивный вызов и в зависимости от того, установлена ли переменная.
Транспилированный JS:
источник
Python 3 , 94 байта
Попробуйте онлайн!
Использовал нечетное изменение строки из ответа Джонатана Аллана .
источник
APL (Dyalog Classic) , 20 байтов
Попробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 141 байт
Попробуйте онлайн!
Всего -5 байт благодаря @someone!
Анонимная функция, которая выполняет модификацию матрицы ввода на месте.
Один цикл перебирает ячейки. Вы можете сканировать сверху вниз и слева направо, используя следующие формулы:
row=i/w
col=i%w
Где
i
находится счетчик цикла иw
количество столбцов. Это немного отличается при сканировании в виде змеи.row=i/w
col=i%w
(0-й, 2-й, 4-й и т. Д. Ряд)col=w-i%w-1
(1-й, 3-й, 5-й и т. Д. Ряд)Еще одна вещь, которую стоит отметить, это то, что
%
в C # не преобразуется в положительное значение, как в некоторых других языках. Для этого требуется пара дополнительных байтов.источник
dynamic
; комментарий тоже л. Попробуйте онлайн!var
для игры в гольф, которая не позволяет вам объявить список переменных. Вероятно, почему я пропустил это. Хороший улов!y
целиком, чтобы сэкономить 2 байта: попробуйте онлайн!