2009-10-12 6 views
0

Вот другой подход для проекта Эйлера # 1 решение:Как реорганизовать это в J?

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

Как реорганизовать его? Пример

+0

Вы проверяли форум проекта euler для проблемы № 1? http://projecteuler.net/index.php?section=forum&id=1 – Macarse

+0

Я получил этот код оттуда. Но форум заблокирован. –

ответ

2
[:+/@[email protected],3 5([*[email protected]>[email protected]%~)] 

использование:

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

или

+/~.,3 5([*[email protected]>[email protected]%~)1000 

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

Это разборчиво для вас? Я все еще пытаюсь выяснить каждый шаг рефакторинга ... –

+0

спасибо за последнее редактирование, которое уточнял –

1

Вот другой подход, с использованием простой, универсальный глагол

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

Nice! Как насчет 'multiplesBelow =: 4: '(# ~ +./(0 = x |])" 0) i. Y''? Тогда вы можете сказать '+/3 5 multiplesBelow 1000'. –

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

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

Другой способ написания его:

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