12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- library(stringr)
- input <- readLines("input14.txt")
-
- # bits <- numeric(36)
- twop <- 2^(35:0)
- dat <- list()
-
- cmask <- rep("X", 36)
-
-
- for (ln in input) {
- if (grepl("^mask", ln)) {
- cmask <- unlist(str_split(str_extract(ln, "[X10]+$"), ""))
- } else if (grepl("^mem", ln)) {
- vp <- str_match(ln, "^mem\\[(\\d+)\\] = (\\d+$)")
- memadr <- vp[1,2]
- tval <- as.numeric(vp[1,3])
- bits <- numeric(36)
- for (x in 1:length(twop)) {
- if (tval >= twop[x]) {
- tval = tval - twop[x]
- bits[x] <- 1
- }
- }
- bits <- ifelse(cmask == "X", bits, as.numeric(cmask))
- dat[[memadr]] <- sum(bits * twop)
- }
- }
-
- print(sum(unlist(dat)), digits = 15)
-
- num2bin <- function(x) {
- bits <- numeric(36)
- for (i in 1:length(twop)) {
- if (x >= twop[i]) {
- x = x - twop[i]
- bits[i] <- 1
- }
- }
- bits
- }
-
- allposs <- function(bits) {
- isX <- which(is.na(bits))
- if(length(isX) != 0) {
- gridm <- as.matrix(expand.grid(lapply(isX, function(x) {0:1})))
- colnames(gridm) <- NULL
- return(apply(gridm, 1, function(r) {
- bits[isX] <- r
- sum(bits * twop)
- }))
- } else {
- return(sum(bits * twop))
- }
- }
-
- dat <- list()
-
- for (ln in input) {
- if (grepl("^mask", ln)) {
- cmask <- unlist(str_split(str_extract(ln, "[X10]+$"), ""))
- cmask <- ifelse(cmask == "X", NA, ifelse(cmask == "1", 1, 0))
- } else if (grepl("^mem", ln)) {
- vp <- str_match(ln, "^mem\\[(\\d+)\\] = (\\d+$)")
- memadr <- num2bin(as.numeric(vp[1,2]))
- tval <- as.numeric(vp[1,3])
- memadr <- ifelse(is.na(cmask), NA, ifelse(cmask == 1, 1, memadr))
- memadr <- allposs(memadr)
- for (m in memadr) {
- dat[[as.character(m)]] <- tval
- }
-
- }
- }
-
- print(sum(unlist(dat)), digits = 15)
|