99 lines
1.6 KiB
Go
99 lines
1.6 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"math"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var lyrs map[int]int
|
||
|
|
||
|
func main() {
|
||
|
inp := StdinToStrings()
|
||
|
lyrs = make(map[int]int)
|
||
|
for i := range inp {
|
||
|
pts := strings.Split(inp[i], ":")
|
||
|
lyrs[Atoi(pts[0])] = Atoi(strings.TrimSpace(pts[1]))
|
||
|
}
|
||
|
fmt.Println("== Part 1 ==")
|
||
|
fmt.Println("Total Severity:", HitchARide(0, false))
|
||
|
|
||
|
fmt.Println("== Part 2 ==")
|
||
|
fmt.Println("Delay", FindNoSeverity(), "picoseconds")
|
||
|
}
|
||
|
|
||
|
func HitchARide(delay int, brk bool) int {
|
||
|
var tm, top, sev int
|
||
|
for k := range lyrs {
|
||
|
if k > top {
|
||
|
top = k
|
||
|
}
|
||
|
}
|
||
|
for tm = delay; tm <= (top + delay); tm++ {
|
||
|
if v, ok := lyrs[(tm - delay)]; ok {
|
||
|
// There is a scanner here, did it see us?
|
||
|
if FindPos2(tm, v) == 0 {
|
||
|
sev += (tm * v)
|
||
|
if brk {
|
||
|
return -1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return sev
|
||
|
}
|
||
|
|
||
|
func FindNoSeverity() int {
|
||
|
maxInt := int((^uint(0) >> 1))
|
||
|
for i := 0; i < maxInt; i++ {
|
||
|
if HitchARide(i, true) == 0 {
|
||
|
return i
|
||
|
}
|
||
|
}
|
||
|
return -1
|
||
|
}
|
||
|
|
||
|
func FindPos(tm, lngth int) int {
|
||
|
var ret int
|
||
|
var isAsc bool
|
||
|
for i := tm; i > 0; i-- {
|
||
|
if ret == lngth-1 || ret == 0 {
|
||
|
isAsc = !isAsc
|
||
|
}
|
||
|
if isAsc {
|
||
|
ret++
|
||
|
} else {
|
||
|
ret--
|
||
|
}
|
||
|
}
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
func FindPos2(tm, lngth int) int {
|
||
|
loop := (lngth - 1) * 2
|
||
|
pos := (lngth - 1) - int(math.Abs(float64((lngth-1)-(tm%loop))))
|
||
|
return pos
|
||
|
}
|
||
|
|
||
|
func StdinToStrings() []string {
|
||
|
var input []string
|
||
|
scanner := bufio.NewScanner(os.Stdin)
|
||
|
for scanner.Scan() {
|
||
|
input = append(input, scanner.Text())
|
||
|
}
|
||
|
return input
|
||
|
}
|
||
|
|
||
|
func Atoi(i string) int {
|
||
|
var ret int
|
||
|
var err error
|
||
|
if ret, err = strconv.Atoi(i); err != nil {
|
||
|
log.Fatal("Invalid Atoi")
|
||
|
}
|
||
|
return ret
|
||
|
}
|