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