Вдохновленный этим вопросом
Другой способ развернуть двумерное изображение в одномерную строку - использовать кривую Гильберта.
Существует много версий этой кривой, в зависимости от количества итераций, используемых при ее вычислении. Ниже приведен пример Кривых Гильберта от первого до пятого порядка.
Способ вычисления этой кривой заключается в следующем. Сначала мы определяем кривую Гильберта первого порядка, как показано на рисунке (для n = 1), чтобы она помещалась в квадрат 1x1. Затем мы делаем четыре копии этой кривой, располагая их в квадрате 4x4, чтобы они все представляли «вогнутость» в левой части. Затем мы переворачиваем две крайние левые кривые порядка 1, чтобы верхняя вогнутость была обращена к вершине, а нижняя - к нижней. Наконец, мы соединяем углы соседних кривых Гильберта. Если вы хотите получить кривую (n + 1) -порядка, нам просто нужно повторить процесс с четырьмя кривыми n-го порядка. Мы можем увидеть визуализацию процесса здесь (я также добавлю изображение, детализирующее процесс в ближайшее время)
Ваша задача в этой задаче - развернуть матрицу целых чисел вдоль кривой Гильберта самого низкого порядка для этой матрицы.
Для простоты у нас будет кривая, начинающаяся с верхнего левого угла матрицы.
Вы можете получить входные данные в виде списка целых чисел, где каждый подсписок представляет строку матрицы.
Вы можете предположить, что на входе будет квадратная матрица (n * n).
Например:
Входные данные:
[[ 1, 2,]
[ 3, 4 ]]
Выход:
[ 1, 2, 4, 3 ]
Поскольку мы используем кривую Гильберта первого порядка, показанную на рисунке
Входные данные:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Выход:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Использование кривой Гильберта второго порядка
Как обычно, стандартные лазейки не допускаются.
Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.