2021 - Day 3
This commit is contained in:
parent
efafd55f96
commit
baf854ce39
9
2021/3/go.mod
Normal file
9
2021/3/go.mod
Normal file
|
@ -0,0 +1,9 @@
|
|||
module AoC/2021/3
|
||||
|
||||
require AoC/2021/common v0.0.0
|
||||
|
||||
require github.com/joho/godotenv v1.4.0 // indirect
|
||||
|
||||
replace AoC/2021/common v0.0.0 => ../common
|
||||
|
||||
go 1.17
|
2
2021/3/go.sum
Normal file
2
2021/3/go.sum
Normal file
|
@ -0,0 +1,2 @@
|
|||
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
|
||||
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
150
2021/3/main.go
Normal file
150
2021/3/main.go
Normal file
|
@ -0,0 +1,150 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"AoC/2021/common"
|
||||
"bufio"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func main() {
|
||||
part1()
|
||||
part2()
|
||||
}
|
||||
|
||||
func part1() {
|
||||
aoc := aoc.New(2021, 3)
|
||||
|
||||
aoc.Test(`
|
||||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
||||
`, 198)
|
||||
|
||||
aoc.Solution(func (input *bufio.Scanner) int {
|
||||
length := 0
|
||||
|
||||
var entries []int
|
||||
|
||||
for input.Scan() {
|
||||
line := input.Text()
|
||||
if len(line) > length {
|
||||
length = len(line)
|
||||
}
|
||||
|
||||
num, err := strconv.ParseInt(line, 2, 64)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
entries = append(entries, int(num))
|
||||
}
|
||||
|
||||
gamma := 0
|
||||
epsilon := 0
|
||||
for j := 0; j < length; j++ {
|
||||
var count int
|
||||
for _, num := range entries {
|
||||
count += num >> j & 1
|
||||
}
|
||||
|
||||
if float64(count)/float64(len(entries)) >= 0.5 {
|
||||
gamma += 1 << j
|
||||
} else {
|
||||
epsilon += 1 << j
|
||||
}
|
||||
}
|
||||
|
||||
return gamma*epsilon
|
||||
})
|
||||
}
|
||||
|
||||
func filter(entries []int, length int, findCommon bool) int {
|
||||
e := make([]int, len(entries))
|
||||
copy(e, entries)
|
||||
for j := length-1; j >= 0; j-- {
|
||||
var count int
|
||||
for _, num := range e {
|
||||
count += num >> j & 1
|
||||
}
|
||||
|
||||
var common int
|
||||
if !findCommon {
|
||||
common = 1
|
||||
}
|
||||
if float64(count)/float64(len(e)) >= 0.5 {
|
||||
if findCommon {
|
||||
common = 1
|
||||
} else {
|
||||
common = 0
|
||||
}
|
||||
}
|
||||
|
||||
n := 0
|
||||
for _, num := range e {
|
||||
if num >> j & 1 == common {
|
||||
e[n] = num
|
||||
n++
|
||||
}
|
||||
}
|
||||
e = e[:n]
|
||||
|
||||
if len(e) == 1 {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return e[0]
|
||||
}
|
||||
|
||||
func part2() {
|
||||
aoc := aoc.New(2021, 3)
|
||||
|
||||
aoc.Test(`
|
||||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
||||
`, 230)
|
||||
|
||||
aoc.Solution(func (input *bufio.Scanner) int {
|
||||
length := 0
|
||||
|
||||
var entries []int
|
||||
|
||||
for input.Scan() {
|
||||
line := input.Text()
|
||||
if len(line) > length {
|
||||
length = len(line)
|
||||
}
|
||||
|
||||
num, err := strconv.ParseInt(line, 2, 64)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
entries = append(entries, int(num))
|
||||
}
|
||||
|
||||
oxygen := filter(entries, length, true)
|
||||
co2 := filter(entries, length, false)
|
||||
|
||||
return int(oxygen * co2)
|
||||
})
|
||||
}
|
Loading…
Reference in New Issue
Block a user