DEV Community

Colin Fay
Colin Fay

Posted on • Originally published at colinfay.me on

Advent of Code 2020-08 with R

Solving Advent of Code 2020-08 with R.

[Disclaimer] Obviously, this post contains a big spoiler about Advent of Code.

Instructions

Input looks like this

nop +0 acc +1 jmp +4 acc +3 jmp -3 acc -99 acc +1 jmp -4 acc +6 
Enter fullscreen mode Exit fullscreen mode
  • There is a global var called accumulator, starting at 0

  • acc n increases or decreases accumulator by n, and goes to next row

  • jmp n jumps to a its position + n

  • nop does nothing but going to the next execution

  • If the program tries to execute a row twice, we stop, and the eturned value is the value just before that

Find the complete instructions at:https://adventofcode.com/2020/day/8.

R solution

Part one

# Reading the data input <- read.delim( sep = " ", "2020-08-aoc.txt", header = FALSE, stringsAsFactors = FALSE ) give_me_a_break <- function(input){ accumultor <- 0 current_row <- 1 done_row <- c() exit_code <- 0 while(TRUE){ if (current_row %in% done_row){ exit_code <- 1 break } if (current_row > nrow(input)){ break } done_row <- c(done_row, current_row) curr_row <- input[current_row,] if (curr_row$V1 == "nop") { current_row <- current_row + 1 } if (curr_row$V1 == "acc") { accumultor <- accumultor + curr_row$V2 current_row <- current_row + 1 } if (curr_row$V1 == "jmp") { current_row <- current_row + curr_row$V2 } } return( list( accumultor = accumultor, exit_code = exit_code ) ) } give_me_a_break(input) ## $accumultor ## [1] 1528 ##  ## $exit_code ## [1] 1 
Enter fullscreen mode Exit fullscreen mode

Part two

for (i in which(input$V1 %in% c("nop", "jmp"))){ modified_ipt <- input if (modified_ipt[i, 'V1'] == "nop"){ modified_ipt[i, 'V1'] <- "jmp" } else { modified_ipt[i, 'V1'] <- "nop" } res <- give_me_a_break(modified_ipt) if (res$exit_code == 0){ print(res$accumultor) break } } ## [1] 640 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)