From 17395adcc0379a696688195c24ac43184fceca8d Mon Sep 17 00:00:00 2001 From: Elias Kohout Date: Fri, 6 Dec 2024 23:08:31 +0100 Subject: [PATCH] add day 6 with part 2 being incomplete --- day6/data.txt | 131 +++++++++++++++++++++++++++ day6/distinct_positions.go | 125 ++++++++++++++++++++++++++ day6/loop_guard.go | 178 +++++++++++++++++++++++++++++++++++++ 3 files changed, 434 insertions(+) create mode 100644 day6/data.txt create mode 100644 day6/distinct_positions.go create mode 100644 day6/loop_guard.go diff --git a/day6/data.txt b/day6/data.txt new file mode 100644 index 0000000..6aa3008 --- /dev/null +++ b/day6/data.txt @@ -0,0 +1,131 @@ +#.............#.#...........................................................#..........#...........................#..........#... +............#......................#.......#..#.........#...................##.................................................... +..............#...........#..#.......#.........#.#...........................#................................#......#............ +.....#......................................#......#..#...................#....................#......................#........... +...#............................#................................#................................................................ +..........#..................#.....#......................................................#....................................... +..#........#.......#.#...............................................................#......#.................................#... +.#....#................#................#.....#...................#...............................................#..#............ +.......................................................................................#...#.#....#........##......#........#.#.## +............................................#.................#.....................#..........................#.................. +....#..........##......................#.................................................................................#........ +......#.............##.........#.......#.........#.......#.............#...#.......#.............................................. +.#............................................................................#..........#....#................................... +...#..#....#..............................#...........................................................................#........... +.............#.................................................................................................................... +................................#..................##...................................#...............................#......#.. +..........#.........#.................#..........###...........................................#............#...#................. +.............#....................................#.......#.#.#............#............................................#......... +......#.#..............................................................................................#.........................# +...#...#.........#.........#..#......#................##.................#........................................................ +.................................#......................#........#................#........................#...................... +.......................##..............#................#................#..............................#......................... +.......#...#.....#.....##........................#..................##.....#...................................................... +.............................................#...........................#..........................................#.....#....... +.........................#...............#....#..............#.......#...............#.#.................#.................#...... +...........................................................#....#..................................#.............................. +..........................#.................................................#............................##....#.................. +.................#...#.........................................................#........................#.....#..#................ +.........................#....#................................................#...#.....................#....#...........#....... +................................................##.......#.#....................................#.......##........................ +..........##...#.......................#....#..#....................#........................#.................................... +#......#.......................#............#.....................................................................#............... +.......#.......#...#..#..........#.......................................#.............#......#................................... +...............#............#..................#.................................................................................# +.......#...........#.......................##.....#.........#...........#...................#......#.........#.............##....# +...................#.........................#......#..........................................#..........#.........#......#...... +.....#............#..............#...#......#....................#.............#.................................................. +................................................#........#.....#...................#.....................................#.....#.. +......................#.#...##......................##...............................................#.................#.......... +#...................#.........................#...........#.....#................#.....................#...................#...... +....#................#.....#.............#.....................................#....#...#.................................#....... +.........#.....................................................................................................#.#.......#........ +.........#..........##..............................#............................#.#.............................#................ +#....#.#..............................................##...#...#...............#.............#.................................... +........#..#.#...................#.......................................................................#.............#..#.#...#. +.................................................................................................................#.......#........ +............................................#..#...............##........#..........#.......................................#....# +........#...........................#............................#.....#........................#..........#...#..........#....... +.#...........#...................................................#...........................................#................#.#. +............#...............................#........#...........#..........#...........#.#..............#........................ +...............................................................................##.#................#.............................. +.#.......................#.#...........#..................................#....................................................... +..#..............................................##................#.......#....#..............#.....................#...#........ +...................#.....#................................................#..........#.........#.........#.....................#.. +........#................#................................................................................#......#................ +...................#...#....#.........................#.........................#....................#..........................#. +.................#.......................................................#................................................#....... +..#...........................##.#.............#..#............................................#.......................#.#........ +..#......#.........................................................................#.......................#...................... +...........................................................................................................#............#......#.. +............................................................^..........................................#..........#............... +..#.........#....................#..........................................#........#.........................................#.. +........#...............#....#.............#......#.........................................................................#..... +.........#......#.....#..............#...........................................................#..............#................. +.........#...................................................#...###...........#.......#.##....................................... +.....................##.................#.........##.....................#................#................#.........#............ +.......................................................................#..............#..............#.................#.......... +.##.........#..........................................................................#....................................#..... +.........................#.............................#........................................................................#. +........#.............................................#......#....#.....................................#....................#.... +........#...#..............................................................................#.........#............................ +..............................#................................#..........#..............#..................................#..... +........##..#...................................#................................#.................#.........#......#..#........#. +..................#......#...................................................................#.................................... +..........#.............#..............#........#............#...............#..#..........#..............#.#...#............#.... +............................##....#..............#......................................................................#......... +...............................................#.....#...........#.....##...............#..#...................................... +.........................#.......#...............................#...........#.........#...........#....#......................... +.#............#...#...............#..............................................................#..........................#....# +#...........#......................................................#.............................#......#......................... +..................................................#....#...............#.........................#................................ +................................................#..........................#.......#..............................#....##.......#. +........#......#..#............#................#............................#......#.##.........#....................#..#........ +.......................................................#..#.#....................#..#......................................#...... +.....................#.......................................................................#............#....................... +.....................##........................#...................#.....................#........................................ +..........................#...........................................................................................#........... +..#..........#...................#..............##..#.....................#...................#..............#...........#........ +#................................#....##......#.............#..............#.......................#.........#...........#........ +..................#................#...............................#.....#..........#................#..............#............. +................#.#.........#.....##...............................................................#..............#............... +..#...............................................................................................#............................... +..........#.................#...........#.......#.........................#...#.......#........................................... +..##....#......................................#.#.......................................#.................#...................... +.......................#..#...#.##......................................................................#.........#...#........... +...............#.........#..............#.....................................................#...................#............... +......#.................#............#......#...................#..#.........................#........................#........#.. +......................................................................#...........................#........#...................... +..........#..........#........................#.............##.................................................................... +....#................................................#.......................#................#...............#................... +.................#....................................................#......#.................................................... +.#........#....................................................................................................................... +......##..................#....#......#.................#....................#.....................#..#...........#............... +#...#...#...#..............#........#.......................#.#..........#...............................#......#................. +#...#...................#.............#........#..........#...............................................................#...#... +..#................................#...#.........................#...................#......#..................................... +...#...###..........#............#...............................................................#..........#..................... +............#..............#.......#.....#..........#.....#.........................................................#............# +..#......................#..#...#................................#......#.......#.....#..................#.........#.............. +....##......#.......................................................#..............................................#.............. +...............................#.....#....#.................................................#.......#............#................ +..........#....#......................#........#..........................#......#................................................ +......#.............................#...........#..................#...........................#................................#. +...........................##..........................................#.....#.#.....................#................#........... +..#..............#.........................................................#........................#.........#.................#. +#.....#.....#......................#....................#........................................#...........#...........#......#. +.......................................#..#................................#.........#.......#..#.....#..........................# +..........#..............##...............#..........................................................#......#......#......#....#.. +.............#..............#..#......#........#..#......##.......................#...........#.......#........................... +......................#.......................................#.......#..#.....................................#.........#...##... +...........................#...........................#......#....#.............................#.............................#.. +..................#............................#....#........##.........................#..............#.............#............ +.......#....................#.....#........#.......#.#...#...............#.....#.#.........................#.......#.#............ +.....#.........#.......#..........#.................#..#...#..................................................##.................. +................#........................................................#........................................................ +....##......#........#..................#.........................#...................................#...#...................#... +..............#....................#.......#.......................#.............#......#..............#.......................... +...........................#..............#.....#............#.....................#........#....#.......................#........ +........#..##................#.....#.#..............#..............................#........................#.........#........... +.........................................................#...........................##..........#........#.##.................... + diff --git a/day6/distinct_positions.go b/day6/distinct_positions.go new file mode 100644 index 0000000..b180390 --- /dev/null +++ b/day6/distinct_positions.go @@ -0,0 +1,125 @@ +package main + +import ( + "os" + "fmt" + "strings" +) + +// type definitions +type Direction int +const ( + Up Direction = iota + 1 + Down + Left + Right +) + +type state struct { + field [][]rune + guard_x int + guard_y int + direction Direction +} + +func new_state(text string) *state { + lines := strings.Split(text, "\n") + field := make([][]rune, len(lines)) + guard := [2]int{-1,-1} + + for y := range lines { + field[y] = []rune(lines[y]) + + for x, r := range field[y] { + if r == '^' { + guard = [2]int{x, y} + field[y][x] = '.' + } + } + } + + s := state{field: field, guard_x: guard[0], guard_y: guard[1], direction: Up} + return &s +} + +// general util +func check(e error) { + if e != nil { panic(e) } +} + +func add_non_duplicate(slice [][2]int, elem [2]int) [][2]int { + for _, e := range slice { + if e == elem { return slice } + } + return append(slice, elem) +} + + +// simulation functions +func iter(s *state) *state { + new_guard_x := s.guard_x + new_guard_y := s.guard_y + + // try to move + switch { + case s.direction == Up: + new_guard_y-- + case s.direction == Down: + new_guard_y++ + case s.direction == Left: + new_guard_x-- + case s.direction == Right: + new_guard_x++ + } + + // if guard is outside of the field + if new_guard_x < 0 || new_guard_y < 0 || new_guard_x >= len(s.field[0]) || new_guard_y >= len(s.field) { + new_guard_x = -1 + new_guard_y = -1 + } else if s.field[new_guard_y][new_guard_x] == '#' { + // correct if path is blocked + switch { + case s.direction == Up: + new_guard_y++ + s.direction = Right + new_guard_x++ + case s.direction == Down: + new_guard_y-- + s.direction = Left + new_guard_x-- + case s.direction == Left: + new_guard_x++ + s.direction = Up + new_guard_y-- + case s.direction == Right: + new_guard_x-- + s.direction = Down + new_guard_y++ + } + } + + // set new guard coordinates + s.guard_x = new_guard_x + s.guard_y = new_guard_y + + return s +} + +// main loop +func main() { + + // read in file + dat, err := os.ReadFile("data.txt") + check(err) + dat_str := string(dat[:len(dat) - 1]) + + stateobj := new_state(dat_str) + + distinct_pos := make([][2]int, 0) + for stateobj.guard_x >= 0 { + distinct_pos = add_non_duplicate(distinct_pos, [2]int{stateobj.guard_x, stateobj.guard_y}) + stateobj = iter(stateobj) + } + + fmt.Println(len(distinct_pos)) +} diff --git a/day6/loop_guard.go b/day6/loop_guard.go new file mode 100644 index 0000000..8da1f3e --- /dev/null +++ b/day6/loop_guard.go @@ -0,0 +1,178 @@ +package main + +import ( + "os" + "fmt" + "strings" +) +// type definitions +type Direction int +const ( + Up Direction = iota + 1 + Down + Left + Right +) + +type state struct { + field *[][]rune + guard_x int + guard_y int + direction Direction +} + +func new_state(text string) *state { + lines := strings.Split(text, "\n") + field := make([][]rune, len(lines)) + guard := [2]int{-1,-1} + + for y := range lines { + field[y] = []rune(lines[y]) + + for x, r := range field[y] { + if r == '^' { + guard = [2]int{x, y} + field[y][x] = '.' + } + } + } + + s := state{field: &field, guard_x: guard[0], guard_y: guard[1], direction: Up} + return &s +} + +func (s *state) equals(other *state) bool { + return s.guard_x == other.guard_x && s.guard_y == other.guard_y && s.direction == other.direction +} + +// general util +func check(e error) { + if e != nil { panic(e) } +} + +func add_non_duplicate(slice []*state, elem *state) []*state { + for _, e := range slice { + if e.equals(elem) { return slice } + } + return append(slice, elem) +} + + +// simulation functions +func iter(s *state) *state { + new_guard_x := s.guard_x + new_guard_y := s.guard_y + + // try to move + switch { + case s.direction == Up: + new_guard_y-- + case s.direction == Down: + new_guard_y++ + case s.direction == Left: + new_guard_x-- + case s.direction == Right: + new_guard_x++ + } + + // if guard is outside of the field + if new_guard_x < 0 || new_guard_y < 0 || new_guard_x >= len((*s.field)[0]) || new_guard_y >= len(*s.field) { + new_guard_x = -1 + new_guard_y = -1 + } else if (*s.field)[new_guard_y][new_guard_x] == '#' { + // correct if path is blocked + switch { + case s.direction == Up: + new_guard_y++ + new_guard_x++ + s.direction = Right + case s.direction == Down: + new_guard_y-- + new_guard_x-- + s.direction = Left + case s.direction == Left: + new_guard_x++ + new_guard_y-- + s.direction = Up + case s.direction == Right: + new_guard_x-- + new_guard_y++ + s.direction = Down + } + } + + // set new guard coordinates + s.guard_x = new_guard_x + s.guard_y = new_guard_y + + return s +} + +func will_loop(s *state) bool { + distinct_states := make([]*state, 0, 130 * 130 * 4) + // while guard is within the field + for s.guard_x >= 0 { + // store copy of the current state + old_len := len(distinct_states) + cpy := state{ + field: s.field, + guard_x: s.guard_x, + guard_y: s.guard_y, + direction: s.direction, + } + distinct_states = add_non_duplicate(distinct_states, &cpy) + + // if duplicate state found, loop found + if len(distinct_states) == old_len { + return true + } + + // iterate + s = iter(s) + } + // the guard is no longer in the field, not a loop + return false +} + + +func print(s *state) { + out := make([]string, 0, len(*s.field)) + for _, line := range *s.field { + out = append(out, string(line)) + } + fmt.Println(strings.Join(out, "\n")) + fmt.Println("guard", s.guard_x, s.guard_y) +} + +// main loop +func main() { + // read in file + dat, err := os.ReadFile("data.txt") + check(err) + dat_str := strings.TrimSpace(string(dat)) + + stateobj := new_state(dat_str) + start_of_guard := [2]int{stateobj.guard_x, stateobj.guard_y} + + // check loops + counter := 0 + for y := range *stateobj.field { + for x, elem := range (*stateobj.field)[y] { + // skip already existing borders + if elem == '#' { continue } + // because the placement of the start position of the guard is not allowed + if x == start_of_guard[0] && y == start_of_guard[1] { continue } + + // set border + (*stateobj.field)[y][x] = '#' + + // check for loop + if will_loop(stateobj) { counter++ } + + // restore state + stateobj = new_state(dat_str) + } + } + + fmt.Println(counter) +}