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