如何在J中重构这个?

时间:2009-10-12 23:37:48

标签: refactoring j tacit-programming

这是Project Euler#1解决方案的另一种方法:

+/~.(3*i.>.1000%3),5*i.>.1000%5

如何重构它?

3 个答案:

答案 0 :(得分:3)

+/(#~ ( (0= 3| ]) +. (0 = 5 |]) )) 1+i.999

0 = ( 3 | ])使用(两次)动词训练(fork)与n u v的技巧(在http://www.jsoftware.com/help/learning/09.htm末尾讨论)

另一种写作方式:

+/(#~ ( ((0&=) @ (3&|)) +. ((0&=) @ (5&|)))) 1+i.999

答案 1 :(得分:2)

[:+/@~.@,3 5([*i.@>.@%~)]

用法示例:

f =: [:+/@~.@,3 5([*i.@>.@%~)]
f 1000

+/~.,3 5([*i.@>.@%~)1000

%~                        = 4 : 'y % x'
i.@>.@%~                  = 4 : 'i. >. y % x'
[*i.@>.@%~                = 4 : 'x * i. >. y % x'
3 5([*i.@>.@%~)]          = 3 : '3 5 * i. >. y % 3 5'
[:+/@~.@,3 5([*i.@>.@%~)] = 3 : '+/ ~. , 3 5 * i. >. y % 3 5'

答案 2 :(得分:1)

这是另一种方法,使用简单的通用动词

multiplesbelow =: 4 : 'I. 0 = x | i.y'
+/ ~. ,3 5 multiplesbelow"0 [ 1000