2009-10-12 15 views
0

est ici une approche différente pour le projet Euler # 1 solution:Comment refactoriser ceci en J?

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

Comment refactoriser?

+0

Avez-vous vérifié projet euler forum pour le problème n ° 1? http://projecteuler.net/index.php?section=forum&id=1 – Macarse

+0

J'ai reçu ce code à partir de là. Mais le forum est verrouillé. –

Répondre

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

:

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

ou

+/~.,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

c'est lisible pour vous? J'essaye toujours de comprendre chaque étape du refactoring ... –

+0

merci pour le dernier edit, c'était clarifier –

1

Voici une autre approche, en utilisant un simple verbe générique

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

Nice! Qu'en est-il de 'multipleBelow =: 4: '(# ~ +./(0 = x |])" 0) i .y''? Alors vous pouvez dire '+/3 5 multiplesBelow 1000'. –

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

0 = (3 | ]) utilisations (deux fois) le tour du train verbe (fourche) avec nuv (discuté à la fin de http://www.jsoftware.com/help/learning/09.htm)

Une autre façon de l'écrire:

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