J:从数组中创建一个动词族

时间:2013-10-15 22:48:44

标签: j

以下表达式显示了16个基本布尔运算中的每一个的真值表:

   (0 b./; 1 b./; 2 b./; 3 b./; 4 b./; 5 b./; 6 b./; 7 b./; 8 b./; 9 b./; 10 b./; 11 b./; 12 b./; 13 b./; 14 b./; 15 b./) ~ i.2
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│0 0│0 0│0 0│0 0│0 1│0 1│0 1│0 1│1 0│1 0│1 0│1 0│1 1│1 1│1 1│1 1│
│0 0│0 1│1 0│1 1│0 0│0 1│1 0│1 1│0 0│0 1│1 0│1 1│0 0│0 1│1 0│1 1│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

如何在括号中重构该部分以删除重复?

澄清

这里的目标不是生成表,而是学习如何动态生成新动词。为了减少带括号的表达式,我想分析符号;/b.,然后用i.10替换数字。

;符号很简单:

   ;/i.16
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬──┬──┬──┬──┬──┬──┐
│0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴──┴──┴──┴──┘

但是我很难找到从列表中的每个元素产生新动词的方法。

我想也许我正在寻找某种高阶组合器,它允许&@使用除常量之外的其他东西。

例如,nn leftBondEach v可能会生成一个等同于n0 & v; n1 & v; ... ; nn & v的动词数组:

   bverbs =: (i.16)(leftBondEach)b. NB. would mean (0 b.; 1 b.; ...; 15 b.)
   0 bverbs 0
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│0│0│0│0│1│1│1│1│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
   0 bverbs 1
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│1│1│1│1│0│0│0│0│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

我认为我需要类似的东西才能将/附加到每个函数。

然后再次,这是J,并且可能有一种完全不同的方式来解决这些我还没有完成的问题。 :)

2 个答案:

答案 0 :(得分:5)

怎么样:

<"2@|:@( (i.16) b./~) 0 1

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |0 0|0 0|0 1|0 1|0 0|0 0|0 1|0 1|1 0|1 0|1 1|1 1|1 0|1 0|1 1|1 1|
    |0 0|0 1|0 0|0 1|1 0|1 1|1 0|1 1|0 0|0 1|0 0|0 1|1 0|1 1|1 0|1 1|
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

注意到$ (i. 16) b. /~ 0 1是2 2 16,你想要16个大小为2x2的盒子......

答案 1 :(得分:2)

我能想到的最直接的转换是:

(3 :'y b./ ~ i.2') each i.16
澄清

编辑

1。您可以定义类似f =: 4 :';/x b. y'的内容,所以:

(i.16) f 0
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│0│0│0│0│1│1│1│1│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
(i.16) f 1
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│1│1│1│1│0│0│0│0│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

2. 您可以使用At(;/)将(i.16) b.“应用”到@

f =: ;/@((i.16) b.)
f 0
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│0│0│0│0│1│1│1│1│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
f 1
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│1│1│1│1│0│0│0│0│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

3。如果你想让leftBondEach处理任何动词,那么它就是一个结论:

leftBondEach =: 2 :';/m v y'   
h =: 2 leftBondEach +             NB. equiv. to h =: ;/@(2&+)
h 3 4 5
┌─┬─┬─┐
│5│6│7│
└─┴─┴─┘
h =: 0 leftBondEach ((i.16) b.)
h 0
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│0│0│0│0│1│1│1│1│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
h 1
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│0│0│1│1│1│1│0│0│0│0│1│1│1│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

4。等等你可以重塑像jpjacobs那样的结果等。