Матричный торнадо, как и любой другой торнадо, состоит из вещей, вращающихся вокруг центра. В этом случае элементы матрицы вместо воздуха.
Вот пример матричного торнадо:
Сначала мы разбиваем матрицу на квадратные кольца, каждая секция состоит из элементов, которые находятся дальше от границы на одинаковое расстояние. Эти секции будут вращаться по часовой стрелке вокруг центра. В реальных торнадо серьезность возрастает по направлению к центру, как и шаг вращения в матричном торнадо: крайняя часть (красная) поворачивается на 1 шаг, следующая (желтая) - на 2, и так на. Шаг вращения - это поворот на 90 ° вокруг центра.
Задача:
Ваша задача, если вы примете это, - написать функцию или программу, которая принимает в качестве входных данных квадратную матрицу, применять к ней эффект торнадо и затем выводить полученную матрицу.
Входные данные:
На входе должна быть квадратная матрица порядка n
где n >= 1
. Не следует делать никаких предположений об элементах матрицы, они могут быть чем угодно.
Выход:
Квадратная матрица того же порядка, которая будет результатом применения эффекта тронадо к входной матрице.
Примеры:
Матрица заказа n = 1
:
[['Hello']] ===> [['Hello']]
Матрица заказа n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Матрица заказа n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Ответы:
Python 3 , 100 байт
Попробуйте онлайн!
источник
a[1:-1,1:-1]=f(a[1:-1,1:-1])
как будто это самая обычная вещь в мире, чтобы напрямую получить и установить все внутри двухмерного массиваnumpy
numpy.rot90(a,1,(1,0))
короче на 3 байта и тоже должно работать.if len(a):a=...
-1 байт).Древесный уголь , 44 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Работает только на символьных квадратах, потому что ввод-вывод по умолчанию в Charcoal не дает нормальных значений. Объяснение:
Прочитайте квадрат персонажа.
Цикл, пока он не пуст.
Поверните это.
Напечатайте его, но затем переместите курсор на один квадрат по диагонали от исходного угла.
Обрезать снаружи от массива.
источник
Желе , 27 байт
Попробуйте онлайн!
Я думаю, что это может быть намного короче.
источник
µG
нижний колонтитул и заявить, что ваша заявка составляет 25.Perl 6 ,
78 7372 байтаСпасибо nwellnhof за -5 байтов!
Попробуйте онлайн!
Блок рекурсивного кода, который принимает сплющенный 2D-массив и возвращает аналогично сплющенный массив.
Объяснение:
источник
@a[*;*]
вместоmap |*,@a
чтобы сгладить массив. (Было бы неплохо, если бы был способ работать с необработанными массивами и многомерными подписками, но я не могу придумать ни одного.)@a[1..*-2;1..@a-2].=$!
работает.Октава ,
8681 байтПопробуйте онлайн!
Я знаю, что рекурсивные анонимные функции - не самый короткий метод для действий в Octave, но на сегодняшний день это самый забавный метод. Это самая короткая анонимная функция, которую я мог придумать, но я бы хотел быть вне игры.
объяснение
Рекурсивная функция определяется в соответствии с этим советом, ответ от потолка.
q=f(f=@(g)@(M) ... g(g)(M) ...
является базовой структурой такой анонимной функции сg(g)(M)
рекурсивным вызовом. Так как это будет рекурсией на неопределенное время , мы оборачиваем рекурсивный вызов в массиве условной ячейки:{@()g(g)(M),M}{condition}()
. Анонимная функция с пустым списком аргументов задерживает оценку после выбора условия (хотя позже мы увидим, что мы можем использовать этот список аргументов для определенияz
). До сих пор это была только базовая бухгалтерия.Теперь о фактической работе. Мы хотим, чтобы функция возвращала
rot90(P,-1)
с помощью P матрицу, для которойg(g)
был рекурсивно вызван центральный элемент M. Мы начнем с установки,z=2:end-1
которую мы можем скрыть в индексировании M. Таким образом,M(z,z)
выбирается центральная часть матрицы, которая должна быть торнадо дальше рекурсивным вызовом.,3
Часть гарантирует , что повороты по часовой стрелке. Если вы живете в южном полушарии, вы можете удалить этот бит на -2 байта.Затем мы делаем
M(z,z)=g(g)M(z,z)
. Однако результатом этой операции является только измененная центральная часть, а не всяP
матрица. Следовательно, мы делаем то,{M(z,z)=g(g)M(z,z),M}{2}
что в основном украдено из этого совета подсказок Stewie Griffin.Наконец,
condition
рекурсия останавливается только тогда, когда ввод пуст.источник
R , 87 байт
Попробуйте онлайн!
источник
seq(0.5)
возвращает 1 вместо пустого вектора)MATL ,
25 24 2322Попробуйте онлайн!
Индексирование в MATL никогда не бывает легким, но с некоторыми играми в гольф это на самом деле превосходит текущий лучший ответ Jelly ...
* Для
n x n
матрицы эта программа выполняетn
итерации, в то время как вам действительно нужны толькоn/2
вращения. Однако индексация в MATL (AB) достаточно гибкая, поэтому индексация невозможных диапазонов - просто запрет. Таким образом, нет необходимости тратить байты на правильное количество итераций.источник
Python 2 , 98 байт
Попробуйте онлайн!
источник
K (нгн / к) ,
413938 байтПопробуйте онлайн!
{
}
функция с аргументомx
#x
длинаx
- высота матрицы2##x
две копии - высота и ширина (предполагается одинаковыми)s:
назначитьs
для "формы"!s
все индексы матрицы с формойs
, например ,!5 5
являетсяЭто двухстрочная матрица (список списков), и ее столбцы соответствуют индексам в матрице 5х5.
&/
минимум по двум рядам:i&|i:
назначитьi
, повернуть вспять (|
) и взять минимумы (&
) сi
Это сплющенные кольцевые числа матрицы 5x5:
4!1+
добавить 1 и взять остатки по модулю 4(+|:)
это функция, которая вращается путем реверса (|
нам нужно,:
чтобы она была монадической), а затем транспонировать (+
поскольку это не самый правый глагол в «поезде», нам не нужен:
)4(+|:)\x
примените это 4 раза наx
, сохраняя промежуточные результаты,/'
сплющить каждого+
транспонирования(
)@'
индексировать каждое значение слева с каждым значением справаs#
изменить кs
источник
JavaScript (ES6), 99 байт
Попробуйте онлайн!
Как?
Дана квадратная матрица шириныW мы определяем:
Пример выводаTх , у для матрицы 5х5 (W= 5 , м = 2 ):
Начнем ск = м и выполнить вращение всех клеток на 90 ° по часовой стрелке ( х , у) удовлетворяющих:
в то время как остальные остаются без изменений.
Это эквивалентно тому, что ячейка не поворачивается, если мы имеем:
какой тест используется в коде:
Тогда мы уменьшаемК и начать снова, пока k = - 1 или к = - 3 / 2 (в зависимости от соотношения W ). В любом случае, это вызывает наше состояние остановки:
источник
Желе , 24 байта
Попробуйте онлайн!
- Линн
источник
ḷ""
выглядит волшебно для меня ^^ Не хотите добавить объяснение?ḷ""
это волшебно. Это простоḷ"
с дополнительным"
... о, есть небольшая вероятность того,ḷ"
что я тоже "изобрел" что-то, что не использовалось так много, так как его часто можно заменить одним атомом (не в этом случае, как вход может содержать0
тоже).Haskell , 108 байт
Попробуйте онлайн!
Я использовал транспонирование Лайкони и немного изменил его, чтобы повернуть массив на 90 °:
объяснение
r
вращает массив на 90 °.(!)
является функцией более высокого уровня: «применить к центру».g![1,2,3,4,5]
есть[1] ++ g[2,3,4] ++ [5]
.f
является функцией торнадо: базовые случаи имеют размер 1 и 2 (почему-то 0 не работает).В последней строке происходит волшебство: мы применяем
r.r.r.(f!).r
средние рядыx
и затем поворачиваем результат. Давайте назовем эти средние строки M . Мы хотим рекурсию на средние колонны из М , и получить на них, мы можем вращать M , а затем использовать(f!)
. Затем мы используемr.r.r
для поворота М обратно в исходную ориентацию.источник
Java 10,
198192 байта-6 байт благодаря @ceilingcat .
Попробуйте онлайн.
Объяснение:
b
в основном используется, чтобы указать, на каком кольце мы находимся. И затем он будет вращать это кольцо, включая все внутри него, один раз по часовой стрелке во время каждой итерации.Замена матрицы ввода выполняется потому, что Java является передачей по ссылке, поэтому простая установка
r=m
будет означать, что обе матрицы изменяются при копировании из ячеек, что приводит к неверным результатам. Поэтому нам нужно создать новуюObject
-матрицу (новую ссылку) и вместо этого скопировать значения в каждую ячейку.источник
MATLAB, 93 байта
Я уверен, что это может быть как-то еще в гольфе.
объяснение
источник
C (gcc) ,
128118115 байтов-15 байт от @ceilingcat
Попробуйте онлайн!
источник
Haskell, 274 байта
w
является основной функцией, которая имеет тип[[a]] -> [[a]]
который вы ожидаете.Я уверен, что более опытный игрок в Haskell мог бы улучшить это.
источник