Solved Part 2

master
s00ner 2021-12-04 11:48:04 -05:00
parent e36d97951a
commit c085f4461f
2 changed files with 41 additions and 6 deletions

12
day03/input.sample.txt Normal file
View File

@ -0,0 +1,12 @@
00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010

View File

@ -1,16 +1,14 @@
#!/bin/env ruby #!/bin/env ruby
#part 1 # Part 1
report = File.readlines('./input').map(&:strip) report = File.readlines('./input').map(&:strip)
masks = [] masks = []
report[0].length.times{ masks.push(2 ** _1) } report[0].length.times { masks.push(2**_1) }
report.map!{ _1.to_i(2) } report.map! { _1.to_i(2) }
gamma = 0 gamma = 0
masks.each do |mask| masks.each do |mask|
if report.map{ mask & _1 }.reject(&:zero?).count > report.count / 2 gamma += mask if report.map { mask & _1 }.reject(&:zero?).count > report.count / 2
gamma += mask
end
end end
epsilon = gamma ^ masks.sum epsilon = gamma ^ masks.sum
@ -18,3 +16,28 @@ puts "Gamma is #{gamma}"
puts "Epsilon is #{epsilon}" puts "Epsilon is #{epsilon}"
puts "Power is #{gamma * epsilon}" puts "Power is #{gamma * epsilon}"
# Part 2
def get_rating(report, masks, invert)
report_copy = report.clone
masks.each do |mask|
common = invert ? 1 : 0
if report_copy.map { mask & _1 }.reject(&:zero?).count >= report_copy.count / 2.to_f
common = invert ? 0 : 1
end
report_copy.reject! do |number|
if common.zero?
(mask & number).zero? ? false : true
else
(mask & number).zero? ? true : false
end
end
return report_copy[0] if report_copy.count == 1
end
end
masks.reverse!
o2 = get_rating(report, masks, false)
co2 = get_rating(report, masks, true)
puts "Oxygen rating is #{o2}"
puts "CO2 rating is #{co2}"
puts "Life Support rating is #{o2 * co2}"