数组 – J和L系统

我将创建一个可以生成L-system个语法字符串的程序.

Astrid Lindenmayer用于模拟藻类生长的原始L系统是:

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

通过类比,这是L-system that generates Thue–Morse sequence的第4次迭代的结果

   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中的链接列表 – 如果没有它们,编码语法会更加困难.

我真正想到的是:
a)构建构建最终字符串的那些函数的动名词列表(在我的例子中,这些函数是常量,如’AB’“0但是在树建模函数的情况下是乌龟图形命令)并唤起(`:6)它,
或者我能够编码的东西:
b)构造一串合法的J句子,构建最终的字符串并做(“.)它.
但我不确定这些程序是否有效.

>你能告诉我一个更好的方法吗?

任何提示以及关于a)和b)的评论都非常感谢!

最佳答案
以下将用空格填充矩形数组:

   L=: rplc&('A';'AB';'B';'A')
   L^:(<6) 'A'
A            
AB           
ABA          
ABAAB        
ABAABABA     
ABAABABAABAAB

或者,如果您不想填充:

   L&.>^:(<6) <'A'
┌─┬──┬───┬─────┬────────┬─────────────┐
│A│AB│ABA│ABAAB│ABAABABA│ABAABABAABAAB│
└─┴──┴───┴─────┴────────┴─────────────┘

显然,您需要检查rplc / stringreplace以查看正在发生的事情.

转载注明原文:数组 – J和L系统 - 代码日志