1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
INPUT = ARGF.read.chomp.to_i

FuelCell = Struct.new(*%i[ x y ]) do
  def rack_id
    x + 10
  end

  def power_level
    power_level = rack_id * y
    power_level += INPUT
    power_level *= rack_id
    power_level = power_level / 100 % 10
    power_level -= 5

    power_level
  end
end

grid = Hash.new(0)
(1..300).each do |x|
  (1..300).each do |y|
    grid[[x,y]] = FuelCell.new(x, y).power_level
  end
end

squares = Hash.new(0)
(1..300).each do |size|
  (1..(300-size+1)).each {|x|
    (1..(300-size+1)).each {|y|
      deltas = (0...size).flat_map {|d| [[size-1, d], [d, size-1]] }
      squares[[x,y,size]] = squares[[x,y,size-1]] + deltas.map {|(dx,dy)| grid[[x+dx, y+dy]] }.sum - grid[[x+size-1, y+size-1]]
    }
  }

  puts "#{size}: #{squares.max_by(&:last)}"
  squares.delete_if {|(_,_,s)| s < size }
end