Advent of Code 2020

8.R 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. library(stringr)
  2. input <- readLines("input8.txt")
  3. code.parsed <- str_match(input, "^([\\w]{3}) ([\\+-]\\d+)$")
  4. cmds <- code.parsed[,2]
  5. params <- as.numeric(code.parsed[,3])
  6. runints <- function(cmds, params) {
  7. pos.hist <- c()
  8. cpos <- 1
  9. acc <- 0
  10. target <- length(cmds) + 1
  11. while ((!(cpos %in% pos.hist)) && cpos < target && cpos > 0) {
  12. pos.hist <- c(pos.hist, cpos)
  13. cin <- cmds[cpos]
  14. cpa <- params[cpos]
  15. if (cin == "jmp") {
  16. cpos <- cpos + cpa
  17. } else if (cin == "acc") {
  18. acc <- acc + cpa
  19. cpos <- cpos + 1
  20. } else {
  21. cpos <- cpos + 1
  22. }
  23. }
  24. # print(acc)
  25. ifelse(cpos == target, acc, NA)
  26. }
  27. runints(cmds, params)
  28. # crude rude brute force
  29. outputs <- sapply(1:length(cmds), function(x) {
  30. cmds1 <- cmds
  31. if (cmds[x] == "jmp") {
  32. cmds1[x] <- "nop"
  33. return(runints(cmds1, params))
  34. } else if (cmds[x] == "nop") {
  35. cmds1[x] <- "jmp"
  36. return(runints(cmds1, params))
  37. } else {
  38. return(NA)
  39. }
  40. })
  41. max(outputs, na.rm = TRUE)