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) }