Advent of Code 2019-07 with R
[This article was first published on Colin Fay, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Solving Advent of Code 2019-07 with R.
[Disclaimer] Obviously, this post contains a big spoiler about Advent of Code, as it gives solutions for solving day 7.
Instructions
Find the instructions at: https://adventofcode.com/2019/day/7
R solution
vec <- scan("input7.txt", numeric(), sep = ",") # Getting parse_opcode source("intcode_helpers.R") prog <- function(vec, inputs, pos = 1){ ipt_stat <- 1 stock <- 1 while (pos < length(vec)) { c(op_code, one, two, three) %<-% parse_opcode( vec, pos ) if (op_code == 99) { return( list( vec = vec, res = res, pos = pos, code = 99, processed = FALSE ) ) } if (op_code %in% 1:2){ if (op_code == 1) fun <- `+` if (op_code == 2) fun <- `*` vec[three] <- fun(one, two) pos <- pos + 4 } else if (op_code == 3){ if (stock > length(inputs)){ return( list( vec = vec, res = res, pos = pos, code = op_code, processed = TRUE ) ) } if (ipt_stat == 1){ vec[ vec[pos + 1] + 1 ] <- inputs[1] ipt_stat <- 2 } else { vec[ vec[pos + 1] + 1 ] <- inputs[2] } pos <- pos + 2 stock <- stock + 1 } else if (op_code == 4){ res <- vec[vec[pos + 1] + 1] pos <- pos + 2 } else if (op_code == 5){ if (one != 0){ pos <- two + 1 } else { pos <- pos + 3 } } else if (op_code == 6){ if (one == 0){ pos <- two + 1 } else { pos <- pos + 3 } } else if (op_code == 7){ if (one < two){ vec[three] <- 1 } else { vec[three] <- 0 } pos <- pos + 4 } else if (op_code == 8){ if (one == two){ vec[three] <- 1 } else { vec[three] <- 0 } pos <- pos + 4 } } return( list( vec = vec, res = res, pos = pos, code = op_code, processed = FALSE ) ) } res <- 0 comb <- expand.grid(0:4, 0:4, 0:4, 0:4, 0:4) to_keep <- apply(comb, 1, function(x){ length(unique(x)) != length(x) }) comb <- comb[!to_keep, ] for (i in seq_len(nrow(comb))){ phase <- comb[i, ] %>% as.numeric() start <- 0 for (j in seq_along(phase)){ start <- prog(vec, c(phase[j], start))$res } res[i] <- start } max(res) ## [1] 67023
Part two
library(purrr) ## ## Attaching package: 'purrr' ## The following object is masked from 'package:magrittr': ## ## set_names res <- 0 comb <- expand.grid(5:9, 5:9, 5:9, 5:9, 5:9) to_keep <- apply(comb, 1, function(x){ length(unique(x)) != length(x) }) comb <- comb[!to_keep, ] for (i in seq_len(nrow(comb))){ phase <- comb[i, ] %>% as.numeric() A <- prog(vec, c(phase[1], 0)) B <- prog(vec, c(phase[2], A$res)) C <- prog(vec, c(phase[3], B$res)) D <- prog(vec, c(phase[4], C$res)) E <- prog(vec, c(phase[5], D$res)) while( map_lgl( list(A, B, C, D, E), "processed" ) %>% all() ){ A <- prog(A$vec, E$res, pos = A$pos) B <- prog(B$vec, A$res, pos = B$pos) C <- prog(C$vec, B$res, pos = C$pos) D <- prog(D$vec, C$res, pos = D$pos) E <- prog(E$vec, D$res, pos = E$pos) } res[i] <- E$res } max(res) ## [1] 7818398
To leave a comment for the author, please follow the link and comment on their blog: Colin Fay.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.