Кривая Гильберта - это тип кривой заполнения пространства, и она в основном отображает линию на плоскость. Каждая точка на линии соответствует только одной точке на плоскости, а каждая точка на плоскости соответствует только одной точке на линии. Показаны итерации с 0 по 4 кривой Гильберта:
Итерации от 0 до 4:
Цель этой задачи: написать код, который рисует четвертую итерацию кривой Гильберта, как определено выше. Ваш код должен быть полным - другими словами, если вы создаете функцию для рисования кривой Гильберта, ваш код должен вызывать эту функцию. Вывод может быть либо отображен непосредственно на экране, либо вы можете записать вывод в файл изображения. Кривая может быть повернута или перевернута, но линии должны пересекаться под прямым углом, и выход не может быть растянут. Искусство ASCII ценится, но не будет принято. Самый короткий код в байтах побеждает!
источник
Ответы:
R, 90 байт
Бесстыдный R-порт алгоритма, используемый в ссылке, размещенной @Luis Mendo.
Ибо
n=5
мы получаем:источник
MATL ,
3938 байтЭто принимает количество итераций в качестве входных данных. Если вы хотите жестко закодировать его, замените
i
его на номер.Программа является портом кода Matlab от Jonas Lundgren, показанного здесь .
Результат показан ниже. Вы также можете попробовать это в MATL Online! Требуется пара секунд, чтобы произвести вывод. Этот компилятор является экспериментальным; вам может понадобиться обновить страницу и снова нажать «Выполнить», если она изначально не работает.
объяснение
источник
MATLAB,
264262161 байтЭто работает во многом так же, за исключением того, что мы в основном вычисляем «производную» кривой Гильберта, которую мы затем «интегрируем» через «cumsum». Это уменьшает размер кода на кучу байтов.
Старая версия
Это просто рекурсивный подход. Я использовал комплексные числа для хранения векторной информации для простоты. Вы можете изменить кривую на детали
h(0,1,1+i,4)
. Первый аргументp=0
- это начальная позиция, второй аргументf
- это флаг ориентации (+1
или-1
), третий аргументd
- это направление / вращение, в котором должна быть нарисована кривая, а четвертыйl
- глубина рекурсии.Вот как это выглядит в старых версиях:
Вот как это выглядит в 2015b:
->источник
cumsum
идеей, которая просто великолепна!MATLAB / Octave, 202 байта
Я заметил, что версия @LuisMendo, связанная с ней
,была намного короче, чем предыдущее решение "ручной работы", но использует совершенно другой подход. Я выкладываю здесь версию для гольфа как CW:Эта версия основана на системном подходе Линденмайера:
источник
JavaScript (ES6),
266...233232 байтаSVG-рендеринг кривой Гильберта.
Сохранено 1 байт благодаря Нейлу
источник
fill=none
Python 3,
177175171 байтПростая реализация системы Линденмайера для кривой Гильберта. Предложения по игре в гольф приветствуются!
Редактировать: -2 байта благодаря Kade. -3 байта от перестройки построения кривой Гильберта. -1 байт благодаря ETHproductions.
Ungolfing
источник
t
может сохранить два байта:t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]
. Поскольку модель для них двоих почти одинакова, мне интересно, есть ли способ использовать это ..if c>"E":
чтобыif"E"<c:
сохранить байт?MSWLogo (версия 6.5b), 136 байт
На основании окончательной программы кривой Гильберта здесь .
h
Определяется функция , которая принимает количество итераций:n
( начиная с 1), угол:a
, длину:l
. Это рекурсивно, вызывая более низкую итерацию с углом:a
в двух случаях, чтобы получить правильную ориентацию.rt :a
,lt :a
поверните черепаху (треугольник, чей путь прослежен) вправо, влево на:a
градусы.fd :l
двигает черепаху вперед по:l
шагам.Наконец, функция называется:
h 5 90 9
. Черепаха может быть скрыта за дополнительные 2 байтаht
.источник
ht
.Mathematica 128 байт
Замените 4 выше с другим количеством итераций, если хотите.
Выполнено как система Линденмайера с целочисленными последовательностями, а не с последовательностями строк, поэтому второе производственное правило является просто отрицательным по отношению к первому правилу. Эта версия составляет 151 байт.
Порт кода MATLAB Джонаса Лундгрена составляет всего 128 байт.
Я вижу, что в будущей версии Mathematica это может стать очень коротким, что-то вроде:
http://mathworld.wolfram.com/HilbertCurve.html
источник
LindenMASM , 63 байта
Еще один вопрос с ответом LindenMASM? Потрясающие!
Еще раз, из-за некоторых ошибок рисования в Python
turtle
, иногда, когда вы запускаете это, весь рисунок не появляется. Однако вы можете видеть, что это действительно работает:источник