Фон
L-система (або система Лінденмайер) являє собою систему паралельних перезапису , що, крім іншого, може бути легко використана для модельних фракталів. Це питання стосується детермінованих, без контексту L-систем . Вони складаються з алфавіту символів, початкового рядка аксіоми та набору правил перезапису, які відображають кожен символ алфавіту на новий рядок. Правила застосовуються до аксіоми паралельно, генеруючи новий рядок. Потім цей процес повторюється.
Наприклад, система з аксіомою "A" і правилами A = ABA; B = BBB генерує послідовність рядків "ABA", "ABABBBABA", "ABABBBABABBBBBBBBBABABBBABA" і т. Д. Для стислість ми не згадуємо прямо алфавіту при визначенні L-системи. Крім того, будь-який символ без явного правила перезапису вважається незмінним (тобто правило за символом A є A = A).
L-системи можна візуалізувати за допомогою форми графіки черепах. За умовами, черепаха починає звернутися праворуч. Потім рядок малюється ітерацією над його символами: F означає "витягнути одну одиницю вперед", G означає "рухатись вперед на одну одиницю", a + означає "повернути лівий кут на один кут", а - означає "повернути на один кут вправо одиниця ". Усі інші символи в рядку ігноруються. Для цього питання, кутові одиниці вважаються завжди 90 °.
Завдання
Враховуючи специфікацію будь-якої L-системи та ряд ітерацій, ваша програма повинна вивести ASCII-рендерінг результуючого рядка (як описано вище), використовуючи символи малювання поля.
- Параметри передаються у вигляді розділеного пробілом рядка, що містить аксіому, правила перезапису (як; -розділений список рівнянь) та кількість переписаних ітерацій. Наприклад, вхід "FF = FGF; G = GGG 2" генерує рядок "FGFGGGFGF" і, отже, малює чотири рядки з відповідними пробілами.
- Символи, що використовуються в системі L, можуть бути будь-якими символами ASCII, крім пробілу та крапки з комою. Існує щонайменше одне явне правило, вказане на символ (при цьому правило перезапису за замовчуванням є відображенням ідентичності, як описано вище).
- Можна припустити, що вихід завжди буде містити щонайменше один F.
- Вихід повинен використовувати наступні символи UNICODE для малювання візуалізації: ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , ┘ (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), ╵ (U + 2575), ╶ (U + 2576) і ╷ (U + 2577). Дивіться приклади нижче.
- Вихідні дані не повинні містити порожніх рядків над символом верхнього поля або нижче самого нижнього. Він також не повинен містити пробілів ліворуч від лівого крайнього лівого вікна або праворуч від крайнього правого. Допускаються лінії з пробілами, які не виходять за межі правого поля.
Ви можете написати програму або функцію, взявши вхід через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції. Результати слід надрукувати в STDOUT (або найближчій альтернативі), зберегти у файл або повернути у вигляді рядка.
Приклади
# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴ ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴ ╶╴╶╴ ╶╴╶╴ ╶╴╶╴
# Koch curve
>> "F F=F+F−F−F+F 1"
┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
┌┐
┌┘└┐
┌┘ └┐
┌┼┐ ┌┼┐
╶┘└┘ └┘└╴
Інші приклади тестування вашої програми включають:
# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"
# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"
# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"
Перші два з них виглядають так (створено з використанням відповіді @ edc65):
Ви можете протестувати будь-яку із систем на цій сторінці .
Оцінка балів
Найкоротший код (у байтах) виграє. Діють стандартні правила.
Різне
Цей виклик був надихнутий Намалюйте випадкову прогулянку з косими рисами . Насправді, можна уявити випадкову прогулянку як L-систему, якщо розширити систему, щоб дозволити кілька правил на символ, при цьому розширення вибрано недетермістично під час переписування. Один з препаратів:
"F F=FF;F=F+F;F=F++F;F=F+++F"
Ще одне поширене розширення, яке часто використовується при моделюванні рослин, - інтерпретувати символи [і] як штовхання та вискакування поточного положення та кута. Більшість рослин використовують кути, менші за 90 °, але ось один із прикладів, які не:
"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"
Жоден із цих прикладів не потребує підтримки в цьому виклику.
Цей виклик також схожий на "Вибачте, юначе, але це Черепахи аж донизу!" . Однак цей виклик використовував візуалізацію рядків, а не ASCII і дозволяв більш гнучкий синтаксис.