AdventOfCode > 2022
Part 1: Find the item type that appears in both compartments of each rucksack. What is the sum of the priorities of those item types?
I manually downloaded my personal day 3 input file as a logged user, and here I get the data.
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.0 ✔ purrr 0.3.5
✔ tibble 3.1.8 ✔ dplyr 1.0.10
✔ tidyr 1.2.1 ✔ stringr 1.4.1
✔ readr 2.1.3 ✔ forcats 0.5.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
data <-
read_csv(
here::here("2022/03_input"),
col_names = c("rucksack"),
show_col_types = FALSE
)
data %>% print(n = 30)
# A tibble: 300 × 1
rucksack
<chr>
1 jVTBgVbgJQVrTLRRsLvRzWcZvnDs
2 dhtmhfdfNlNNldfqmPCflqGbNZDHsDWcRzvczWsczZNzHz
3 tmwwwCCfbJSMbwMb
4 hsrZZhHlhrHmPPbMbDFDQdnQgLfMFDdDQQ
5 GpBtwtqrcCcjgnLgqfgDDgRn
6 cJwVwpCpGJctJtBcCrSCGrVJhlsbvSvTvbmHmmsWmHslmsHm
7 gCtWJvmfmGGwVVMhJw
8 nzRSpZbSVFFRDFSDzcplddqplqMhQMclMp
9 zFLszzRTDnZnbTZTRZsVNgCjrvfvgtvNmtfvLW
10 glRQRpQQtQtGtQws
11 TnmbLqvBFRFFLPBFnPbvRBhshTtHWhwzdwtHdsdzWhws
12 qmCLPNmCFnLBnmPPqVbFLRrJjVggDgJjlZVVDjDlDD
13 vRRgpWvPQFdTFDDNQs
14 bqtCmltmlbwqLVLZqwtmLBBTMcGBddTTBgFNGcZGMD
15 bbtmJmjlVlwblwwbwzbbvrrznvzShgRhRvhfWrWn
16 ZMhThfNcpbbMNNjsHpmpsRqsPmRs
17 wQjDgggQDPqqDlsD
18 SCwSzvLVCSVtQVgLnrccfdGdTdZfcZMtjJhG
19 wNnNmNHnNPPwwPGCrLSZZvdVVZvBtMMvdm
20 WQzlhzjzbBtMMlBrMl
21 szbgWhJjTTcsWTqgzsqcsGHfwNcwfwnHHrCGCPPGwr
22 CNsbpFCMSrmDhQHNNGmH
23 fQPPPcqvljQzjVDDgRBhGGqDgqqD
24 ZctlcVzcfltQtnrndbQMCM
25 NQjQjQvZvZjcvrrrNjgTQgBQwTJsJswJlbGstqqtmGhmwhqw
26 PWpHRzRnPHHSCnPFwlqhbtqGZClJqGqG
27 ZzVpMpWPHnVzzpWzDRzSZrcdDQdrQNrcQgQfjcNfjf
28 BSZMtdtZBzMFvhCbBJDbhDDC
29 qcqVVmccrmVcjrlHqTrjDJRPQhWvPWWfPvblffDf
30 cHTrbGwpmGwVjdFMnzpLznMztd
# … with 270 more rows
I tokenize rucksack characters and split them in half:
data %>%
rowwise() %>%
mutate(rucksack = str_split(rucksack, "")) %>%
mutate(half = length(rucksack)/2) %>%
mutate(first = list(head(rucksack, half))) %>%
mutate(second = list(tail(rucksack, half)))
# A tibble: 300 × 4
# Rowwise:
rucksack half first second
<list> <dbl> <list> <list>
1 <chr [28]> 14 <chr [14]> <chr [14]>
2 <chr [46]> 23 <chr [23]> <chr [23]>
3 <chr [16]> 8 <chr [8]> <chr [8]>
4 <chr [34]> 17 <chr [17]> <chr [17]>
5 <chr [24]> 12 <chr [12]> <chr [12]>
6 <chr [48]> 24 <chr [24]> <chr [24]>
7 <chr [18]> 9 <chr [9]> <chr [9]>
8 <chr [34]> 17 <chr [17]> <chr [17]>
9 <chr [38]> 19 <chr [19]> <chr [19]>
10 <chr [16]> 8 <chr [8]> <chr [8]>
# … with 290 more rows
Find the item type that appears in both compartments of each rucksack
data %>%
rowwise() %>%
mutate(rucksack = str_split(rucksack, "")) %>%
mutate(half = length(rucksack)/2) %>%
mutate(first = list(head(rucksack, half))) %>%
mutate(second = list(tail(rucksack, half))) %>%
mutate(problem = intersect(first, second))
# A tibble: 300 × 5
# Rowwise:
rucksack half first second problem
<list> <dbl> <list> <list> <chr>
1 <chr [28]> 14 <chr [14]> <chr [14]> L
2 <chr [46]> 23 <chr [23]> <chr [23]> N
3 <chr [16]> 8 <chr [8]> <chr [8]> w
4 <chr [34]> 17 <chr [17]> <chr [17]> M
5 <chr [24]> 12 <chr [12]> <chr [12]> q
6 <chr [48]> 24 <chr [24]> <chr [24]> S
7 <chr [18]> 9 <chr [9]> <chr [9]> J
8 <chr [34]> 17 <chr [17]> <chr [17]> p
9 <chr [38]> 19 <chr [19]> <chr [19]> L
10 <chr [16]> 8 <chr [8]> <chr [8]> Q
# … with 290 more rows
I find the priority for each rucksack:
item_types <- c(letters, LETTERS)
data %>%
rowwise() %>%
mutate(rucksack = str_split(rucksack, "")) %>%
mutate(half = length(rucksack)/2) %>%
mutate(first = list(head(rucksack, half))) %>%
mutate(second = list(tail(rucksack, half))) %>%
mutate(problem = intersect(first, second)) %>%
ungroup() %>%
mutate(priority = match(problem, item_types))
# A tibble: 300 × 6
rucksack half first second problem priority
<list> <dbl> <list> <list> <chr> <int>
1 <chr [28]> 14 <chr [14]> <chr [14]> L 38
2 <chr [46]> 23 <chr [23]> <chr [23]> N 40
3 <chr [16]> 8 <chr [8]> <chr [8]> w 23
4 <chr [34]> 17 <chr [17]> <chr [17]> M 39
5 <chr [24]> 12 <chr [12]> <chr [12]> q 17
6 <chr [48]> 24 <chr [24]> <chr [24]> S 45
7 <chr [18]> 9 <chr [9]> <chr [9]> J 36
8 <chr [34]> 17 <chr [17]> <chr [17]> p 16
9 <chr [38]> 19 <chr [19]> <chr [19]> L 38
10 <chr [16]> 8 <chr [8]> <chr [8]> Q 43
# … with 290 more rows
Here the full code:
library(tidyverse)
item_types <- c(letters, LETTERS)
common_half <- function(x) {
half <- length(x) / 2
intersect(
head(x, half), tail(x, half)
)
}
read_csv(
here::here("2022/03_input"),
col_names = c("rucksack"),
show_col_types = FALSE
) %>%
mutate(rucksack = str_split(rucksack, "")) %>%
rowwise() %>%
mutate(problem = common_half(rucksack)) %>%
ungroup() %>%
mutate(priority = match(problem, item_types)) %>%
summarise(result = sum(priority))
# A tibble: 1 × 1
result
<int>
1 8109
Part 2: Find the item type that corresponds to the badges of each three-Elf group. What is the sum of the priorities of those item types?
I make groups for each 3 lines:
data %>%
mutate(rucksack = str_split(rucksack, "")) %>%
group_by(elf_group = (row_number() + 2) %/% 3)
# A tibble: 300 × 2
# Groups: elf_group [100]
rucksack elf_group
<list> <dbl>
1 <chr [28]> 1
2 <chr [46]> 1
3 <chr [16]> 1
4 <chr [34]> 2
5 <chr [24]> 2
6 <chr [48]> 2
7 <chr [18]> 3
8 <chr [34]> 3
9 <chr [38]> 3
10 <chr [16]> 4
# … with 290 more rows
I find the item type that corresponds to the badges of each three-Elf group:
data %>%
mutate(rucksack = str_split(rucksack, "")) %>%
group_by(elf_group = (row_number() + 2) %/% 3) %>%
summarise(problem = reduce(rucksack, intersect))
# A tibble: 100 × 2
elf_group problem
<dbl> <chr>
1 1 b
2 2 r
3 3 V
4 4 R
5 5 g
6 6 j
7 7 r
8 8 Q
9 9 Z
10 10 b
# … with 90 more rows
Here the result:
data %>%
mutate(rucksack = str_split(rucksack, "")) %>%
group_by(elf_group = (row_number() + 2) %/% 3) %>%
summarise(problem = reduce(rucksack, intersect)) %>%
mutate(priority = match(problem, item_types)) %>%
summarise(result = sum(priority))
# A tibble: 1 × 1
result
<int>
1 2738
Here the full code:
library(tidyverse)
item_types <- c(letters, LETTERS)
read_csv(
here::here("2022/03_input"),
col_names = c("rucksack"),
show_col_types = FALSE
) %>%
mutate(rucksack = str_split(rucksack, "")) %>%
group_by(elf_group = (row_number() + 2) %/% 3) %>%
summarise(problem = reduce(rucksack, intersect)) %>%
mutate(priority = match(problem, item_types)) %>%
summarise(result = sum(priority))
# A tibble: 1 × 1
result
<int>
1 2738