Move code out of cmd
This commit is contained in:
22
day3/battery.go
Normal file
22
day3/battery.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
func readBatteries(r io.Reader) (banks [][]uint8, err error) {
|
||||
sc := bufio.NewScanner(r)
|
||||
for sc.Scan() {
|
||||
var bank []uint8
|
||||
for _, b := range sc.Bytes() {
|
||||
if b < '0' || b > '9' {
|
||||
return nil, fmt.Errorf("bank %q: invalid joltage %q", sc.Text(), b)
|
||||
}
|
||||
bank = append(bank, b-'0')
|
||||
}
|
||||
banks = append(banks, bank)
|
||||
}
|
||||
return banks, sc.Err()
|
||||
}
|
||||
4
day3/example.txt
Normal file
4
day3/example.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
987654321111111
|
||||
811111111111119
|
||||
234234234234278
|
||||
818181911112111
|
||||
86
day3/main.go
Normal file
86
day3/main.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"cmp"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
debug := flag.Bool("debug", false, "Debug.")
|
||||
flag.Parse()
|
||||
|
||||
f := os.Stdin
|
||||
if flag.NArg() > 0 {
|
||||
var err error
|
||||
f, err = os.Open(flag.Arg(0))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer f.Close()
|
||||
}
|
||||
|
||||
banks, err := readBatteries(f)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
var sum1, sum2 uint
|
||||
for _, bank := range banks {
|
||||
power1 := bestPowerPart1(bank)
|
||||
power2 := bestPowerPart2(bank)
|
||||
if *debug {
|
||||
for _, b := range bank {
|
||||
fmt.Print(b)
|
||||
}
|
||||
fmt.Println(":", power1, power2)
|
||||
}
|
||||
sum1 += power1
|
||||
sum2 += power2
|
||||
}
|
||||
|
||||
fmt.Println("sum (part 1):", sum1)
|
||||
fmt.Println("sum (part 2):", sum2)
|
||||
}
|
||||
|
||||
func bestPowerPart1(bank []uint8) uint {
|
||||
// i := maxIndex(bank[:len(bank)-1])
|
||||
// j := maxIndex(bank[i+1:]) + i + 1
|
||||
// return uint(bank[i])*10 + uint(bank[j])
|
||||
return bestPower(bank, 2)
|
||||
}
|
||||
|
||||
func bestPowerPart2(bank []uint8) uint {
|
||||
return bestPower(bank, 12)
|
||||
}
|
||||
|
||||
func bestPower(bank []uint8, batteries int) uint {
|
||||
if len(bank) < batteries {
|
||||
panic(fmt.Sprintf("bank (%d) is smaller than requested batteries (%d)", len(bank), batteries))
|
||||
}
|
||||
var joltage uint
|
||||
var i int
|
||||
for j := batteries - 1; j >= 0; j-- {
|
||||
k := maxIndex(bank[i : len(bank)-j])
|
||||
k += i
|
||||
i = k + 1
|
||||
joltage += uint(bank[k]) * uint(math.Pow10(j))
|
||||
}
|
||||
return joltage
|
||||
}
|
||||
|
||||
func maxIndex[S ~[]E, E cmp.Ordered](x S) int {
|
||||
if len(x) < 1 {
|
||||
panic("maxIndex: empty list")
|
||||
}
|
||||
i := 0
|
||||
for j := 1; j < len(x); j++ {
|
||||
if x[j] > x[i] {
|
||||
i = j
|
||||
}
|
||||
}
|
||||
return i
|
||||
}
|
||||
Reference in New Issue
Block a user