1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
stones = DATA.read.scan(/\d+/).map(&:to_i)

blink = Hash.new {|h, k|
  n, times = k
  h[k] = if times.zero?
           1
         elsif n.zero?
           h[[1, times-1]]
         elsif n.digits.length.even?
           a, b = n.divmod(10**(d.length/2))
           h[[a, times-1]] + h[[b, times-1]]
         else
           h[[n*2024, times-1]]
         end
}

pp stones.sum { blink[[_1, 6]] }
pp stones.sum { blink[[_1, 25]] }
pp stones.sum { blink[[_1, 75]] }

__END__