Skip to content

Instantly share code, notes, and snippets.

@carlwiedemann
Created December 12, 2024 17:41
Show Gist options
  • Save carlwiedemann/8c3721cf4188c07b5489214ff6fce9c7 to your computer and use it in GitHub Desktop.
Save carlwiedemann/8c3721cf4188c07b5489214ff6fce9c7 to your computer and use it in GitHub Desktop.
Advent of Code 2024 day012.rb
require_relative "main"
module Day012
INPUT = File.read("INPUT.txt")
grid = INPUT.to_grid
origins = grid.each_with_object(Hash.new { |h, k| h[k] = [] }) { |v, value, a| a[value].push(v) }
answer1 = 0
answer2 = 0
grid.raw.flatten.uniq.each do |char|
visited_global = Hash.new { |h, k| h[k] = false }
origins[char].each do |origin|
next if visited_global[origin]
visited_local = Hash.new { |h, k| h[k] = false }
corners = 0
edges_to_remove = 0
q = [origin]
while q.count > 0
c = q.shift
corners += [
[grid.get_value(c.north), grid.get_value(c.east)].none?(char),
[grid.get_value(c.north), grid.get_value(c.west)].none?(char),
[grid.get_value(c.south), grid.get_value(c.west)].none?(char),
[grid.get_value(c.south), grid.get_value(c.east)].none?(char),
[grid.get_value(c.north), grid.get_value(c.east)].all?(char) && grid.get_value(c.northeast) != char,
[grid.get_value(c.north), grid.get_value(c.west)].all?(char) && grid.get_value(c.northwest) != char,
[grid.get_value(c.south), grid.get_value(c.west)].all?(char) && grid.get_value(c.southwest) != char,
[grid.get_value(c.south), grid.get_value(c.east)].all?(char) && grid.get_value(c.southeast) != char
].count(true)
grid.four(c).filter { !visited_local[_1] && grid.get_value(_1) == char }.each do |n|
q.push(n) unless q.include?(n)
edges_to_remove += 1
end
visited_global[c] = visited_local[c] = true
end
area = visited_local.filter { _2 }.keys.count
perimeter = area * 4 - edges_to_remove * 2
sides = corners
answer1 += perimeter * area
answer2 += sides * area
end
end
pp answer1
pp answer2
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment