Problem 1

10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、これらの合計は 23 になる。

同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。

Problem 1 - PukiWiki

awk

今回だけawkで変数使うとどうなるのかなーと思ってawkでも書いてみました。

BEGIN {
  x = 0;
  for(i = 1; i < 1000; i++) {
    if(i%3 == 0 || i%5 == 0) {
      x += i;
    }
  }
  print x;
}

なんていうかBEGIN{}に囲まれてる以外はほぼCって感じのコードになった…。awkでは変数宣言が要らないらしいのでその辺が一番の違いか。

Ruby

puts (1...1000).inject(0){|v,i| (i%3 == 0 || i%5 == 0) ? v+i:v }

そのまんまって感じ。Rubyで総和とか言われるとinject使ってみたくなっちゃう病。ただinjectは単語の意味が直感的じゃないと思うのは俺だけなんだろうか。

R版

x <- 0
for(i in 1:999) {
  if(i%%3 == 0 || i%%5 == 0) {
    x <- x + i
  }
}
x

考え方が手続き型すぎて全俺が泣いた。
このままではid:syou6162先生に怒られてしまうので必死に書き直した

sum(sapply(1:999, function(x){ifelse(x%%3&&x%%5, 0, x)}))

書き終わってみればとid:tor_ozaki氏と全く同じコードになっていた…
あと、lapplyでsumに突っ込もうとしたら出来なかった。Rにおけるリストとベクトルの違いがよく分からん…

Haskell

print $ sum [x | x <- [1..999], (mod x 3) == 0 || (mod x 5) == 0]

やばいリスト内包表記楽しすぎる。


RとHaskellでは1〜999って感じで書いてるのがなんとなく嫌かも。1000未満なんだからコードにも1000って書きたい。