RubyでACM/ICPC vol. 0

Rubyの勉強を始めたので,ACM/ICPC国内予選の問題を解いてみました。問題は,2004年愛媛大会のProblem Aです。

#ACM/ICPC 2004 Domestic, Ehime

while line = gets
  line =~ /(\d+) (\d+)/
  n, r = $1.to_i, $2.to_i
  break if n == 0
 arr = (1..n).to_a

  r.times{
    buf = []
    line = gets
    line =~ /(\d+) (\d+)/
    p, c = $1.to_i, $2.to_i
    (n + 1 - p - c).upto(n - p){|i|
      buf << arr[i]
      arr[i] = nil
    }
    arr.compact!
    arr.concat(buf)
  }
  p arr.pop
end

まだまだRubyの実力の一部しか利用できていませんが,それでも,多重代入やArray#compact!,Integer#timesへのブロック付き呼び出しなど,単純にCで書くのに比べて,プログラマの労力が節約できるように設計されているというのは実感できました。ほかにも,

 arr = (1..n).to_a

と書いて配列を初期化してあるところなど,はじめは

  arr = []
  n.times{|i|
    arr << (i + 1)
  }

と書いていました。すでに,この段階でもC言語より楽に書けていると思いますが,Range#to_aメソッドを使って,たった1行で配列を連続整数値で初期化できてしまうのには感心しました。これだけをもってして言語の優劣を語ったりするのは愚かなことなのでしませんが,たしかに便利。


とりあえず,「たのしいRuby」を読み終わったところなので,これからもポツポツとプログラムを書いていって,使いこなせるようにしたいと思います。
この本ですが,コンパクトにまとまっていて読みやすかったと思います。完全なプログラミング初心者の勉強に適しているかどうかは分かりませんが,別の言語でループや構造化プログラミングといった基礎的な考え方を知っていて,なおかつクラスやオブジェクトという言葉も聞いたことがあるという程度の知識/経験を持った人であれば,難なく読み進められるのではないかと思いました。

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング