【问题标题】:J and L-systemsJ 和 L 系统
【发布时间】:2015-01-14 11:05:16
【问题描述】:

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

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

变量:A B 常数:无 公理:A 规则:(A→AB),(B→A)

产生:

迭代 |结果模型 0 |一种 1 | AB 2 | ABA 3 | ABAAB 4 |阿里巴巴 5 | ABAABABABAAB

这是我自己在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 (([: ; (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) 的提示和 cmets!

【问题讨论】:

    标签: arrays list j l-systems


    【解决方案1】:

    您可以在# 的左侧参数中使用复数来扩展数组而不进行装箱。

    对于这个特定的 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 删除了它们。它确实在右侧用空值填充所有结果字符串。如果您不希望这样,您可以使用&lt;@-.~"1 将结果装箱:

       'x'<@-.~"1 'xAB'{~([:,(0:`(1:,2:)`1:)@.]"0)^:(<6) 1
    ┌─┬──┬───┬─────┬────────┬─────────────┐
    │A│AB│ABA│ABAAB│ABAABABA│ABAABABAABAAB│
    └─┴──┴───┴─────┴────────┴─────────────┘
    

    【讨论】:

    • 比你,你的回答对我有用,但是 Tikkanz 的回答似乎在时间和空间上都更有效率。感谢您指出 ^:(&lt;n) 构造 - 我不知道。
    【解决方案2】:

    以下将用空格填充矩形数组:

       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 以了解幕后发生的事情。

    【讨论】:

    • 除非性能是一个问题,否则rplc 是最直接的方法。
    猜你喜欢
    • 2010-11-04
    • 2020-09-14
    • 1970-01-01
    • 2020-08-16
    • 2018-06-15
    • 2010-10-29
    • 2015-03-07
    • 2011-02-01
    • 2020-05-18
    相关资源
    最近更新 更多