Temporary Solution Day 22

This commit is contained in:
Karl Spickermann 2022-12-22 23:43:15 +01:00
parent 86f941e5d7
commit 6847e3241a
7 changed files with 341 additions and 18 deletions

View File

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

17
day22/testinput2 Normal file
View File

@ -0,0 +1,17 @@
...#..#.
.#......
#....#..
........
...#
#...
....
..#.
.......#
........
...#.#..
........
...#
....
..#.
....
10R10R2L10L1R3L5L2L2L5R3L10

17
day22/testinput2Copy Normal file
View File

@ -0,0 +1,17 @@
0>1#..#^
.#v...8^
#.v..#^^
..v..3>4
..v#
#.2>
>>>>
..#.
..^....#
..7<<<<6
...#.#.^
.......^
...#
....
..#.
...5>
10R5L5R10L4R5L5R10

17
day22/testinput2Copy2 Normal file
View File

@ -0,0 +1,17 @@
>>1#..#.
.#v.....
#.v..#..
<<2.....
...#
#...
<8..
.^#.
>3v..^.#
6v>>>7..
^vv#.#..
54v.....
..v#
..9.
..#.
....
10R3R4R3R1R2R5L3L50

17
day22/testinput2Copy3 Normal file
View File

@ -0,0 +1,17 @@
>1.#..#8
.#....5>
#....#4<
........
...#
#...
....
..#.
.......#
..3>>>>>
..^#.#6<
..^...7>
..^#
>>2.
..#.
....
1L3L4R7R1R10L1L7

17
day22/testinput2Copy4 Normal file
View File

@ -0,0 +1,17 @@
>>1#..#.
7#2>>>3.
#....#v.
<<<<<<4.
...#
#...
....
..#.
>5.....#
.v......
<6.#.#..
........
...#
....
..#.
....
10R1L4R2R9R2R10

17
day22/testinputCopy5 Normal file
View File

@ -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