如何修改框中的数据? (J编程)

时间:2018-03-14 22:33:09

标签: j

我有一个复杂的盒子,

a =: 1 2 3 ; <4 ; < 5 6; <7 8
┌─────┬─────────────┐
│1 2 3│┌─┬─────────┐│
│     ││4│┌───┬───┐││
│     ││ ││5 6│7 8│││
│     ││ │└───┴───┘││
│     │└─┴─────────┘│
└─────┴─────────────┘

假设我知道内盒[5 6]的地址是(1 1 0),即可以像这样提取数据:

    >0{>1{>1{a
5 6

我的问题是,如何编写一个函数(动词)来修改给定地址的数据? 例如地址(1 1 0)已知,我想将值(5 6)更改为一个小方框(&lt; 123),输出应为:

┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│     ││4│┌─────┬───┐││
│     ││ ││┌───┐│7 8│││
│     ││ │││123││   │││
│     ││ ││└───┘│   │││
│     ││ │└─────┴───┘││
│     │└─┴───────────┘│
└─────┴───────────────┘

可以通过递归函数来实现,但我想知道地址是否可以直接应用,就像&gt; 0 {&gt; 1 {&gt; 1 {a。

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

您可以使用monadic原语mapx)确定要替换/修改的项目的地址(1;1;0):

{::

a=: 1 2 3;<4;<5 6;7 8 {:: a ┌───┬─────────────────────────┐ │┌─┐│┌─────┬─────────────────┐│ ││0│││┌─┬─┐│┌───────┬───────┐││ │└─┘│││1│0│││┌─┬─┬─┐│┌─┬─┬─┐│││ │ ││└─┴─┘│││1│1│0│││1│1│1││││ │ ││ ││└─┴─┴─┘│└─┴─┴─┘│││ │ ││ │└───────┴───────┘││ │ │└─────┴─────────────────┘│ └───┴─────────────────────────┘ fetch的二元形式将从嵌套结构中返回该项目。

{::

不幸的是,目前没有 (1;1;0) {:: a 5 6 等同于amend}::),尽管在解释器中有recent request来实现原始}具有您想要的功能。

当我们等待实现该原语时,通过J编程论坛档案搜索显示a post,其中提出了以下递归副词,它可以满足您的要求:

}::

我看到你的问题也是asked and answered on the J Forum。为了完整起见,我添加了指向more general solution的链接。

store=: adverb define
:
  if. #m do. (< x (}.u)store ({.u){::y) ({.m)} y else. x end.
)

   (<123) (1;1;0) store a
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│     ││4│┌─────┬───┐││
│     ││ ││┌───┐│7 8│││
│     ││ │││123││   │││
│     ││ ││└───┘│   │││
│     ││ │└─────┴───┘││
│     │└─┴───────────┘│
└─────┴───────────────┘