Выполнить систему Lindenmayer
Система Линденмайера (или L-система) связана с системами Thue и Post и используется в ботаническом моделировании и генерации фракталов .
L-система описывается перезаписью строк, где символ из символа-алфавита отображается в последовательности замены символов. Совокупность этих отображений составляет собственно L-систему.
Метод графического вывода, разработанный Prusinkiewicz, интерпретирует результирующую последовательность после применения отображений к исходной последовательности для заданного числа итераций , как команды рисования черепах: вперед, назад, влево, вправо и тому подобное. Это может потребовать дополнительного кода для управления масштабом чертежа, так как различные счетчики итераций могут создавать изображения разного размера.
Ваша задача - выполнить L-систему с наименьшим количеством символов. Ваша программа должна иметь возможность отображать как кривую Дракона, так и ветвящиеся стебли со страницы Википедии, предоставляя соответствующий ввод (файл, командная строка, но внешний по отношению к источнику, пожалуйста).
Это код гольф.
Изменить: Вот несколько примеров, которые я разместил в городе. ответ на SO / rotate-to-north { Где я впервые обнаружил L-систему } , ответ на SO / how-to-program-a-fractal , ответ на SO / recursion-in-postscript , обсуждение comp.lang.postscript / концерт , приписка коллекция л-система , codegolf.SE/draw-a-sierpinski-triangle {происхождение конкуренции между собой и thomasW} .
источник
Ответы:
Mathematica
200198188171168Пробелы добавлены для ясности:
Где:
Правила производства грамматики:
Последовательность {2,4,6,8} есть, потому что я использую
I^n
(I
= мнимая единица), чтобы совершать повороты.Примеры:
источник
Graphics@k
,Graphics@Flatten@k
если вы планируете использовать много итераций. В противном случае предел рекурсии укусит вас, и ваш сеанс Mma будет прерван.Питон,
369294Не победитель, но я все равно опубликую то, что попробовал.
Не хорошо в игре в гольф на Python ...... Может быть, кто-то еще может это сделать.
вход
Входные данные поступают из внешнего файла с именем «l» (без расширения) в следующем формате:
строка 1 : начальное состояние (аксиома)
строка 2 : правила, разделенные запятыми
Символы
f
иF
: рисовать вперед+
: повернуть вправо на 5 градусов-
: повернуть влево на 5 градусов[
: сохранить положение и курс]
: всплывающее положение и курсДругие символы игнорируются функцией рисования.
Правила
. Правило имеет формат.
"predecessor":"successor(s)"
Обратите внимание, что кавычки необходимы, одинарные или двойные.
predecessor
должен быть один символ.Кроме того, не существует неявных констант: вы должны явно указать правило без изменений для них.
Примеры
Ветви стебли
Выходные данные
Обратите внимание, что источник изменен, чтобы вывести его, поместив ТОЛЬКО ДЛЯ МАСШТАБИРОВАНИЯ ВНЕШНЕЙ ГРАФИЧЕСКОЙ ОБЛАСТИ. Консоль также используется, чтобы скрыть «черепаху».
Кривая дракона
Выходные данные
Снова консоль используется для скрытия «черепахи».
Треугольник Серпинского
Выходное
поколение уменьшено до 5 здесь.
источник
f
,r
,l
; добавление фиктивного параметра кo
иc
; а затем изменив псевдопереключатель на{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
, и я думаю,o
иc
стоит исключить с помощью встроенныхif
заявлений (дешевле, чемglobal
декларация)o
иc
непосредственно в псевдопереключателе), давали синтаксические ошибки, но другие не делали ' т.s,R,*p=input().split()
. 3. Генерация окончательного значенияs
поexec('s="".join(map(eval(R).get,s));'*8)
. 4. Оставь в покоеcontinue
. 5. Отступ только на 1 пробел. 6. Сэкономьте место послеif
, переключив стороны для теста. 7. Установитеk:int
вdict
(первой записи) , а затем вам не нужноexcept: try:
. (Я получаю 215 символов.)Javascript (179 байт)
Не совсем уверен, что это подходит, так как объект правил выполняет весь фактический рисунок.
Демо (Дракон, анимация):
- Расширено: http://jsfiddle.net/SVkMR/9/show/light
- С Кодом: http://jsfiddle.net/SVkMR/9/
уменьшенная:
Читаемые (МОГ):
Входные данные:
Использование:
Бонус: Золотая Спираль http://jsfiddle.net/SVkMR/35/show/light/
источник
постскриптум
264298295255Вот моя попытка сделать это по-другому. Вместо того, чтобы использовать макро-расширение, которое я обычно использую, оно проверяет размер стека выполнения, чтобы ограничить рекурсию. Если предел превышен, он останавливает рекурсивное исследование процедуры и пытается интерпретировать команды черепахи (и игнорирует в
pop pop
противном случае). Преимущество этого метода заключается в том, что он не требует огромных объемов памяти. Недостатком является то, что управление рекурсией является довольно неуклюжим, поскольку размер стека увеличивается более чем на 1 от одного уровня рекурсии к следующему.Изменить: +34 символов для ветвления.
Изменить: -3 символа. Переработан для использования стека операндов для управления рекурсией. Это делает базовую систему намного проще. Но скобкам нужен независимый стек, поэтому я поместил сохраненную позицию в стек словаря и почти окупил все сбережения.
Кроме того, переработано использование строк и целых чисел вместо массивов и имен.
Изменить: -40 символов. Добавлены две процедуры для вызова системных имен по номеру (кажется, я не могу заставить работать необработанные двоичные токены. Но эта идиома работает для меня.)
Полукомментированный двоичный файл.
Незамедленные «двоичный».
Это требует, чтобы L-система была определена в словаре на стеке диктов, с начальной строкой и начальной позицией черепахи в стеке операндов (с добавлением, например, источника
gs dragon.sys lsys.ps
).Кривая Дракона.
Ветвящиеся стебли.
Разоблаченный и прокомментированный.
Чтобы запустить его, эти 3 блока можно сохранить в виде 3 файлов: dragon.ps, stems.ps, lsys.ps (любой из вышеперечисленных блоков программы будет работать одинаково). Затем запустите с gs:
gs dragon.ps lsys.ps
илиgs stems.ps lsys.ps
. При желании их также можно объединить в первую очередь:cat dragon.ps lsys.ps | gs -
илиcat stems.ps lsys.ps | gs -
.Нет стебля картины. Это не становится более интересным на более высоких глубинах.
источник
Mathematica 290
Эта базовая реализация фокусируется на выводе, а не на обработке. Он не использует правила производства. Так что это может быть не подходящим ответом на вызов.
Ветвящиеся стебли адаптированы из демонстрации Тео Грея .
Код
использование
Первый параметр определяет, будут ли отображаться кривая дракона или стебли ветви. Второй термин относится к поколению.
Больше примеров
источник
A->F[+A][-A]
кудаF
двигаться,+
повернуть влево на 30,-
повернуть вправо на 30 и[
/]
толкнуть /