Обратите внимание, что ваш текущий код выдает ошибку длины, но я предложил изменить ваш вопрос, чтобы он работал. Сейчас я также включу рабочий код ниже.
(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100))) - (+/(((i.100)|~15)=0) # (i.100))
Тот же алгоритм можно написать более просто (в любом случае меньше скобок), просто изменив порядок операций (J оценивает «предложения» справа налево).
(+/ ((0 = 3|i.100) # i.100) , ((0 = 5|i.100) # i.100)) - +/(0 = 15|i.100)#i.100
2318
Вместо того, чтобы вычитать сумму, кратную 15, из первоначальной суммы, чтобы избежать двойного счетного числа, кратного как 3, так и 5, вы можете использовать ~.
(Nub), чтобы удалить любые дубликаты из вашего списка, кратного 3 и кратно 5, прежде чем их суммировать.
+/ ~. ((0 = 3|i.100) # i.100) , (0 = 5|i.100) # i.100
2318
Более подробный подход Jish к этой проблеме см. В ответе на этот вопрос о переполнении стека .