diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-12-25 15:20:51 +0100 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-12-25 15:20:51 +0100 |
commit | e2dd1e03066c593a1df19190c4c72f27ea9714dd (patch) | |
tree | 9b544935de2e093e1e5f0908f73aeef5da733d0b /07/b.rb | |
parent | ae26a072fb9d90ad27238ea75004166d17521ed0 (diff) |
Add day 7
Diffstat (limited to '07/b.rb')
-rw-r--r-- | 07/b.rb | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -0,0 +1,36 @@ +rules = {} +contains = {} +File.readlines('input.txt').each do |line| + line.chomp! + bag, contents = line.split 'bags contain' + bag.strip! + rules[bag] = [] + contents.split(', ').map do |content| + match = /^(\d+) ([\w\s]+) bags?\.?$/.match(content.strip) + if match + number = match[1].to_i + color = match[2] + rules[bag].push [color, number] + else + contains[bag] = 0 + end + end +end + +changed = true +while changed + changed = false + rules.each do |bag, productions| + if !contains[bag] + if productions.all? { |rule| contains[rule[0]] } + contains[bag] = productions.reduce(0) do |bags, rule| + bags + (1 + contains[rule[0]]) * rule[1] + end + changed = true + rules.delete bag + end + end + end +end + +puts contains['shiny gold'] |