Нет необходимости «обрабатывать ноль», потому что добавление нуля не изменит ответ, поэтому вы можете просто использовать i.
, чтобы сгенерировать список чисел ниже 1000, например:
i. 10
0 1 2 3 4 5 6 7 8 9
J лучше всего работает с массивами, поэтому вы должны иметь возможность запрашивать остаток (|
) из 3 и 5 одновременно, вы можете использовать ранг ("
), чтобы управлять тем, как аргументы передаются в остаток :
3 5 |"0 1 i. 10
0 1 2 0 1 2 0 1 2 0
0 1 2 3 4 0 1 2 3 4
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Поскольку правый аргумент состоит только из одной строки, он передается повторно каждому элементу левого аргумента.
Теперь мы можем сделать 0=
для всего массива:
0 = 3 5 |"0 1 i. 10
1 0 0 1 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0
Вставить условие ИЛИ между двумя элементами (строками) массива:
+./ 0 = 3 5 |"0 1 i. 10
1 0 0 1 0 1 1 0 0 1
Получить индекс каждого 1 в списке / векторе:
I. +./ 0 = 3 5 |"0 1 i. 10
0 3 5 6 9
И сумма:
+/ I. +./ 0 = 3 5 |"0 1 i. 10
23
Вы можете довольно легко сделать это явной функцией / глаголом:
euler1=: verb define
+/ I. +./ 0 = 3 5 |"0 1 i. y
)
Или, как только вы научитесь молчать J, вы можете определить:
euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)