This went smoothly. No tricky parts and Part 2 was a simple extension of Part 1. No packages needed to solve (I used testthat for checking against the test input).
This was a textbook case for a while loop, which I rarely use in R.
steps_to_leave <- function(vec, allow_decreasing_offsets = FALSE){
index <- 1
steps <- 0
while(!is.na(vec[index])){
steps <- steps + 1
starting_position <- index
index <- starting_position + vec[index]
# increase or decrease original offset, updated for part 2
if(!allow_decreasing_offsets | vec[starting_position] < 3){
vec[starting_position] <- vec[starting_position] + 1
} else {
vec[starting_position] <- vec[starting_position] - 1
}
}
steps
}
# Part 1
test_vec <- c(0, 3, 0, 1, -3)
testthat::expect_equal(steps_to_leave(test_vec, FALSE), 5)
dat <- scan("05_1_dat.txt", numeric(), quote = "")
steps_to_leave(dat) # 364539
# Part 2
testthat::expect_equal(steps_to_leave(test_vec, TRUE), 10)
steps_to_leave(dat, TRUE) # 27477714