Day 3

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.

library(tidyverse)
── 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