03: part1+2
This commit is contained in:
parent
2545346566
commit
a72520ee75
4 changed files with 1140 additions and 0 deletions
39
3/part1.go
Normal file
39
3/part1.go
Normal file
|
@ -0,0 +1,39 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
//const entryBits = 12
|
||||
//const entryBits = 5
|
||||
|
||||
func main() {
|
||||
zeroes := [entryBits]int{}
|
||||
ones := [entryBits]int{}
|
||||
|
||||
s := bufio.NewScanner(os.Stdin)
|
||||
for s.Scan() {
|
||||
for i, v := range s.Bytes() {
|
||||
if v == '0' {
|
||||
zeroes[i]++
|
||||
} else {
|
||||
ones[i]++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gamma := 0
|
||||
|
||||
for i := range zeroes {
|
||||
if ones[i] > zeroes[i] {
|
||||
gamma |= 1 << (entryBits - i - 1)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
epsilon := gamma ^ ((1 << entryBits) - 1)
|
||||
|
||||
fmt.Println(gamma * epsilon)
|
||||
}
|
89
3/part2.go
Normal file
89
3/part2.go
Normal file
|
@ -0,0 +1,89 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const entryBits = 12
|
||||
//const entryBits = 5
|
||||
|
||||
func nthBit(f int, i int) int {
|
||||
a := entryBits - i - 1
|
||||
return f & (1 << a) >> a
|
||||
}
|
||||
|
||||
type NumberList []int
|
||||
|
||||
func (n NumberList) CountBits(index int) (ones int, zeroes int) {
|
||||
for _, num := range n {
|
||||
if nthBit(num, index) == 1 {
|
||||
ones++
|
||||
} else {
|
||||
zeroes++
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (n NumberList) Filter(index int, bit int) NumberList {
|
||||
var res NumberList
|
||||
for _, num := range n {
|
||||
if nthBit(num, index) == bit {
|
||||
res = append(res, num)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func main() {
|
||||
var numbers NumberList
|
||||
|
||||
s := bufio.NewScanner(os.Stdin)
|
||||
for s.Scan() {
|
||||
value, _ := strconv.ParseInt(s.Text(), 2, 64)
|
||||
numbers = append(numbers, int(value))
|
||||
}
|
||||
|
||||
oxygenNumbers := numbers
|
||||
for i := 0; i < entryBits; i++ {
|
||||
ones, zeroes := oxygenNumbers.CountBits(i)
|
||||
|
||||
var bit int
|
||||
if ones >= zeroes {
|
||||
bit = 1
|
||||
} else {
|
||||
bit = 0
|
||||
}
|
||||
|
||||
//fmt.Println(i, bit, zeroes, ones, len(oxygenNumbers))
|
||||
oxygenNumbers = oxygenNumbers.Filter(i, bit)
|
||||
if len(oxygenNumbers) == 1 {
|
||||
break
|
||||
}
|
||||
}
|
||||
oxygen := oxygenNumbers[0]
|
||||
|
||||
co2Numbers := numbers
|
||||
for i := 0; i < entryBits; i++ {
|
||||
ones, zeroes := co2Numbers.CountBits(i)
|
||||
|
||||
var bit int
|
||||
if ones < zeroes {
|
||||
bit = 1
|
||||
} else {
|
||||
bit = 0
|
||||
}
|
||||
|
||||
//fmt.Println(i, bit, zeroes, ones, len(co2Numbers))
|
||||
co2Numbers = co2Numbers.Filter(i, bit)
|
||||
if len(co2Numbers) == 1 {
|
||||
break
|
||||
}
|
||||
}
|
||||
co2 := co2Numbers[0]
|
||||
|
||||
fmt.Println(oxygen * co2)
|
||||
}
|
12
3/testinput
Normal file
12
3/testinput
Normal file
|
@ -0,0 +1,12 @@
|
|||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
Loading…
Reference in a new issue