aoc2021/3.jl

62 lines
1.4 KiB
Julia

include("utils.jl")
function parse_input(filename)
input_lines = collect(non_empty_lines(filename))
width = length(input_lines[1])
integers = map(x->parse(Int, x, base = 2), input_lines)
(integers, width)
end
function most_common_bit(integers, width)
score = zeros(Int, width)
for int in integers
for index in 1:width
score[index] += ((int >> (index-1) & 1) - 0.5) * 2
end
end
map(map(sign, score)) do x
if x == 0
1
else
x
end
end
end
function solution3_1()
integers, width = parse_input("3.data")
score = most_common_bit(integers, width)
result = 0
cresult = 0
for i in 1:width
result += ((score[i] + 1) >> 1) << (i - 1)
cresult += (((score[i] * -1) + 1) >> 1) << (i - 1)
end
(result, cresult, result * cresult)
end
function filterdata(integers, width, score_factor)
ints = copy(integers)
for i in reverse(1:width)
score = most_common_bit(ints, width) * score_factor
ints = filter(ints) do x
(x & (1 << (i - 1))) >> (i - 1) == (score[i] + 1) >> 1
end
if length(ints) == 1
break
end
end
ints[1]
end
function solution3_2()
integers, width = parse_input("3.data")
oxy = filterdata(integers, width, 1)
co2 = filterdata(integers, width, -1)
(oxy, co2, oxy * co2)
end
solution3_2()