Add day 11 solution.
This commit is contained in:
parent
11483b86ed
commit
453521de55
64
day11.cr
Normal file
64
day11.cr
Normal file
|
@ -0,0 +1,64 @@
|
|||
map = Array(Array(Array(Int32))).new(301) { |i| Array(Array(Int32)).new(301) { |j| Array(Int32).new(301, 0) } }
|
||||
|
||||
pairs = (1..300).to_a.product (1..300).to_a
|
||||
(1..300).each do |y|
|
||||
(1..300).each do |x|
|
||||
rack_id = x + 10
|
||||
level = rack_id * y
|
||||
level += 3463
|
||||
level *= rack_id
|
||||
digit = (level / 100) % 10
|
||||
digit -= 5
|
||||
|
||||
map[x][y][1] = digit
|
||||
end
|
||||
end
|
||||
|
||||
def square_score(powers, coord, size)
|
||||
x, y = coord
|
||||
total = 0
|
||||
half = size / 2
|
||||
|
||||
total = powers[x][y][half] +
|
||||
powers[x][y + half][half] +
|
||||
powers[x + half][y][half] +
|
||||
powers[x + half][y + half][half]
|
||||
|
||||
if size.odd?
|
||||
size.times do |i|
|
||||
total += powers[x + size - 1][y + i][1]
|
||||
total += powers[x + i][y + size - 1][1]
|
||||
end
|
||||
total -= powers[x + size - 1][y + size - 1][1]
|
||||
end
|
||||
|
||||
powers[x][y][size] = total
|
||||
return total
|
||||
end
|
||||
|
||||
def max_score(powers, pairs, size = 3)
|
||||
possible_squares = (1..300 - size + 1).to_a
|
||||
possible_pairs = possible_squares.product possible_squares
|
||||
|
||||
possible_pairs.max_by do |pair|
|
||||
x, y = pair
|
||||
score = square_score(powers, pair, size)
|
||||
end
|
||||
end
|
||||
|
||||
puts max_score(map, pairs, 2)
|
||||
puts max_score(map, pairs, 3)
|
||||
|
||||
max = -1000
|
||||
max_pair = nil
|
||||
297.times do |i|
|
||||
pair = max_score(map, pairs, i + 4)
|
||||
score = square_score(map, pair, i + 4)
|
||||
if score > max
|
||||
max = score
|
||||
max_pair = { pair, i + 4 }
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
puts max_pair
|
Loading…
Reference in New Issue
Block a user