2011-10-16 2 views
0

J'apprends J et je commence par quelque chose de basique; en ajoutant les multiples de 3 et 5 ci-dessous 100. Je l'ai avec ce code:Consolidation de ce code J

(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100)))-(((i.100|~15)=0) # (i.100)) 

, mais il semble qu'il devrait y avoir un moyen plus facile. Y a-t-il un moyen de rendre ce code plus propre? Merci.

+0

duplication possible de [Comment refactor ce dans J?] (Http://stackoverflow.com/questions/1555807/how-to-refactor-this-in-j) – MPelletier

Répondre

1

Notez que votre code actuel donne une erreur de longueur mais j'ai suggéré une modification à votre question pour que cela fonctionne. Pour l'instant, je vais également inclure le code de travail ci-dessous.

(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100))) - (+/(((i.100)|~15)=0) # (i.100)) 

Le même algorithme peut être écrit plus simplement (moins entre parenthèses quand même) en modifiant simplement l'ordre des opérations (J évalue « phrases » de droite à gauche).

(+/ ((0 = 3|i.100) # i.100) , ((0 = 5|i.100) # i.100)) - +/(0 = 15|i.100)#i.100 
2318 

Plutôt que de soustraire la somme des multiples de 15 de la somme originale pour éviter nombre double comptage qui sont des multiples de deux 3 et 5, vous pouvez utiliser ~. (Nub) pour supprimer les doublons dans votre liste de multiples de 3 et multiples de 5 avant de les additionner.

+/ ~. ((0 = 3|i.100) # i.100) , (0 = 5|i.100) # i.100 
2318 

Pour une approche plus Jish à ce problème, voir la réponse à this stackoverflow question.

+0

ah oui merci .. j'ai eu un couple erreurs de transcription lors de la copie de mon bloc-notes. Je vais les réparer. mais merci – Deho

+0

Bien sûr, vous pouvez aussi obtenir les multiples de n en dessous de 100 par '(n * i.>. 100% n)'. Donc: '+/~. (3 * i.>. 100% 3), (5 * i.>. 100% 5)' – Eelvex