PE1 Explained - kevinlawler/kona GitHub Wiki
Task
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
Solution
+/&~&/(!1e3)!/:3 5
233168
Explanation
1e3 is an abbreviation for 1000.0
(!1000) — create a list of integers 0, 1, 2, 3, ... 999
! is mod (sometimes)
!/: is mod each-right
so (!1000)!/:3 5 is two lists, each of 0,...,999 mod 3, and each of 0,...,999 mod 5
& is min (sometimes — dyadic) and &/ is min over
so &/ ... is 0 if either of x mod 3 or x mod 5 was 0 (the min of two lists is the min of each of their items. this property holds for most verbs. it also works recursively)
~ is not, so all those zeroes we found become 1, everything else becomes 0
& is where (sometimes — min), it turns 1s into their index in the
list, and 0 into nothing (try it out: what does where do on a list with numbers bigger than 1)
Plus sign is plus and +/ is plus over: sum everything together