Вдохновленный этим вопросом
Другой способ развернуть двумерное изображение в одномерную строку - использовать кривую Гильберта.
Существует много версий этой кривой, в зависимости от количества итераций, используемых при ее вычислении. Ниже приведен пример Кривых Гильберта от первого до пятого порядка.
Способ вычисления этой кривой заключается в следующем. Сначала мы определяем кривую Гильберта первого порядка, как показано на рисунке (для 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 ]
Использование кривой Гильберта второго порядка
Как обычно, стандартные лазейки не допускаются.
Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
источник
Ответы:
MATL ,
8685 байтЭто решение основано на записи обмена файлами Джонаса Лундгрена, которая использует комплексные числа для генерации кривой Гильберта. Эти комплексные числа затем преобразуются в значения индекса, чтобы извлечь элементы матрицы, которые попадают вдоль кривой.
Попробуйте онлайн!
объяснение
источник
APL (Dyalog Unicode) , 41 байт SBCS
Сохранено 30 байтов (!) Благодаря советам мудрости APL Orchard, особенно @ngn и @ Sherlock9.
Попробуйте онлайн!
Объяснение следующим образом:
Подробнее о " монаданных транспонировании ".
Дьялог документация на охрану ошибок .
источник
Mathcad, 302 байта
Приведенная ниже программа Mathcad основана на программе Python @ Sherlock9. Он отличается тем, что изгибает прямоугольные матрицы, игнорируя те части кривой Гильберта, которые лежат за пределами границ матрицы. Обратите внимание, что поскольку Mathcad имеет относительно плохую обработку строк, я сопоставил символы Lindenmayer с целыми числами в функции Гильберта.
Mathcad работает через 2D-интерфейс, который позволяет пользователю размещать (и свободно смешивать) математические выражения, графики, текст, входные и выходные данные. Я приравнял байт к минимальной эквивалентной операции клавиатуры пользователя для создания символа (например, оператор определения (: =) вводится простым вводом:.
источник
Python 3,
327289275271239234 байтаЭто решение я изменил из своего ответа на другой вопрос о кривой Гильберта здесь . Любые советы по гольфу приветствуются.
Изменить: Изменено, как
g
увеличивается и уменьшается. Теперь с помощьюeval()
иstr.translate
. Больше не используюl=len(s)
.Ungolfed:
источник
Вольфрам - 233
Основываясь на представлении в системе Lindenmayer :
источник
Рубин,
224221216 байтЭтот ответ основан на моем ответе Python .
Ungolfing:
источник
CJam, 60
Попробуйте онлайн
Объяснение:
Я строю фрактал как последовательность направлений движения: 0 = вправо, 1 = вниз, 2 = влево, 3 = вверх.
источник