Натхненний цим питанням
Ще один спосіб розкрутити 2D-зображення в 1D-рядок - це використовувати криву Гільберта.
Існує багато версій цієї кривої, залежно від кількості ітерацій, використаних під час її обчислення. Нижче наводимо приклад Гільберт Кривих від першого до п’ятого порядку.
Спосіб обчислення цієї кривої полягає в наступному. Спочатку визначимо криву Гільберта першого порядку як ту, що показана на рисунку (той, що для n = 1), так що він вписується в квадрат 1х1. Ми робимо чотири екземпляри цієї кривої, розташовуючи їх у квадраті 4х4, щоб усі вони представляли «увігнутість» у лівій частині. Потім перевертаємо дві криві лівого порядку 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 ]
Використовуючи Гільберт Криву другого порядку
Як правило, стандартні лазівки не дозволяються.
Це код-гольф, тому найкоротша відповідь у байті виграє.