2021 Day 3 Complete!
This commit is contained in:
parent
cd7bb9ff91
commit
f3fe5c523b
1000
2021/day03/input
Normal file
1000
2021/day03/input
Normal file
File diff suppressed because it is too large
Load Diff
136
2021/day03/main.go
Normal file
136
2021/day03/main.go
Normal file
@ -0,0 +1,136 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
func main() {
|
||||
inp := h.StdinToStringSlice()
|
||||
part1(inp)
|
||||
part2(inp)
|
||||
}
|
||||
|
||||
func binStrToUint64(inp string) uint64 {
|
||||
var res uint64
|
||||
for i := range inp {
|
||||
if inp[i] == '0' {
|
||||
res = res << 1
|
||||
} else {
|
||||
res = (res << 1) | 1
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
type Pair struct {
|
||||
zero int
|
||||
one int
|
||||
}
|
||||
|
||||
func (p Pair) MostByte(fallback byte) byte {
|
||||
if p.zero == p.one {
|
||||
return fallback
|
||||
} else if p.zero > p.one {
|
||||
return '0'
|
||||
}
|
||||
return '1'
|
||||
}
|
||||
func (p Pair) LeastByte(fallback byte) byte {
|
||||
if p.zero == p.one {
|
||||
return fallback
|
||||
} else if p.zero < p.one {
|
||||
return '0'
|
||||
}
|
||||
return '1'
|
||||
}
|
||||
|
||||
func buildReport(inp []string) map[int]Pair {
|
||||
totals := make(map[int]Pair)
|
||||
for k := range inp {
|
||||
for i := range inp[k] {
|
||||
var p Pair
|
||||
var ok bool
|
||||
if p, ok = totals[i]; !ok {
|
||||
p = Pair{zero: 0, one: 0}
|
||||
}
|
||||
if inp[k][i] == '0' {
|
||||
p.zero++
|
||||
} else {
|
||||
p.one++
|
||||
}
|
||||
totals[i] = p
|
||||
}
|
||||
}
|
||||
return totals
|
||||
}
|
||||
|
||||
func part1(inp []string) {
|
||||
totals := buildReport(inp)
|
||||
var gamma uint64
|
||||
var epsilon uint64
|
||||
var gammaStr string
|
||||
var epsilonStr string
|
||||
for i := 0; i <= len(inp[0]); i++ {
|
||||
p, ok := totals[i]
|
||||
if ok {
|
||||
if p.zero > p.one {
|
||||
//gamma = gamma << 1
|
||||
//epsilon = (epsilon << 1) | 1
|
||||
gammaStr = gammaStr + "0"
|
||||
epsilonStr = epsilonStr + "1"
|
||||
} else {
|
||||
//gamma = (gamma << 1) | 1
|
||||
//epsilon = epsilon << 1
|
||||
gammaStr = gammaStr + "1"
|
||||
epsilonStr = epsilonStr + "0"
|
||||
}
|
||||
}
|
||||
}
|
||||
gamma = binStrToUint64(gammaStr)
|
||||
epsilon = binStrToUint64(epsilonStr)
|
||||
fmt.Println("# Part 1")
|
||||
fmt.Println("gamma:", gammaStr, gamma)
|
||||
fmt.Println("epsilon:", epsilonStr, epsilon)
|
||||
fmt.Println("power consumption:", (gamma * epsilon))
|
||||
fmt.Println("")
|
||||
}
|
||||
|
||||
func part2(inp []string) {
|
||||
fmt.Println("# Part 2")
|
||||
|
||||
bldOx := make([]string, len(inp))
|
||||
copy(bldOx, inp)
|
||||
idx := 0
|
||||
for len(bldOx) > 1 && idx < len(inp[0]) {
|
||||
totals := buildReport(bldOx)
|
||||
var next []string
|
||||
for i := range bldOx {
|
||||
if bldOx[i][idx] == totals[idx].MostByte('1') {
|
||||
next = append(next, bldOx[i])
|
||||
}
|
||||
}
|
||||
bldOx = next
|
||||
idx++
|
||||
}
|
||||
oxV := binStrToUint64(bldOx[0])
|
||||
fmt.Println("Oxygen Rating:", bldOx, oxV)
|
||||
co2 := make([]string, len(inp))
|
||||
copy(co2, inp)
|
||||
idx = 0
|
||||
for len(co2) > 1 && idx < len(inp[0]) {
|
||||
totals := buildReport(co2)
|
||||
var next []string
|
||||
for i := range co2 {
|
||||
if co2[i][idx] == totals[idx].LeastByte('0') {
|
||||
next = append(next, co2[i])
|
||||
}
|
||||
}
|
||||
co2 = next
|
||||
idx++
|
||||
}
|
||||
co2V := binStrToUint64(co2[0])
|
||||
fmt.Println("CO2 Rating:", co2, co2V)
|
||||
fmt.Println("Life Support Rating:", (oxV * co2V))
|
||||
}
|
12
2021/day03/testinput
Normal file
12
2021/day03/testinput
Normal file
@ -0,0 +1,12 @@
|
||||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
Loading…
Reference in New Issue
Block a user