-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday19.R
98 lines (79 loc) · 2.83 KB
/
day19.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#Day 19
setwd("C:/Users/David.simons/Documents/advent of code")
library(data.table)
#storing maze as dt not super fast, but convenient and speed is still tolerable
input <- strsplit(readLines("day19.txt"), NULL)
maze <- data.table(i = rep(1:length(input), each=length(input[[1]])),
j = rep(1:length(input[[1]]), times=length(input)),
val = unlist(input))
I <- 1
J <- maze[i==1 & val == "|", j]
dir <- "d"
msg <- character()
done <- F
steps <- 0
while (!done) {
# check if at a letter
ch <- maze[i==I & j==J, val]
if (ch %in% LETTERS) msg <- c(msg, ch)
#usually take one step/cycle. will add additional if crossing
steps <- steps + 1
# set new position (I and J)
if (dir == "d") {
if (maze[i==I+1 & j==J, val] %in% c("|", "+", LETTERS)) {
I <- I + 1
} else if (maze[i==I+1 & j==J, val] == "-" && maze[i==I+2 & j==J, val] %in% c("|", "+", LETTERS)) {
I <- I + 2
steps <- steps + 1 #since 2 steps at once here
} else {
possible <- maze[i==I & abs(J-j)==1 & val %in% c("-", "+")]
if (nrow(possible)==1) {
dir <- if (possible$j > J) "r" else "l"
J <- possible$j
} else done <- T
}
} else if (dir == "u") {
if (maze[i==I-1 & j==J, val] %in% c("|", "+", LETTERS)) {
I <- I - 1
} else if (maze[i==I-1 & j==J, val] == "-" && maze[i==I-2 & j==J, val] %in% c("|", "+", LETTERS)) {
I <- I - 2
steps <- steps + 1 #since 2 steps at once here
} else {
possible <- maze[i==I & abs(J-j)==1 & val %in% c("-", "+")]
if (nrow(possible)==1) {
dir <- if (possible$j > J) "r" else "l"
J <- possible$j
} else done <- T
}
} else if (dir == "l") {
if (maze[i==I & j==J-1, val] %in% c("-", "+", LETTERS)) {
J <- J - 1
} else if (maze[i==I & j==J-1, val] == "|" && maze[i==I & j==J-2, val] %in% c("-", "+", LETTERS)) {
J <- J - 2
steps <- steps + 1 #since 2 steps at once here
} else {
possible <- maze[abs(i-I)==1 & j==J & val %in% c("|", "+")]
if (nrow(possible)==1) {
dir <- if (possible$i > I) "d" else "u"
I <- possible$i
} else done <- T
}
} else if (dir == "r") {
if (maze[i==I & j==J+1, val] %in% c("-", "+", LETTERS)) {
J <- J + 1
} else if (maze[i==I & j==J+1, val] == "|" && maze[i==I & j==J+2, val] %in% c("-", "+", LETTERS)) {
J <- J + 2
steps <- steps + 1 #since 2 steps at once here
} else {
possible <- maze[abs(i-I)==1 & j==J & val %in% c("|", "+")]
if (nrow(possible)==1) {
dir <- if (possible$i > I) "d" else "u"
I <- possible$i
} else done <- T
}
}
}
#part 1
print(do.call(paste0, as.list(msg)))
#part 2
print(steps)