diff --git a/day22/day22.go b/day22/day22.go index 7abb0de..66b67b8 100644 --- a/day22/day22.go +++ b/day22/day22.go @@ -10,6 +10,68 @@ import ( func main() { //args := os.Args[1:] lines := helper.ReadTextFile("day22/input") + commandsLine := lines[len(lines)-1] + commandsLine = strings.ReplaceAll(commandsLine, "R", "R,") + commandsLine = strings.ReplaceAll(commandsLine, "L", "L,") + commands := strings.Split(commandsLine, ",") + fmt.Println(commands) + part1(lines, commands) + part2(lines, commands) + +} + +func part2(lines []string, commands []string) { + fields := [][][]rune{} + fields, cutFields := part2Parser(lines, fields, 50) + currentPosition := [4]int{0, 0, 0, 0} + for i, c := range cutFields[0][0] { + if c == '.' { + currentPosition[1] = i + break + } + } + fmt.Println(currentPosition) + for i, command := range commands { + fmt.Println(command) + currentPosition = runCommand(cutFields, command, currentPosition, true) + fmt.Printf("%v: %v \n", i+1, currentPosition) + } + fmt.Println(currentPosition) + fmt.Println(1000*(currentPosition[0]+101) + 4*(currentPosition[1]+51) + currentPosition[2]) +} + +func part2Parser(lines []string, fields [][][]rune, sidelength int) ([][][]rune, [][][]rune) { + for i := 0; i < 4*sidelength; i += sidelength { + field := [][]rune{} + for j := i; j < i+sidelength; j++ { + line := lines[j] + if line == "" { + break + } + fieldLine := strings.ReplaceAll(line, " ", "") + field = append(field, []rune(fieldLine)) + } + fields = append(fields, field) + } + cutFields := [][][]rune{} + for i := 0; i < len(fields); i++ { + field := fields[i] + if len(field[0]) < 2*sidelength { + cutFields = append(cutFields, field) + } else { + tmpFields := [2][][]rune{} + for _, fieldLine := range field { + tmpFields[0] = append(tmpFields[0], fieldLine[:sidelength]) + tmpFields[1] = append(tmpFields[1], fieldLine[sidelength:]) + } + cutFields = append(cutFields, tmpFields[:]...) + } + } + fmt.Println(len(cutFields)) + return fields, cutFields +} + +func part1(lines []string, commands []string) { field := [][]rune{} for _, line := range lines { if line == "" { @@ -17,30 +79,22 @@ func main() { } field = append(field, []rune(line)) } - commandsLine := lines[len(lines)-1] - commandsLine = strings.ReplaceAll(commandsLine, "R", "R,") - commandsLine = strings.ReplaceAll(commandsLine, "L", "L,") - commands := strings.Split(commandsLine, ",") - currentPosition := [3]int{0, 0, 0} + fields := [][][]rune{field} + currentPosition := [4]int{0, 0, 0, 0} for i, c := range field[0] { if c == '.' { currentPosition[1] = i break } } - fmt.Println(currentPosition) for _, command := range commands { - fmt.Println(command) - currentPosition = runCommand(field, command, currentPosition) - fmt.Println(currentPosition) + currentPosition = runCommand(fields, command, currentPosition, false) } - fmt.Println(currentPosition) fmt.Println(1000*(currentPosition[0]+1) + 4*(currentPosition[1]+1) + currentPosition[2]) - } -func runCommand(field [][]rune, command string, currentPosition [3]int) [3]int { +func runCommand(field [][][]rune, command string, currentPosition [4]int, part2 bool) [4]int { rotation := command[len(command)-1] if rotation < 57 { rotation = 0 @@ -48,7 +102,13 @@ func runCommand(field [][]rune, command string, currentPosition [3]int) [3]int { command = command[:len(command)-1] } distance := helper.RemoveError(strconv.Atoi(command)) - currentPosition = move(field, currentPosition, distance) + currentPosition = move(field, currentPosition, distance, part2) + currentPosition = rotate(rotation, currentPosition) + + return currentPosition +} + +func rotate(rotation uint8, currentPosition [4]int) [4]int { if rotation == 'R' { newDirection := currentPosition[2] + 1 if newDirection > 3 { @@ -63,18 +123,22 @@ func runCommand(field [][]rune, command string, currentPosition [3]int) [3]int { } currentPosition[2] = newDirection } - return currentPosition } -func getDirection(currentPosition [3]int) [2]int { +func getDirection(currentPosition [4]int) [2]int { directions := [][2]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}} return directions[currentPosition[2]] } -func move(field [][]rune, currentPosition [3]int, distance int) [3]int { +func move(fields [][][]rune, currentPosition [4]int, distance int, part2 bool) [4]int { + field := fields[0] direction := getDirection(currentPosition) for i := 0; i < distance; i++ { + if part2 { + field = fields[currentPosition[3]] + direction = getDirection(currentPosition) + } tmpPosition := [2]int{currentPosition[0], currentPosition[1]} tmpPosition[0] += direction[0] tmpPosition[1] += direction[1] @@ -83,7 +147,11 @@ func move(field [][]rune, currentPosition [3]int, distance int) [3]int { break } if check == 1 { - currentPosition = loop(field, currentPosition) + if !part2 { + currentPosition = loop(field, currentPosition) + } else { + currentPosition = loopPart2(fields, currentPosition) + } } if check == 0 { currentPosition[0] = tmpPosition[0] @@ -114,7 +182,7 @@ func checkPosition(field [][]rune, position [2]int) int { return -1 } -func loop(field [][]rune, currentPosition [3]int) [3]int { +func loop(field [][]rune, currentPosition [4]int) [4]int { direction := getDirection(currentPosition) newStartPosition := [2]int{0, 0} if direction[0] == 0 { @@ -139,3 +207,156 @@ func loop(field [][]rune, currentPosition [3]int) [3]int { } return currentPosition } + +func loopPart2(fields [][][]rune, currentPosition [4]int) [4]int { + tmpPosition := getNewStartPos(currentPosition, len(fields[0][0])) + field := fields[tmpPosition[3]] + if checkPosition(field, [2]int{tmpPosition[0], tmpPosition[1]}) == 0 { + return tmpPosition + } + return currentPosition +} + +func getNewStartPos(currentPosition [4]int, sidelength int) [4]int { + highestPos := sidelength - 1 + if currentPosition[3] == 0 { + switch currentPosition[2] { + case 0: + currentPosition[3] = 1 + currentPosition[1] = 0 + case 1: + currentPosition[3] = 2 + currentPosition[0] = 0 + case 2: + currentPosition[3] = 3 + currentPosition[1] = 0 + currentPosition[0] = invertPosition(currentPosition[0], highestPos) + currentPosition[2] = invertDirection(currentPosition[2]) + case 3: + currentPosition[3] = 5 + currentPosition[0] = currentPosition[1] + currentPosition[1] = 0 + currentPosition = rotate('R', currentPosition) + } + return currentPosition + } + if currentPosition[3] == 1 { + switch currentPosition[2] { + case 0: + currentPosition[3] = 4 + currentPosition[0] = invertPosition(currentPosition[0], highestPos) + currentPosition[1] = highestPos + currentPosition[2] = invertDirection(currentPosition[2]) + case 1: + currentPosition[3] = 2 + currentPosition[0] = currentPosition[1] + currentPosition[1] = highestPos + currentPosition = rotate('L', currentPosition) + case 2: + currentPosition[3] = 0 + currentPosition[1] = highestPos + case 3: + currentPosition[3] = 5 + currentPosition[0] = highestPos + } + return currentPosition + + } + if currentPosition[3] == 2 { + switch currentPosition[2] { + case 0: + currentPosition[3] = 1 + currentPosition[1] = currentPosition[0] + currentPosition[0] = highestPos + currentPosition = rotate('L', currentPosition) + case 1: + currentPosition[3] = 4 + currentPosition[0] = 0 + case 2: + currentPosition[3] = 3 + currentPosition[1] = currentPosition[0] + currentPosition[0] = 0 + currentPosition = rotate('L', currentPosition) + case 3: + currentPosition[3] = 0 + currentPosition[0] = highestPos + } + return currentPosition + } + if currentPosition[3] == 3 { + switch currentPosition[2] { + case 0: + currentPosition[3] = 4 + currentPosition[1] = 0 + case 1: + currentPosition[3] = 5 + currentPosition[0] = 0 + case 2: + currentPosition[3] = 0 + currentPosition[0] = invertPosition(currentPosition[0], highestPos) + currentPosition[1] = 0 + currentPosition[2] = invertDirection(currentPosition[2]) + case 3: + currentPosition[3] = 2 + currentPosition[0] = currentPosition[1] + currentPosition[1] = 0 + currentPosition = rotate('R', currentPosition) + } + return currentPosition + } + if currentPosition[3] == 4 { + switch currentPosition[2] { + //Potential Error + case 0: + currentPosition[3] = 1 + currentPosition[0] = invertPosition(currentPosition[0], highestPos) + currentPosition[1] = highestPos + currentPosition[2] = invertDirection(currentPosition[2]) + case 1: + currentPosition[3] = 5 + currentPosition[0] = currentPosition[1] + currentPosition[1] = highestPos + currentPosition = rotate('R', currentPosition) + case 2: + currentPosition[3] = 3 + currentPosition[1] = highestPos + case 3: + currentPosition[3] = 2 + currentPosition[0] = highestPos + } + return currentPosition + } + if currentPosition[3] == 5 { + switch currentPosition[2] { + case 0: + currentPosition[3] = 4 + currentPosition[1] = currentPosition[0] + currentPosition[0] = highestPos + currentPosition = rotate('L', currentPosition) + case 1: + currentPosition[3] = 1 + currentPosition[0] = 0 + case 2: + currentPosition[3] = 0 + currentPosition[1] = currentPosition[0] + currentPosition[0] = 0 + currentPosition = rotate('L', currentPosition) + case 3: + currentPosition[3] = 3 + currentPosition[0] = highestPos + } + return currentPosition + } + return currentPosition +} + +func invertPosition(input int, highestPos int) int { + return highestPos - input +} +func invertDirection(input int) int { + if input > 1 { + return input - 2 + } else { + return input + 2 + } +} diff --git a/day22/testinput2 b/day22/testinput2 new file mode 100644 index 0000000..67cce42 --- /dev/null +++ b/day22/testinput2 @@ -0,0 +1,17 @@ + ...#..#. + .#...... + #....#.. + ........ + ...# + #... + .... + ..#. +.......# +........ +...#.#.. +........ +...# +.... +..#. +.... +10R10R2L10L1R3L5L2L2L5R3L10 \ No newline at end of file diff --git a/day22/testinput2Copy b/day22/testinput2Copy new file mode 100644 index 0000000..74128a8 --- /dev/null +++ b/day22/testinput2Copy @@ -0,0 +1,17 @@ + 0>1#..#^ + .#v...8^ + #.v..#^^ + ..v..3>4 + ..v# + #.2> + >>>> + ..#. +..^....# +..7<<<<6 +...#.#.^ +.......^ +...# +.... +..#. +...5> +10R5L5R10L4R5L5R10 \ No newline at end of file diff --git a/day22/testinput2Copy2 b/day22/testinput2Copy2 new file mode 100644 index 0000000..b0c9a06 --- /dev/null +++ b/day22/testinput2Copy2 @@ -0,0 +1,17 @@ + >>1#..#. + .#v..... + #.v..#.. + <<2..... + ...# + #... + <8.. + .^#. +>3v..^.# +6v>>>7.. +^vv#.#.. +54v..... +..v# +..9. +..#. +.... +10R3R4R3R1R2R5L3L50 \ No newline at end of file diff --git a/day22/testinput2Copy3 b/day22/testinput2Copy3 new file mode 100644 index 0000000..3d50a89 --- /dev/null +++ b/day22/testinput2Copy3 @@ -0,0 +1,17 @@ + >1.#..#8 + .#....5> + #....#4< + ........ + ...# + #... + .... + ..#. +.......# +..3>>>>> +..^#.#6< +..^...7> +..^# +>>2. +..#. +.... +1L3L4R7R1R10L1L7 \ No newline at end of file diff --git a/day22/testinput2Copy4 b/day22/testinput2Copy4 new file mode 100644 index 0000000..789bc45 --- /dev/null +++ b/day22/testinput2Copy4 @@ -0,0 +1,17 @@ + >>1#..#. + 7#2>>>3. + #....#v. + <<<<<<4. + ...# + #... + .... + ..#. +>5.....# +.v...... +<6.#.#.. +........ +...# +.... +..#. +.... +10R1L4R2R9R2R10 \ No newline at end of file diff --git a/day22/testinputCopy5 b/day22/testinputCopy5 new file mode 100644 index 0000000..5395b0e --- /dev/null +++ b/day22/testinputCopy5 @@ -0,0 +1,17 @@ + >>1#.v#^ + .#v..7>8 + #.v..#.. + ..v..... + ..v# + #.v. + 3<2. + v.#. +....v..# +....v... +...#v#.. +....45.. +11..# +^6<< +^v#. +10v<9 +10R10R2L10L1R3L5L2L2L5R3L10 \ No newline at end of file