... так что это задача сделать меня деревом.
Создайте программу или функцию с именем tree, которая принимает один целочисленный аргумент N и рисует пифагорейское дерево N уровня глубоко, где уровень 0 - это просто ствол.
Каждое соединение дерева должно располагать вершину треугольника в случайной точке по периметру (эта точка должна быть равномерно распределена по крайней мере по 5 одинаково разнесенным точкам или равномерно по всему полукругу).
При желании ваше дерево может быть трехмерным, красочным или освещенным в зависимости от времени суток. Тем не менее, это код-гольф, поэтому выигрывает самый маленький файл.
РЕДАКТИРОВАТЬ: я закрою конкурс и приму самый маленький ответ, когда ему неделя
code-golf
graphical-output
александр-Brett
источник
источник
Ответы:
Mathematica,
246234221 символовЭто, конечно, не самый элегантный / самый короткий способ сделать это.
Использование:
f[8]
А вот пример выходов для
f[6]
иf[10]
соответственно.Немного негольфя
источник
Show
там, иModule
это также не нужно.Show
подсказку, но как мне избавитьсяModule
? Если я не объявлюp
локальный, он будет перезаписан в рекурсивных вызовах, поэтому я не смог сделать оба вызова с одним и тем жеp
, верно?Block
, который короче, чемModule
.CFDG, 134 знака
Это не совсем верно, потому что вы не можете ограничить глубину рекурсии. Но проблема просто требует решения в этом . :)
Результаты выглядят примерно так
Еще для 46 символов (всего 180 символов ) вы можете даже раскрасить его:
источник
Постскриптум,
322270Редактировать: кажется, что
realtime
не может быть использован в качестве правильного случайного генератора семян. Поэтому мы будем использовать переменную окружения для этой цели и запустим программу следующим образом:или
Теперь наши деревья менее предсказуемы. 14 байтов добавляются к общему количеству. Другие изменения: 1) Программный аргумент теперь передается в командной строке. 2) Нет явного счетчика итераций - размер стека служит для этой цели (угол поворота левой ветви сохраняется в стеке, для рисования правой ветви позже). 3) Для требуемой глубины нет именованной переменной - размер стека - это его смещение в стеке. Он остается там на выходе, то есть не потребляется.
Я думаю, что это довольно очевидно - состояние графики подготовлено и
f
процедура вызывается рекурсивно для каждого последовательного уровня глубины, дважды - для «левой» и «правой» ветвей. Работа с прямоугольником1x1
размера (см. Исходный масштаб) избавляет от необходимости умножения на длину стороны. Угол поворота левой ветви рандомизирован - используется одно из 5 случайных равноотстоящих делений - я думаю, что это предотвращает возможные уродливые случаи для равномерной случайности.Это может быть медленно для необходимой глубины более 20 или около того.
Далее следует версия для игры в гольф, использующая двоичные токены в кодировке ASCII (см. Ответ luser droog из связанной темы). Обратите внимание,
cos
,sin
,rand
не могут использовать эти обозначения.,
источник
-dGraphicsAlphaBits
- это флаг для вывода сглаживания, чтобы предотвратить появление неровных краев больших квадратов, его можно опустить (или «скрыть», например, в переменной среды). Некоторым людям это может нравиться больше без этого флага (листья деревьев получают больше «объема»). Ну, эти 20 байтов не так уж и важны. Я бы сказал, что скидка 20-25% - использование двоичных токенов в кодировке ascii (судя по ответу по теме) Может быть, скидка 50% без ascii-кодирования, 2 двоичных байта на маркер имени системы. Будут похожи на некоторые обычно выигрышные языки;)Coffeescript
377B352BЯ чувствую себя грязно, пишу coffeescript, но не могу найти приличный пакет для рисования для python3: - /
Javascript
393B385BНемного красивее в javascript, и я гораздо счастливее с циклом for, но без синтаксиса [x, y, z] = A, я просто не могу сделать его достаточно коротким, чтобы превзойти coffeescript
Должен сказать, я немного раздражен, это почти вдвое дольше, чем решение Mathematica: - / увидеть его в действии: http://jsfiddle.net/FK2NX/3/
источник
X
возвратеX
, вы можете связать их. И вы можете сохранить еще одну хорошую группу символов, сохраняяM.sin
иM.cos
в односимвольных переменных.s=M.sin
.rotate
используетthis
иsin
не делает. Вам нужно сделать что-то подобноеR=X.rotate.bind(X)
, но это, вероятно, не стоит больше.