# Advent of Code: Day 15

I found the `int_to_bin` function on StackOverflow as my initial attempts didn’t quite work. Given the high number of iterations I tried to optimize things a little. After a few tests, `vapply` was faster than `sapply` or `purrr::map_chr` (I didn’t save the benchmarks). Not by much, but with over 40 millions elements, it was worth using it. I also use the `parallel` package to do the conversion into binary on each “generator” to speed up the process a little. On my laptop, the first problem took about 20 minutes to complete and the second a little less.

# Part 1

``````library(parallel)

int_to_bin <- function(x) {
paste(vapply(strsplit(paste(rev(intToBits(x))),""), `[[`,
character(1), 2)[17:32],
collapse="")
}

next_row <- function(x, y = 16807) {
(x * y) %% 2147483647
}

build_vec <- function(start, total_length, f) {
vec <- integer(total_length+1)
vec <- start
for (i in 2:(total_length+1)) {
vec[i] <- next_row(vec[i-1], f)
}
vec[-1]
}

genA <- build_vec(516, 40e6, 16807)
genB <- build_vec(190, 40e6, 48271)

res <- mclapply(list(genA, genB),
function(x) vapply(x, int_to_bin, character(1)))

sum(res[] == res[])
``````

# Part 2

``````build_vec2 <- function(start, total_length, f, multiple) {
vec <- integer(total_length+1)
vec <- start
for (i in 2:(total_length+1)) {
res <- next_row(vec[i-1], f)
while (res %% multiple != 0)
res <- next_row(res, f)
vec[i] <- res
}
vec[-1]
}

genA2 <- build_vec2(516, 5e6, 16807, 4)
genB2 <- build_vec2(190, 5e6, 48271, 8)

res2 <- mclapply(list(genA2, genB2),
function(x) vapply(x, int_to_bin, character(1)))

sum(res2[] == res2[])
``````

Tags:

Categories:

Updated: