day 3 part 2 finally done, ugly though
This commit is contained in:
parent
91383fc6b0
commit
a1264d825b
52
03/main.go
52
03/main.go
@ -3,7 +3,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/bits"
|
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
@ -39,7 +38,7 @@ func partOne() {
|
|||||||
line := scanner.Text()
|
line := scanner.Text()
|
||||||
lines++
|
lines++
|
||||||
n, _ := strconv.ParseInt(line, 2, 64)
|
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
|
// 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
|
r[i] += (n & (1 << i)) >> i
|
||||||
}
|
}
|
||||||
@ -60,7 +59,54 @@ func partOne() {
|
|||||||
func partTwo() {
|
func partTwo() {
|
||||||
scanner := makeScanner(false)
|
scanner := makeScanner(false)
|
||||||
|
|
||||||
|
var lines int
|
||||||
|
inputs := map[int]int64{}
|
||||||
|
var oxgen, co2scrub int64
|
||||||
|
|
||||||
|
var totalOnes, bitlen int64
|
||||||
for scanner.Scan() {
|
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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user