You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
advent-of-code/2023/ruby/day_02.rb

40 lines
738 B

input = ARGF.read
def parse_cubes(input)
input
.scan(/(\d+) (\w+)/)
.to_h(&:reverse)
.transform_values(&:to_i)
end
bag = parse_cubes("12 red cubes, 13 green cubes, and 14 blue cubes")
Game = Data.define(:id, :reveals) do
def possible?(bag)
reveals.all? {|reveal|
bag.all? {|color, n| n >= reveal.fetch(color, 0) }
}
end
end
games = input
.scan(/^Game (\d+): ((?~\n))/)
.map {|id, reveals|
Game.new(
id.to_i,
reveals.split(?;).map { parse_cubes(_1) }
)
}
# part one
p games.select { _1.possible?(bag) }.sum(&:id)
# part two
p games
.map {|game|
game.reveals.inject {|bag, reveal|
bag.merge(reveal) { [_2, _3].max }
}
}
.sum {|bag| bag.values.inject(:*) }