Как рефакторинг это в J? - PullRequest
       22

Как рефакторинг это в J?

0 голосов
/ 13 октября 2009

Вот другой подход для решения Project Euler # 1:

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

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2012
+/(#~ ( (0= 3| ]) +. (0 = 5 |]) )) 1+i.999

0 = ( 3 | ]) использует (дважды) трюк поезда глагола (вилка) с n u v (обсуждается в конце http://www.jsoftware.com/help/learning/09.htm)

Другой способ написать это:

+/(#~ ( ((0&=) @ (3&|)) +. ((0&=) @ (5&|)))) 1+i.999
2 голосов
/ 23 октября 2009
[:+/@~.@,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'
1 голос
/ 14 ноября 2009

Вот другой подход, использующий простой общий глагол

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