Напишите программу или функцию, которая принимает положительное целое число N и воссоздает этот шаблон кругов, масштабированный так, чтобы соответствовать пиксельному изображению N × N:
Это изображение является допустимым выходным примером для N = 946.
В случае, если неясно, все маленькие голубые круги имеют одинаковый радиус и одинаково расположены в четырех синих кругах. Синие круги имеют удвоенный радиус и аналогично расположены в большом голубом круге.
Любые два визуально отличных цвета могут использоваться вместо двух оттенков синего.
Квадрат фона должен быть цветным.
Сглаживание не является обязательным.
Сохраните изображение в файл, отобразите его или передайте необработанные данные изображения в стандартный вывод.
Разрешен любой общий формат файла изображения.
Самый короткий код в байтах побеждает.
Брауни указывает, если вы расширите рекурсивные аспекты этого круга на дальнейшие уровни. (Держите это отдельно от вашей записи в конкурсе.)
источник
Ответы:
CJam, 83 байта
Попробуйте онлайн
CJam не имеет специальной функции вывода изображения. Мой код генерирует изображение в PBM ASCII. Для публикации я преобразовал это изображение в PNG, используя GIMP.
Обратите внимание, что никакой функциональности рисования кругов, или что-то подобное, он не использовал. Изображение рассчитывается попиксельно.
Более высокие степени подразделения могут быть легко созданы путем увеличения константы
3
вокруг середины кода.Изображения степени 4 и 5 выглядят так:
Общая последовательность кода:
Объяснение:
источник
Python 2 + PIL, 262 байта
Этот подход определяет цвет каждой отдельной координаты пикселя, используя рекурсивную функцию
c
.c(x,y,0)
делает круг;c(x,y,1)
делает круг с вырезанными из него четырьмя кругами;c(x,y,2)
отображает изображение в OP. Все, что больше 2, приносит мне очки брауни.Версия без гольфа:
Бонус экстрарекурсивного изображения:
источник
.save("p.png")
просто использовать.show()
PostScript, 335 байт.
PostScript - это не просто формат графических файлов с векторными и растровыми возможностями, это фактически объектно-ориентированный язык программирования Turing. Приведенный выше код является довольно простой рекурсивной реализацией функции. Все операторы PostScript являются функциями, и обычно их переопределяют для сжатия кода. Обратите внимание, что в PostScript используется нотация на обратном польском (нотация постфикса).
Интерпретаторы PostScript обычно читают метаданные (например, размер и заголовок страницы) из специальных комментариев в начале файла; очевидно, я удалил
%!
из своей записи все, кроме самого необходимого комментария подписи PostScript , но он все равно должен отображаться нормально в любом стандартном интерпретаторе PostScript, например, GhostScript или Okular. Его также можно просмотреть с помощью утилиты отображения, которая поставляется с ImageMagick / GraphicsMagick.Обратите внимание, что файл должен заканчиваться символом новой строки (который я включил в мой счетчик байтов), иначе интерпретатор может расстроиться.
Параметр размера
N
для этого кода 512; он делится на 2 и дублируется дважды, чтобы создать параметры для первоначального вызова рекурсивной функцииf
. Глубина рекурсии равна 2, что указывается перед входомf
в512 2 div dup dup 2 f
. Чтобы размер был небольшим, на выходе изображение будет черно-белым. Хотя вы можете установить любую разумную неотрицательную целочисленную глубину рекурсии, эта версия хорошо выглядит только с четной глубиной.Это изображение является векторной графикой, поэтому оно может отображаться в любом разрешении без пикселизации, в зависимости от качества и настроек используемого интерпретатора / принтера PostScript. (FWIW, PostScript использует кубические кривые Безье для рисования дуг окружности с достаточным количеством сплайнов, чтобы гарантировать, что ошибка всегда будет меньше одного пикселя в пространстве устройства). Чтобы просмотреть его с помощью дисплея ImageMagick в достаточно высоком качестве, вы можете сделать:
те же параметры также хороши, если вы хотите использовать ImageMagick
convert
для преобразования его в другой формат. Например, вот версия 640x640 вышеупомянутого кода PostScript, преобразованного в PNG:Вот немного увеличенная версия, которая обрабатывает цвета RGB и нечетные глубины рекурсии:
Это также позволяет вам установить параметр размера
N
и глубину рекурсииd
в верхней части скрипта.Наконец, вот более читаемая форма кода. (К сожалению, подсветка синтаксиса используется здесь для PostScript оставляет много желать лучшего, но я предполагаю , что это лучше , чем ничего ...). Умные интерпретаторы PostScript будут читать геометрию страницы из
%%BoundingBox:
специального комментария.А вот вывод глубины == 4 в формате PNG, снова созданный с помощью convert (и оптимизированный с помощью optipng ):
источник
Python 2 + PIL, 361 байт
Сохраняет изображение в черно-белом режиме в файл
c.png
:Я в основном создаю один из половинных кругов на изображении
J
. Затем я использую себя в качестве маски, чтобы нарисовать фигуру на изображениеI
, которое имеет основной круг.Его можно было бы сократить, используя
I.show()
в конце вместоI.save("c.png")
, но я не работал на Python 2. Если кто-то может подтвердить, что он работает на Python 2, я перейду на это.Следующая программа генерирует изображение как в вопросе (419 байт):
источник
save
.SVG (1249 символов)
Да, много персонажей. Но это статично и рендеринг в любом размере, так что это дает некоторый бонус.
Просмотр фрагмента:
источник
0
в константах с плавающей точкой? Например, заменить0.4
на.4
? На большинстве языков это действительно так. И очень быстрый взгляд на спецификацию SVG предполагает, что она, вероятно, должна работать и их.Mathematica
336359 байтОсновными графическими объектами являются области, определенные посредством логических комбинаций уравнений.
источник
Ява, 550
В основном просто экспериментирую с JavaFX.
Скриншот:
Для точек брауни измените
2
код в (d(n,2,0,0)
) на другое число.Старая версия, 810
Это оставляет некоторые нежелательные края, как вы можете видеть на этом скриншоте .
источник
JavaScript (ES6), 279
Рекурсивно создавайте холсты и добавляйте дочерний холст четыре раза к родительскому холсту. В нижнем слое холст представляет собой один круг; этот холст четыре раза ставится на родительский холст, а затем этот холст четыре раза ставится на последний мастер-холст.
Демоверсия запуска:
Показать фрагмент кода
С пробелами, комментариями и мягким разгромом:
Это может легко создать более глубокие слои рекурсии путем изменения начального
o-2
или любого большегоo-z
значения.Обратите внимание, что отправка будет выполняться только в Firefox из-за использования функций ES6 и несогласованности в API Canvas для аргументов
fill
иclip
аргументов.источник