You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
1.7 KiB
129 lines
1.7 KiB
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var _ = strings.NewReader
|
|
|
|
func openf(path string) io.Reader {
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return f
|
|
}
|
|
|
|
func main() {
|
|
i := openf("inputs/0101.txt")
|
|
_ = i
|
|
t := strings.NewReader(`L68
|
|
L30
|
|
R48
|
|
L5
|
|
R60
|
|
L55
|
|
L1
|
|
L99
|
|
R14
|
|
L82
|
|
`)
|
|
|
|
//fmt.Println(puzzle_0101(i))
|
|
fmt.Println(puzzle_0102(t))
|
|
fmt.Println(puzzle_0102(i))
|
|
}
|
|
|
|
func puzzle_0101(r io.Reader) string {
|
|
|
|
turn := func(position, distance int) int {
|
|
n := position + distance
|
|
for n > 99 {
|
|
n -= 100
|
|
}
|
|
|
|
for n < 0 {
|
|
n += 100
|
|
}
|
|
return n
|
|
}
|
|
|
|
p := 50
|
|
var total int
|
|
s := bufio.NewScanner(r)
|
|
for s.Scan() {
|
|
if p == 0 {
|
|
total++
|
|
}
|
|
|
|
l := s.Text()
|
|
dir, dig := l[0], l[1:]
|
|
n, _ := strconv.Atoi(dig)
|
|
switch dir {
|
|
case 'R':
|
|
case 'L':
|
|
n = -n
|
|
}
|
|
|
|
p = turn(p, n)
|
|
|
|
}
|
|
return strconv.Itoa(total)
|
|
}
|
|
|
|
func puzzle_0102(r io.Reader) string {
|
|
|
|
turnR := func(position, distance int) (pos, clicks int) {
|
|
clicks = distance / 100
|
|
r := distance % 100
|
|
pos = position + r
|
|
if pos > 99 {
|
|
pos = pos-100
|
|
if pos != 0 {
|
|
clicks++
|
|
}
|
|
}
|
|
return pos, clicks
|
|
}
|
|
|
|
turnL := func(position, distance int) (pos, clicks int) {
|
|
clicks = distance / 100
|
|
r := distance % 100
|
|
pos = position - r
|
|
if pos < 0 {
|
|
pos = 100+pos
|
|
if position != 0 {
|
|
clicks++
|
|
}
|
|
}
|
|
|
|
return pos, clicks
|
|
}
|
|
|
|
p := 50
|
|
var total, clicks int
|
|
s := bufio.NewScanner(r)
|
|
for s.Scan() {
|
|
l := s.Text()
|
|
dir, dig := l[0], l[1:]
|
|
n, _ := strconv.Atoi(dig)
|
|
switch dir {
|
|
case 'R':
|
|
p, clicks = turnR(p, n)
|
|
case 'L':
|
|
p, clicks = turnL(p, n)
|
|
}
|
|
|
|
total += clicks
|
|
if p == 0 { total++ }
|
|
|
|
//fmt.Printf("INST %s, POS %d, CLICKS %d, TOTAL %d\n", l, p, clicks, total)
|
|
|
|
}
|
|
return strconv.Itoa(total)
|
|
}
|
|
|