やっぱり実際に何かしらのプログラムを作らないと身につかないと思うので、適当に書いてみた。

練習問題 – プログラミングスレまとめ in VIP
http://vipprog.net/wiki/exercise.html

FizzBuzz
ujihisaさんのパクリ。でもこれ、emacsで書いたんだ…

Ruby で快適に連投する11の方法 – ujihisa ‐ ニコニコ動画(原宿)
http://www.nicovideo.jp/watch/sm3728969

max = ARGV[0].to_i

def fizzbuzz(i)
  i % 15 == 0 ? 'FizzBuzz' : i % 5 == 0 ? 'Buzz' : i % 3 == 0 ? 'Fizz' : i.to_s
end

(1..max).each do |i|
  puts fizzbuzz(i)
end

平方根の計算
ニュートン法を使った。(というかそれ以外思いつかなかった)

num = ARGV[0].to_f
t = ARGV[1].to_i

num_next = num_ini = num

t.times do
  num_next = num - (num * num - num_ini) / ( 2 * num)
  num = num_next
end

puts num_next.to_s

階乗計算
再帰は大好きです。

num = ARGV[0].to_i

def fact(n)
  n == 0 ? 1 : n * fact(n-1)
end

p fact(num)
,

rubyを勉強中なのだが、いろいろな書き方出来る反面覚えるのが大変でちょっと混乱気味。
素数判定のプログラムでも書いてみようかと思って、エラトステネスのふるいをなるべくイメージどおりに実装してみたらこんな感じになった。

num = ARGV[0].to_i

list = Array.new
2.upto(num) {|n|
  list[n-1] = n
}

tmp = 2
prime = Array.new

while tmp <= Math::sqrt(num)
  prime.push tmp
  list.reject! {|x|
    x % tmp == 0
  }
  tmp = list.min
end

p prime + list
  • 2~最大値(コマンドライン引数) までのリストを作成
  • 既知の最小の素数の倍数をリストから消去
  • 素数自身も削除されるので別リストにpushで入れてく
  • 最大値の平方根までためせば十分なので、のこったリストと素数リストを結合 (アルゴリズムより)

という感じ。
リスト2つ使うのがスマートじゃなくて気に入らない。 もうちょっとメソッドを知ってればどうにかなる気もするんだけれどなぁ。

追記 2011/2/28
to_aメソッドという便利なものを知りませんでした。コメントありがとうございます。to arrayということで、Arrayクラスにしてくれるらしい。

num = ARGV[0].to_i

list = (2..num).to_a

tmp = 2
prime = Array.new

while tmp <= Math::sqrt(num)
  prime.push tmp
  list.reject! {|x|
    x % tmp == 0
  }
  tmp = list.min
end

p prime + list
,