Project Euler Problem1

Juliaでの方法

julia> sum( [n for n = 1:999 if n%3==0 || n%5==0] )

 

Forthでの方法

スタックの1番目のデータが3の倍数であるかを判断するワード
: is-multiple3 3 mod 0= ;


スタックの1番目のデータが5の倍数であるかを判断するワード
: is-multiple5 5 mod 0= ;


スタックの1番目と2番目のデータが、
それぞれ、3の倍数であるか、5の倍数であるかを判断し、
それらのOR(論理和)を返すワード
: is-multiple3or5 is-multiple3 swap is-multiple5 or ;


3または5の倍数の合計を計算するワード
: sum3or5 do i dup dup is-multiple3or5 if + else drop then loop ;


実行処理
先頭の「0」は合計を計算するスタックの領域
初期値が0で合計が累積される
0 1000 1 sum3or5 .

処理の説明
0 1000 1 sum3or5
0 1000 1 do i
これ以降、1から1000までの数値を対象とした処理が繰り返される
1を対象とした処理の開始
対象の1が3の倍数または5の倍数であるかを判断したいので、
対象の数値を2つコピーする
(判断処理を実行すると対象の数値がスタックから消えてしまうのでこのようにする)
0 1 dup dup
0 1 1 1 is-multiple3or5
0 1 1 1 is-multiple3
1は3の倍数ではないので0(false)が返ってくる
0 1 1 0 swap
0 1 0 1 is-multiple5
0 1 0 0 or
0 1 0 if
ifの結果がfalseになる
合計する対象ではないのでスタックから削除する
0 1 drop
0 loop
2を対象とした処理の開始
0 2 dup dup
(省略)
3を対象とした処理の開始
0 3 dup dup
0 3 3 3 is-multiple3or5
0 3 3 3 is-multiple3
3は3の倍数なので-1(true)が返ってくる
0 3 3 -1 swap
0 3 -1 3 is-multiple5
0 3 -1 0 or
orの結果がtrueになる
0 1 -1 if
ifの結果がtrueになる
合計する対象なので加算する
0 3 +
3 loop