-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday_11_benchmark.R
More file actions
105 lines (87 loc) · 2.65 KB
/
Copy pathday_11_benchmark.R
File metadata and controls
105 lines (87 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
library(tidyverse)
library(microbenchmark)
# Prep
data <-
as_tibble(readLines("inputs/input11.txt")) %>%
separate_rows(value, sep = " ", convert = TRUE) %>%
count(value)
blink_run <- function(data, blinks) {
for (blink in seq_len(blinks)) {
data <- data %>%
mutate(len = str_length(value),
group = case_when(
value == 0 ~ "zeros",
len %% 2 == 0 ~ "evens",
TRUE ~ "remaining"
))
zeros <- data %>% filter(group == "zeros") %>% mutate(value = 1)
evens <- data %>%
filter(group == "evens") %>%
mutate(
value1 = as.integer(value %/% 10^(len / 2)),
value2 = value %% 10^(len / 2)
) %>%
select(-value, -len) %>%
pivot_longer(
cols = c(value1, value2),
names_to = "part",
values_to = "value"
) %>%
select(n, value)
remaining <- data %>%
filter(group == "remaining") %>%
mutate(value = value * 2024)
data <- bind_rows(zeros, evens, remaining) %>%
group_by(value) %>%
summarize(n = sum(n))
}
return(data$n %>% sum %>% as.character())
}
blink_run_2 <- function(data, blinks) {
for (blink in seq_len(blinks)) {
data <- data %>%
mutate(len = floor(log10(value))+1, ##Per Sarah Harris, I could have used my base 10 idea below to come up with length
group = case_when(
value == 0 ~ "zeros",
len %% 2 == 0 ~ "evens",
TRUE ~ "remaining"
))
zeros <- data %>% filter(group == "zeros") %>% mutate(value = 1)
evens <- data %>%
filter(group == "evens") %>%
mutate(
value1 = as.integer(value %/% 10^(len / 2)),
value2 = value %% 10^(len / 2)
) %>%
select(-value, -len) %>%
pivot_longer(
cols = c(value1, value2),
names_to = "part",
values_to = "value"
) %>%
select(n, value)
remaining <- data %>%
filter(group == "remaining") %>%
mutate(value = value * 2024)
data <- bind_rows(zeros, evens, remaining) %>%
group_by(value) %>%
summarize(n = sum(n))
}
return(data$n %>% sum %>% as.character())
}
# Part 1
# blink_run(data, 25)
# Part 2
# blink_run(data, 75)
benchmark_results <- microbenchmark(
Method1 = blink_run(data, 75),
Method2 = blink_run_2(data, 75),
times = 20
)
benchmark_results
#Unit: milliseconds
#expr min lq mean median uq max neval
#Method1 708.6825 721.9882 730.5786 731.5521 734.7662 770.1641 20
#Method2 650.3303 665.8900 681.0032 670.2369 676.8711 832.1300 20
#> 681/730.57
#> [1] 0.9321489