我要创建一个可以从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)的任何提示和评论!
答案 0 :(得分:5)
以下将用空格填充矩形数组:
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
,看看幕后发生了什么。
答案 1 :(得分:2)
您可以在#
的左参数中使用复数值来扩展数组而不进行装箱。
对于这个特定的L系统,我可能会跳过动名词并使用临时替换:
to =: 2 : 'n (I.m=y) } y' NB. replace n with m in y
ins =: 2 : '(1 j. m=y) #!.n y' NB. insert n after each m in y
L =: [: 'c'to'A' [: 'A'ins'B' [: 'B'to'c' ]
然后:
L^:(<6) 'A'
A
AB
ABA
ABAAB
ABAABABA
ABAABABAABAAB
这是一种更通用的方法,通过使用数字和由常数函数组成的动名来简化代码:
'x'-.~"1 'xAB'{~([:,(0:`(1:,2:)`1:)@.]"0)^:(<6) 1
A
AB
ABA
ABAAB
ABAABABA
ABAABABAABAAB
最后填写AB以供显示。这里没有装箱,因为我使用0作为空值。它们分散了很多,但-.~"1
删除了它们。它会在右侧填充所有带有空值的结果字符串。如果您不想这样,可以使用<@-.~"1
来替换结果:
'x'<@-.~"1 'xAB'{~([:,(0:`(1:,2:)`1:)@.]"0)^:(<6) 1
┌─┬──┬───┬─────┬────────┬─────────────┐
│A│AB│ABA│ABAAB│ABAABABA│ABAABABAABAAB│
└─┴──┴───┴─────┴────────┴─────────────┘