Advent of Code 2020

14.R 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. library(stringr)
  2. input <- readLines("input14.txt")
  3. # bits <- numeric(36)
  4. twop <- 2^(35:0)
  5. dat <- list()
  6. cmask <- rep("X", 36)
  7. for (ln in input) {
  8. if (grepl("^mask", ln)) {
  9. cmask <- unlist(str_split(str_extract(ln, "[X10]+$"), ""))
  10. } else if (grepl("^mem", ln)) {
  11. vp <- str_match(ln, "^mem\\[(\\d+)\\] = (\\d+$)")
  12. memadr <- vp[1,2]
  13. tval <- as.numeric(vp[1,3])
  14. bits <- numeric(36)
  15. for (x in 1:length(twop)) {
  16. if (tval >= twop[x]) {
  17. tval = tval - twop[x]
  18. bits[x] <- 1
  19. }
  20. }
  21. bits <- ifelse(cmask == "X", bits, as.numeric(cmask))
  22. dat[[memadr]] <- sum(bits * twop)
  23. }
  24. }
  25. print(sum(unlist(dat)), digits = 15)
  26. num2bin <- function(x) {
  27. bits <- numeric(36)
  28. for (i in 1:length(twop)) {
  29. if (x >= twop[i]) {
  30. x = x - twop[i]
  31. bits[i] <- 1
  32. }
  33. }
  34. bits
  35. }
  36. allposs <- function(bits) {
  37. isX <- which(is.na(bits))
  38. if(length(isX) != 0) {
  39. gridm <- as.matrix(expand.grid(lapply(isX, function(x) {0:1})))
  40. colnames(gridm) <- NULL
  41. return(apply(gridm, 1, function(r) {
  42. bits[isX] <- r
  43. sum(bits * twop)
  44. }))
  45. } else {
  46. return(sum(bits * twop))
  47. }
  48. }
  49. dat <- list()
  50. for (ln in input) {
  51. if (grepl("^mask", ln)) {
  52. cmask <- unlist(str_split(str_extract(ln, "[X10]+$"), ""))
  53. cmask <- ifelse(cmask == "X", NA, ifelse(cmask == "1", 1, 0))
  54. } else if (grepl("^mem", ln)) {
  55. vp <- str_match(ln, "^mem\\[(\\d+)\\] = (\\d+$)")
  56. memadr <- num2bin(as.numeric(vp[1,2]))
  57. tval <- as.numeric(vp[1,3])
  58. memadr <- ifelse(is.na(cmask), NA, ifelse(cmask == 1, 1, memadr))
  59. memadr <- allposs(memadr)
  60. for (m in memadr) {
  61. dat[[as.character(m)]] <- tval
  62. }
  63. }
  64. }
  65. print(sum(unlist(dat)), digits = 15)