Problem:
0 から 9 までの数字だけで構成された文字列が与えられたとき,その文字列から次の規則に従って新しい文字列を作る操作を考える.与えられた文字列を左端から1文字ずつ順に読んで行き,同じ数字 a が r 個続いていた場合,個数 r と数字a を空白で区切らずにこの順で書き出す.与えられた文字列の右端まで読み,最後の書き出しが終わったところまでを途中何回書き出しがあったとしても全部まとめて操作1回とカウントする.2回目以降の操作は前回の操作により書き出された文字列を与えられた文字列として同様の操作を実施する.例えば “122244” という文字列が与えられた場合には左端から順に1個の1, 3個の2,2個の4なのでこの操作1回で得られる文字列は “113224” であり,“44444444444” (11 個の4)の場合には得られる文字列は “114” となる.

100 文字以下の与えられた文字列に上の操作を n 回実施した文字列を出力するプログラムを作成せよ.ただし, n ≤ 20 とする.

入力データ は 2 行からなり,1 行目に操作回数 n, 2 行目に最初の文字列が書かれている.

入力例

5

11

　

出力例

13112221

入力

入力は複数のデータセットからなる．n が 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、指定された回数の操作を施した文字列 を１行に出力する．

入力例

5
11
5
11
0

出力例

13112221
13112221

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Ruby (judge verdict: Accepted)

def main
  answers = []
  loop do
    n = gets.chomp.to_i
    break if n == 0
    src_str = gets.chomp
    dest_str = src_str

    n.times do
      dest_str = conversion(dest_str)
    end

    answers << dest_str
  end

  answers.each {|answer|puts answer}
end

def conversion src_str
  str_ary = get_same_char_string_ary(src_str)
  make_str(str_ary)
end

def get_same_char_string_ary src_str
  scan_result = []
  base_str = src_str
  loop do
    scan_str = get_same_char_string(base_str)
    break if scan_str.empty?
    base_str = base_str[scan_str.length..-1]
    scan_result << scan_str
  end
  scan_result
end

def get_same_char_string src_str
  first_char = src_str[0]
  same_char_string = ''
  src_str.each_char do |c|
    break if c != first_char
    same_char_string << c
  end
  same_char_string
end

def make_str str_ary
  dest_str = ''
  str_ary.each do |str|
    dest_str << str.length.to_s
    dest_str << str.chr
  end
  dest_str
end

main