Мне нравится кривая Гильберта .
Ваша задача для этой задачи состоит в том, чтобы взять изображение (строго квадратное изображение, где все стороны имеют степень ширины в два пикселя), расправить его построчно зигзагообразно и растянуть его обратно по псевдогильбертовой кривой. ,
Unraveling
Чтобы распутать, вы начнете с пикселя в верхнем левом углу и двигаетесь вправо, пока не дойдете до края изображения. Как только вы дойдете до края изображения, вы переместитесь вниз к следующему ряду и начнете движение влево, пока не дойдете до края снова. Вы будете продолжать распутывать строки за строкой, переключая направление каждый раз, чтобы получить одну непрерывную кривую. Это должно выглядеть как хорошо играемая игра змеи
Результат распутывания должен быть порядка пикселей, который включает каждый пиксель ровно один раз
Reraveling
Как только у вас будет порядок для пикселей, вы переставите их на новом холсте одинакового размера, следуя пути псевдогильбертовой кривой. Для изображения 2**n
квадратного размера вы должны использовать n-ю итерацию псевдогильбертовой кривой. Каждый пиксель будет размещен ровно в одном месте на новом холсте. Вы должны перерисовать изображение так, чтобы точка, изначально находящаяся в верхнем левом углу (начало нашей кривой змей), оставалась там, а точка в правом нижнем углу (конец нашей кривой змей) была помещена в верхнем правом углу.
I / O
Ваша программа или функция должны получать изображение с указанными ограничениями стандартными методами и выводить другое изображение стандартными методами.
счет
Это программа для игры в гольф с минимальным количеством байтов.
Примеры
вход
Выход
вход
Выход
вход
Выход
Я также рекомендую провести тестирование на чистом белом или сплошном цветном изображении, чтобы убедиться, что вы не пропустили ни одного пикселя.
Не стесняйтесь включать свои собственные результаты в свои ответы!
источник
Ответы:
Mathematica,
286273 байтаУф! Сложно, но весело!
объяснение
Преобразовать
Image
в массив значений RGB.Генерирует с
l
помощьюl
массива с головой1
, гдеl
есть длина входного сигнала (т.е. ширины изображения).Это дает
{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}
(l
написано заглавными буквами, чтобы уменьшить путаницу)StringReplace
Функция , которая заменяет каждый"L"
с"+RF-LFL-FR+"
и"R"
с"-LF+RFR+FL-"
Примените
StringReplace
функцию кString
"L"
,Log2[l]
раз.Преобразование Результирующего
String
вList
персонажах.Безымянная функция, которая:
"-"
умножьте второй элемент первого входа наI
."+"
, разделите второй элемент первого входа наI
."F"
, увеличьте первый вход наReIm
(отделяет действительную и мнимую часть входа) от второго входа.Начиная с
{{1,1},I}
кумулятивного применения вышеуказанной безымянной функции, используя каждый элементList
символов в качестве второго ввода. Этот код выдает результаты всех итераций.Избавьтесь от вторых элементов каждого
List
и удалите дубликаты. (Шаги до этой точки генерируютList
координаты кривой Гильберта)Распутайте входной массив RGB (переворачивает каждую вторую строку и выравнивает).
Создайте
Rule
объекты так, чтобы первый элемент в первом входе (координаты кривой Гильберта) был связан с первым элементом второго входа (развернутым изображением), вторым элементом со вторым входом и так далее.Примените эти замены
Rule
дляArray
второго этапа.Преобразовать в массив значений RGB в
Image
.Образец в / из
Входные данные:
Выход:
Входные данные:
Выход:
Обратная функция (
266253 байта)источник
Октава 234 байта
Имена файлов входных и выходных изображений должны предоставляться из стандартного ввода. размер кода без ввода / вывода составляет 194 байта .
Объяснение:
Базовая структура индексов:
В каждой итерации 4 копии из результата предыдущей итерации и некоторое преобразование, применяемое к каждой копии, затем все блоки объединяются для формирования текущего результата.
итак имеем:
Сортировка индексов Гильберта и возвращение индексов отсортированных элементов:
Распутывание применяется переворачиванием всех четных строк:
Применяется перераспределение:
-S повторяется для каждого канала
-Перестановка применяется, так как в данных октавы расположены по столбцам
Примеры изображений:
источник