-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday10_functions.R
117 lines (85 loc) · 2.74 KB
/
day10_functions.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
pipe_travel <- function(paths, nodes) {
for (i in seq_along(paths)) {
temp_node <- paths[[i]][length(paths[[i]])]
temp_previous_node <- paths[[i]][length(paths[[i]]) - 1]
# Determine what kind of pipe we have
temp_pipe <- day10[temp_node]
# Go up or down, depending on where we came from
if (temp_pipe == "|") {
temp_neighbours <- c(
temp_node + 1, # down
temp_node - 1 # up
)
# Check whether we can go down/up (e.g., can't go
# down if temp_node is already at the bottom)
node_idx <-
c(
temp_node %% nrow(nodes) != 0,
(temp_node - 1) %% nrow(nodes) != 0
)
temp_neighbours <- temp_neighbours[node_idx]
} else if (temp_pipe == "L") {
temp_neighbours <- c(
temp_node - 1, # up
temp_node + nrow(nodes) # right
)
node_idx <-
c(
(temp_node - 1) %% nrow(nodes) != 0,
!(temp_node - 1) %in% (length(nodes) - nrow(nodes) + 1):length(nodes)
)
temp_neighbours <- temp_neighbours[node_idx]
} else if (temp_pipe == "-") {
temp_neighbours <- c(
temp_node - nrow(nodes), # left
temp_node + nrow(nodes) # right
)
node_idx <-
c(
!temp_node %in% 1:nrow(nodes),
!(temp_node - 1) %in% (length(nodes) - nrow(nodes) + 1):length(nodes)
)
temp_neighbours <- temp_neighbours[node_idx]
} else if (temp_pipe == "7") {
temp_neighbours <- c(
temp_node - nrow(nodes), # left
temp_node + 1 # down
)
node_idx <-
c(
!temp_node %in% 1:nrow(nodes),
temp_node %% nrow(nodes) != 0
)
temp_neighbours <- temp_neighbours[node_idx]
} else if (temp_pipe == "J") {
temp_neighbours <- c(
temp_node - nrow(nodes), # left
temp_node - 1 # up
)
node_idx <-
c(
!temp_node %in% 1:nrow(nodes),
(temp_node - 1) %% nrow(nodes) != 0
)
temp_neighbours <- temp_neighbours[node_idx]
} else if (temp_pipe == "F") {
temp_neighbours <- c(
temp_node + 1, # down
temp_node + nrow(nodes) # right
)
node_idx <-
c(
temp_node %% nrow(nodes) != 0,
!(temp_node - 1) %in% (length(nodes) - nrow(nodes) + 1):length(nodes)
)
temp_neighbours <- temp_neighbours[node_idx]
}
# Don't go to the previous location
paths[[i]] <-
c(
paths[[i]],
temp_neighbours[temp_neighbours != temp_previous_node]
)
}
return(paths)
}