Files
advent-of-code-2025/cmd/day1/main.go
2025-12-06 13:35:40 +02:00

148 lines
2.2 KiB
Go

package main
import (
"bufio"
"errors"
"flag"
"fmt"
"log"
"os"
"strconv"
)
func main() {
debug := flag.Bool("debug", false, "Debug flag.")
flag.Parse()
d1 := dial{n: 50}
d2 := dial{n: 50}
if *debug {
fmt.Println("LINE d1 d2")
fmt.Println(" 50 50")
}
sc := bufio.NewScanner(os.Stdin)
for sc.Scan() {
if sc.Text() == "" {
log.Fatal("empty line")
}
n, err := strconv.ParseUint(sc.Text()[1:], 10, 0)
if err != nil {
log.Fatal(err)
}
i := int(n)
if sc.Text()[0] == 'L' {
i = -int(n)
}
// if err := handleLine(d1.Add1, sc.Text()); err != nil {
// log.Fatal(err)
// }
if err := handleLine(d1.Add1, sc.Text()); err != nil {
log.Fatal(err)
}
if err := handleLine(d2.Add2, sc.Text()); err != nil {
log.Fatal(err)
}
if *debug {
fmt.Printf("%+4d %2d %2d (%+3d %+3d)\n", i, d1.n, d2.n, d1.lastClicks, d2.lastClicks)
}
}
if err := sc.Err(); err != nil {
log.Fatal(err)
}
fmt.Println("zeros:", d1.zeros, d2.zeros)
fmt.Println("zero passes:", d1.zeroClicks, d2.zeroClicks)
}
func handleLine(add func(int), line string) error {
if line == "" {
return errors.New("empty line")
}
n, err := strconv.ParseUint(line[1:], 10, 0)
if err != nil {
return err
}
switch line[0] {
case 'L':
add(-int(n))
return nil
case 'R':
add(int(n))
return nil
default:
return fmt.Errorf("unexpected line: %q", line)
}
}
type dial struct {
n int
lastClicks int
zeros int
zeroClicks int
}
func (d *dial) Add1(n int) {
wasAtZero := d.n == 0
d.n += n
step := +100
if d.n < 0 {
step = -100
}
d.lastClicks = 0
for d.n < 0 || d.n > 99 {
d.lastClicks++
d.n -= step
}
if d.lastClicks > 0 && wasAtZero {
d.lastClicks--
}
if d.n == 0 {
d.zeros++
if d.lastClicks == 0 {
d.lastClicks++
}
}
d.zeroClicks += d.lastClicks
}
func (d *dial) Add2(diff int) {
n := d.n + diff
var clicks int
switch {
case n < 0:
wasAtZero := d.n == 0
for n < 0 {
if wasAtZero {
wasAtZero = false
} else {
clicks++
}
n += 100
}
if n == 0 && !wasAtZero {
clicks++
}
case n > 99:
for n > 99 {
clicks++
n -= 100
}
default:
if n == 0 && d.n != 0 {
clicks++
}
}
if n == 0 {
d.zeros++
}
d.n = n
d.lastClicks = clicks
d.zeroClicks += clicks
}