histories = ARGF.readlines.map { _1.scan(/-?\d+/).map(&:to_i) } history_diffs = histories.map {|history| diffs = [history] until diffs.last.all?(&:zero?) diffs << diffs.last.each_cons(2).map { _2 - _1 } end diffs } # part one p history_diffs.sum { _1.sum(&:last) } # part two p history_diffs.sum {|diffs| diffs.map(&:first).reverse.inject { _2 - _1 } }