day 3 part 2 finally done, ugly though

This commit is contained in:
David 2021-12-03 18:53:09 -05:00
parent 91383fc6b0
commit a1264d825b

View File

@ -3,7 +3,6 @@ package main
import (
"bufio"
"fmt"
"math/bits"
"os"
"strconv"
"time"
@ -39,7 +38,7 @@ func partOne() {
line := scanner.Text()
lines++
n, _ := strconv.ParseInt(line, 2, 64)
for i := 0; i < bits.Len(uint(n)); i++ {
for i := 0; i < len(line); i++ {
// check if the number in the i'th column is 1, then bit-shift back to the 1s place to add it if it is
r[i] += (n & (1 << i)) >> i
}
@ -60,7 +59,54 @@ func partOne() {
func partTwo() {
scanner := makeScanner(false)
var lines int
inputs := map[int]int64{}
var oxgen, co2scrub int64
var totalOnes, bitlen int64
for scanner.Scan() {
// line := scanner.Text()
line := scanner.Text()
n, _ := strconv.ParseInt(line, 2, 64)
inputs[lines] = n
bitlen = int64(len(line)) - 1
totalOnes += n >> (bitlen)
lines++
}
// make initial check
if totalOnes >= int64(lines)/2 {
oxgen += (1 << bitlen)
} else {
co2scrub += (1 << bitlen)
}
for i := bitlen; i > 0; i-- {
var oxOnes, oxZeroes, coOnes, coZeroes int64
for _, n := range inputs {
if oxgen>>i == n>>i {
if oxgen>>(i-1)^n>>(i-1) == 1 {
oxOnes++
} else {
oxZeroes++
}
}
if co2scrub>>i == n>>i {
if co2scrub>>(i-1)^n>>(i-1) == 1 {
coOnes++
} else {
coZeroes++
}
}
}
if oxOnes >= oxZeroes {
oxgen += (1 << (i - 1))
}
if coZeroes == 0 && coOnes != 0 {
co2scrub += (1 << (i - 1))
} else if coZeroes != 0 && coOnes == 0 {
co2scrub += (0 << (i - 1))
} else if coOnes < coZeroes {
co2scrub += (1 << (i - 1))
}
}
fmt.Println(oxgen * co2scrub)
}