Day 6: Lanternfish

# Adbent Calendar Day 6

MAX_DAYS = 256
array = [];
File.foreach("6_input.dat").with_index do |line, line_num|
  array.push(line)
end
numbers = array[0].split(',').map(&:to_i)
days = 0

hash = {0 =>0, 1=>0, 2=>0, 3=>0,4=>0 ,5=>0, 6=>0, 7=>0, 8=>0}
numbers.each do |n|
  hash[n] = hash[n] + 1
end
while days != MAX_DAYS do
  t0 = hash[0]
  t1 = hash[1]
  t2 = hash[2]
  t3 = hash[3]
  t4 = hash[4]
  t5 = hash[5]
  t6 = hash[6]
  t7 = hash[7]
  t8 = hash[8]
  hash[0] = t1
  hash[1] = t2
  hash[2] = t3
  hash[3] = t4
  hash[4] = t5
  hash[5] = t6
  hash[6] = t7 + t0
  hash[7] = t8
  hash[8] = t0
  days = days + 1
end

count = 0
hash.each do |key, val|
  count = count + val
end

puts count

メモ

今回いちで面白い問題だった。問1はNested Loopの配列処理で解けるけれども、問2だと配列の要素数が指数関数的に増えるため、同じアルゴリズムで処理しようとするとパソコンが悲鳴をあげる。配列の代わりにハッシュを利用して0-9の魚の合計数を数えるアルゴリズムに変えると、時間かからずに一瞬で処理が完了。Rubyの配列は1000万くらいの要素数まではなんとか処理出来るということも学習出来たので良かった。