148 lines
2.2 KiB
Go
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
|
|
}
|