input <- readLines("advent-data/2017-12-19-test-data.txt")
puzzle_to_mat <- function(input) {
input <- strsplit(input, "")
input_mat <- array(, dim = c(length(input), max(lengths(input))))
for (i in seq_along(input)) {
input_mat[i, 1:length(input[[i]])] <- input[[i]]
}
input_mat[is.na(input_mat)] <- " "
input_mat
}
go_down <- function(i, j) {
c(i + 1, j)
}
go_up <- function(i, j) {
c(i - 1, j)
}
go_right <- function(i, j) {
c(i, j + 1)
}
go_left <- function(i, j) {
c(i, j - 1)
}
navigate_puzzle <- function(puzzle) {
start <- which(puzzle[1, ] == "|")
letters_seen <- character(0)
f <- go_down
f_nm <- "go_down"
coords <- c(1, start)
next_coords <- f(coords[1], coords[2])
next_char <- puzzle[next_coords[1], next_coords[2]]
steps <- 0
while (next_char != " ") {
while (next_char != "+" && next_char != " ") {
coords <- f(coords[1], coords[2])
if (any(coords > dim(puzzle)) ||
any(coords == c(0, 0)))
break
next_char <- puzzle[coords[1], coords[2]]
steps <- steps + 1
if (grepl("[A-Z]", next_char))
letters_seen <- c(letters_seen, next_char)
}
if (f_nm %in% c("go_down", "go_up")) {
rght_coords <- go_right(coords[1], coords[2])
lft_coords <- go_left(coords[1], coords[2])
if ((!any(rght_coords > dim(puzzle))) &&
puzzle[rght_coords[1], rght_coords[2]] != " ") {
f <- go_right
f_nm <- "go_right"
next_char <- puzzle[rght_coords[1], rght_coords[2]]
} else {
f <- go_left
f_nm <- "go_left"
next_char <- puzzle[lft_coords[1], lft_coords[2]]
}
} else {
up_coords <- go_up(coords[1], coords[2])
down_coords <- go_down(coords[1], coords[2])
if ((!any(up_coords > dim(puzzle))) &&
puzzle[up_coords[1], up_coords[2]] != " ") {
f <- go_up
f_nm <- "go_up"
next_char <- puzzle[up_coords[1], up_coords[2]]
} else {
f <- go_down
f_nm <- "go_down"
next_char <- puzzle[down_coords[1], down_coords[2]]
}
}
}
list(paste(letters_seen, collapse = ""), steps)
}
input <- readLines("advent-data/2017-12-19-test-data.txt")
input <- puzzle_to_mat(input)
navigate_puzzle(input)
Comments