Nic*_*ick 3 functional-programming j tacit-programming
(2&*~) 15 7 3 1
Run Code Online (Sandbox Code Playgroud)
以上是这句话.最后是追踪和最终结果.我明白这个短语是monad,我明白因为它有左右参数.如果您运行'15 7 3 1(2&*)15 7 3 1',则会发生相同的输出.我也得到了正确的表是2到1,3,7,15的幂,而其他条目是它们的基数乘以2的幂,但我只是不明白为什么.
在一个相关的说明中,这是一个来自Rosetta Code网站上的ethopian乘法的短语(实际上,这也是我试图弄清楚这一点)和'(1>.<.@ - :)^: a:'是这句话.
(1>.<.@-:)^:a: 27
27 13 6 3 1
Run Code Online (Sandbox Code Playgroud)
但是(1>.<.@ - :) ^:27会返回一个自己的盒子版本,我希望它会运行27次.
在三个相关问题的最后,(这些都与分解道德繁殖代码有关),完整代码如下:
double =: 2&*
halve =: %&2 NB. or the primitive -:
odd =: 2&|
ethiop =: +/@(odd@] # (double~ <@#)) (1>.<.@halve)^:a:
Run Code Online (Sandbox Code Playgroud)
这可以简单地替换为:
ethiop =: +/@(2&|@] # (2&*~ <@#)) (1>.<.@-:)^:a:
Run Code Online (Sandbox Code Playgroud)
这很好!成功冲了过去,当我想到时,我完全脱离了悬崖,在命令行上有一个monadic double:
+: 98
196
Run Code Online (Sandbox Code Playgroud)
并且双精度运算符必须比具有附加常量的双精度快,可能是双精度变换,所以我会这么认为
ethiop =: +/@(2&|@] # (+:~ <@#)) (1>.<.@-:)^:a:
Run Code Online (Sandbox Code Playgroud)
会工作......但事实并非如此.
我已经尝试了大写字母,连词等等,没有任何东西能让它起作用,它总是说"域名错误".我开始认为代码依赖于被称为monad的二元组以一种我无法获得的方式创建双倍表.
唯一的好处是J动词奇数与测试奇数无关.
任何人都可以向我解释这些事情,也许有英文解释该程序如何工作?不是算法如何工作,它是如何实现算法的.我记得1970年我在玩IBM 1130 APL的时候.这是一个8k字的APL翻译,不用说,它是有限的.例如,它有一个滚动但没有交易.解释器自行进出内存,1130支持代码覆盖,它将子程序分成组,当一个组调用另一个组时,它将从磁盘加载新组(是的,在8k中进行伪交换).所以我编写了交易的版本,使用各种方案,并且随机地,我们会找到一个可以逐步进入和退出而不寻求的版本,无论用多少行编写多少以及有多少解释器操作将运行10次像其他任何一样快.我不知道我在做什么,我会继续添加ravels和毫无意义的任务,并在各行之间打破语句或将它们组合起来,直到我得到一个不用寻求的方式运行.(正在寻求的52 52交易可能需要45秒).
然后昨晚我在J.计算了第150,000个Fibonacci数字.它必须是64位版本,花了一个小时,17分钟.我使用了精确的算术,数字有31349位数,它开始1012838344936638038 ......我意识到1130可能永远不会计算出这个,这个数字不合适,因为你需要三个和最大的一个有32k 16位字.我想学习可以做到这一点的语言,但是文档中缺少一些我没有得到的东西.
trace '(2&*) 15 7 3 1'
--------------- 4 Conj -------
2
&
*
2&*
--------------- 3 Adverb -----
2&*
~
2&*~
--------------- 8 Paren ------
(
2&*~
)
2&*~
--------------- 0 Monad ------
2&*~
15 7 3 1
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
==============================
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
Run Code Online (Sandbox Code Playgroud)
斐波纳契脚注:
]t150k=:6!:2 'a150k =: $ ":r150k=: {: (,+/@(_2&{.) )^:150000 (0x 1x)'
4631.62
0 60 60 #: t150k
1 17 11.6167
r150k
10128383449366380384728502706681008427227914006240871521944866167854579423510169
50198752571599303492471943589300904953648270811064370506598260395645679940891823
17307901573781852234222080308236027906733606532470814177610613237408102006595571
1949713927351702...
a150k
31349
Run Code Online (Sandbox Code Playgroud)
答案记录在Bond(&)下,其中注明了以下标识用于二元使用:
x m&v y↔m&v ^:xy
在你的例子中,m是2
,v是*
,x和y都是四个数字的列表15 7 3 1
.
等式右侧的措辞包括^:x
("对权力x"),这与采用动词并将其应用x次相同.动词是2&*
如此应用十五次.还有七次.还有三次.还有一次.这四个应用程序的结果构成了输出的四行.
专注于第三个并使用括号强调,这是正在发生的事情.
(2&* (2&* (2&* (15 7 3 1))))
120 56 24 8
Run Code Online (Sandbox Code Playgroud)
这是一样的
(2&*)^:3 (15 7 3 1)
120 56 24 8
Run Code Online (Sandbox Code Playgroud)
这是一样的
(3) 2&* (15 7 3 1)
120 56 24 8
Run Code Online (Sandbox Code Playgroud)
让我们将所有非负整数应用到3以查看模式:
(0 1 2 3) 2&* (15 7 3 1)
15 7 3 1
30 14 6 2
60 28 12 4
120 56 24 8
Run Code Online (Sandbox Code Playgroud)
此时,与原始表的相似性可能使该表的含义可访问:
(15 7 3 1) 2&* (15 7 3 1)
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
Run Code Online (Sandbox Code Playgroud)
同样的事情正在发生,它更多地发生,因为你给了一些更高的数字.