Skip to content

Instantly share code, notes, and snippets.

@iley
Created December 3, 2021 08:57
Show Gist options
  • Save iley/cde878bc343b1fe4e3f5ff76a3da45ba to your computer and use it in GitHub Desktop.
Save iley/cde878bc343b1fe4e3f5ff76a3da45ba to your computer and use it in GitHub Desktop.
Advent of Code Day 3
BEGIN { FS="" }
{
for (i = 1; i <= NF; i++) {
if ($i == 1) ones[i]++
else zeroes[i]++
}
}
END {
gamma = 0
epsilon = 0
for (i = 1; i <= NF; i++) {
digit = ones[i] > zeroes[i] ? 1 : 0
gamma = gamma * 2 + digit
epsilon = epsilon * 2 + 1 - digit
}
print gamma * epsilon
}
function most_common_bit(numbers, pos, i, ones, zeroes) {
for (i in numbers) {
if (substr(numbers[i], pos, 1) == 1) ones++;
else zeroes++;
}
if (ones == zeroes) return 1;
else if (ones > zeroes) return 1;
else return 0
}
function least_common_bit(numbers, pos, i, ones, zeroes) {
for (i in numbers) {
if (substr(numbers[i], pos, 1) == 1) ones++;
else zeroes++;
}
if (ones == zeroes) return 0;
else if (ones < zeroes) return 1;
else return 0
}
function o2_rating(numbers, pos, i, remaining) {
for (i in numbers) remaining[i] = numbers[i]
for (pos = 1; pos <= NR; pos++) {
bit = most_common_bit(remaining, pos)
for (i in remaining) {
if (substr(remaining[i], pos, 1) != bit) {
delete remaining[i]
}
}
if (length(remaining) == 1)
for (i in remaining)
return remaining[i]
}
# Should never get here.
}
function co2_rating(numbers, remaining, pos, i) {
for (i in numbers) remaining[i] = numbers[i]
for (pos = 1; pos <= NR; pos++) {
bit = least_common_bit(remaining, pos)
for (i in remaining) {
if (substr(remaining[i], pos, 1) != bit) {
delete remaining[i]
}
}
if (length(remaining) == 1)
for (i in remaining)
return remaining[i]
}
# Should never get here.
}
function parsebin(bin, res, i) {
res = 0
for (i = 1; i <= length(bin); i++) {
res = res * 2 + substr(bin, i, 1)
}
return res
}
{
numbers[NR] = $0
}
END {
o2 = o2_rating(numbers)
co2 = co2_rating(numbers)
print parsebin(o2) * parsebin(co2)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment