花札シャッフル

ACM ICPCこのページの問題文を参考にして書いてみた。
部分配列を連結してるから、もっとマシな書き方があるはず。

def getDatasets(lines)
  sets = []
  while !(lines.empty?)
    set = {'n' => 0, 'cuts' => []}
    line = lines[0].split(' ')
    set['n'] = line[0].to_i
    r = line[1].to_i
    lines.delete_at(0)

    r.times do
      cut = {}
      line = lines[0].split(' ')
      cut['p'] = line[0].to_i
      cut['c'] = line[1].to_i
      lines.delete_at(0)
      set['cuts'] << cut
    end
    sets << set
  end
  return sets
end

def shuffle(set)
  n = set['n']
  fuda = Array.new(n){|i| n - i}

  set['cuts'].each do |cut|
    p = cut['p']
    c = cut['c']
    tmp_c = fuda[p-1, c]
    tmp_p = fuda[0, p-1]
    rest = fuda[p, 51]
    fuda = tmp_c + tmp_p + rest
  end

  fuda[0]
end

sets = []
filename = ARGV[0]
lines = nil
open(filename) do |f|
  lines = f.readlines
end

sets = getDatasets(lines)

sets.each do |set|
  result = shuffle(set)
  p result unless result == nil
end

べ、、別に某社のインターンの問題に出されたと聞いて、練習でプログラム書いてみたってことじゃないんだからねっ!
あとでいい書き方を考えてみよう。