我有一个复杂的盒子,
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) 更改为一个小框 (<123),输出应为:
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│ ││4│┌─────┬───┐││
│ ││ ││┌───┐│7 8│││
│ ││ │││123││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘
可能通过递归函数来实现,但是我想知道地址是否可以直接应用,就像>0{>1{>1{a.
谢谢您的帮助!
最佳答案
您可以使用 monadic 原语 map 确定要替换/修改的项目的地址( 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 Programming 论坛文件回溯搜索发现 a post建议使用以下递归副词来满足您的要求:
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││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘
我看到你的问题也已经asked and answered on the J Forum .为了完整起见,我添加了一个链接 more general solution .
(<123) [ applyintree (1;1;0) a
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│ ││4│┌─────┬───┐││
│ ││ ││┌───┐│7 8│││
│ ││ │││123││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘
关于j - 如何修改框中的数据? (J编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288689/