如何修改盒子里的数据? (J编程)
How to amend data in a box? ( J programming)
我有一个复杂的盒子,
a =: 1 2 3 ; <4 ; < 5 6; <7 8
┌─────┬─────────────┐
│1 2 3│┌─┬─────────┐│
│ ││4│┌───┬───┐││
│ ││ ││5 6│7 8│││
│ ││ │└───┴───┘││
│ │└─┴─────────┘│
└─────┴─────────────┘
假设我知道inner box [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 ({::
):[=25] 来确定您要查找的项目的地址 (1;1;0
) replace/amend =]
a=: 1 2 3;<4;<5 6;7 8
{:: a
┌───┬─────────────────────────┐
│┌─┐│┌─────┬─────────────────┐│
││0│││┌─┬─┐│┌───────┬───────┐││
│└─┘│││1│0│││┌─┬─┬─┐│┌─┬─┬─┐│││
│ ││└─┴─┘│││1│1│0│││1│1│1││││
│ ││ ││└─┴─┴─┘│└─┴─┴─┘│││
│ ││ │└───────┴───────┘││
│ │└─────┴─────────────────┘│
└───┴─────────────────────────┘
{::
、fetch 的二元形式将 return 嵌套结构中的项目。
(1;1;0) {:: a
5 6
不幸的是,目前没有 }::
等同于 amend (}
) although there is a recent request 来在具有您想要的功能的解释器中实现原语 }::
。
当我们等待实现该原语时,通过 J 编程论坛存档进行的搜索显示 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. In the interests of completeness I've added a link to that more general solution。
(<123) [ applyintree (1;1;0) a
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│ ││4│┌─────┬───┐││
│ ││ ││┌───┐│7 8│││
│ ││ │││123││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘
我有一个复杂的盒子,
a =: 1 2 3 ; <4 ; < 5 6; <7 8
┌─────┬─────────────┐
│1 2 3│┌─┬─────────┐│
│ ││4│┌───┬───┐││
│ ││ ││5 6│7 8│││
│ ││ │└───┴───┘││
│ │└─┴─────────┘│
└─────┴─────────────┘
假设我知道inner box [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 ({::
):[=25] 来确定您要查找的项目的地址 (1;1;0
) replace/amend =]
a=: 1 2 3;<4;<5 6;7 8
{:: a
┌───┬─────────────────────────┐
│┌─┐│┌─────┬─────────────────┐│
││0│││┌─┬─┐│┌───────┬───────┐││
│└─┘│││1│0│││┌─┬─┬─┐│┌─┬─┬─┐│││
│ ││└─┴─┘│││1│1│0│││1│1│1││││
│ ││ ││└─┴─┴─┘│└─┴─┴─┘│││
│ ││ │└───────┴───────┘││
│ │└─────┴─────────────────┘│
└───┴─────────────────────────┘
{::
、fetch 的二元形式将 return 嵌套结构中的项目。
(1;1;0) {:: a
5 6
不幸的是,目前没有 }::
等同于 amend (}
) although there is a recent request 来在具有您想要的功能的解释器中实现原语 }::
。
当我们等待实现该原语时,通过 J 编程论坛存档进行的搜索显示 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. In the interests of completeness I've added a link to that more general solution。
(<123) [ applyintree (1;1;0) a
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│ ││4│┌─────┬───┐││
│ ││ ││┌───┐│7 8│││
│ ││ │││123││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘