Я собираюсь создать программу, которая может генерировать строки из L-system грамматик. оригинальный L-SystemJ и L-системы
Астрид Lindenmayer для моделирования роста водорослей:
variables : A B constants : none axiom : A rules : (A → AB), (B → A)
, который производит:
iteration | resulting model 0 | A 1 | AB 2 | ABA 3 | ABAAB 4 | ABAABABA 5 | ABAABABAABAAB
, который наивно реализуется себя в J, как это:
algae =: 1&algae : (([: ; (('AB'"0)`('A'"0) @. ('AB' i. ]))&.>"0)^:[) "1 0 1
(i.6) ([;algae)"1 0 1 'A'
┌─┬─────────────┐
│0│A │
├─┼─────────────┤
│1│AB │
├─┼─────────────┤
│2│ABA │
├─┼─────────────┤
│3│ABAAB │
├─┼─────────────┤
│4│ABAABABA │
├─┼─────────────┤
│5│ABAABABAABAAB│
└─┴─────────────┘
Поэтапная иллюстрация:
('AB' i. ]) 'ABAAB' NB. determine indices of productions for each variable
0 1 0 0 1
'AB'"0`('A'"0)@.('AB' i. ])"0 'ABAAB' NB. apply corresponding productions
AB
A
AB
AB
A
'AB'"0`('A'"0)@.('AB' i. ])&.>"0 'ABAAB' NB. the same &.> to avoid filling
┌──┬─┬──┬──┬─┐
│AB│A│AB│AB│A│
└──┴─┴──┴──┴─┘
NB. finally ; and use ^: to iterate
По аналогии, здесь является результатом 4-й итерации L-system that generates Thue–Morse sequence
4 (([: ; (0 1"0)`(1 0"0)@.(0 1 i. ])&.>"0)^:[) 0
0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
Это лучшее, что я могу сделать до сих пор. Я считаю, что метод бокса-распаковки здесь недостаточен. Это первый раз, когда я пропустил связанные списки в J - гораздо сложнее кодировать грамматики без них.
Что я на самом деле думаю о том:
а) построение списка герундии тех функций, которые создают конечную строку (в моих примерах этих функциями являются константами, как 'AB'"0
но в случае моделирования функций дерева черепахи графических команд) и вызывая (`:6
) его,
или что-то, что я могу ввести в код:
b) построение строки юридического J-предложения, которое строит окончательную строку и делает (".
).
Но я не уверен, эффективны ли эти программы.
- Можете ли вы показать мне лучший подход, пожалуйста?
Любые намеки, а также комментарии о а) и б) высоко ценятся!
Если производительность не является проблемой, 'rplc' является самым простым способом. – Eelvex
Спасибо, Тикканц. –