2020 Advent of Code solutions in various languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines 4.2 KiB Raw Blame History

 `# --- Day 9: Encoding Error ---` `#` `# With your neighbor happily enjoying their video game, you turn your attention` `# to an open data port on the little screen in the seat in front of you.` `#` `# Though the port is non-standard, you manage to connect it to your computer` `# through the clever use of several paperclips. Upon connection, the port` `# outputs a series of numbers (your puzzle input).` `#` `# The data appears to be encrypted with the eXchange-Masking Addition System` `# (XMAS) which, conveniently for you, is an old cypher with an important weakness.` `#` `# XMAS starts by transmitting a preamble of 25 numbers. After that, each number` `# you receive should be the sum of any two of the 25 immediately previous` `# numbers. The two numbers will have different values, and there might be more` `# than one such pair.` `#` `# For example, suppose your preamble consists of the numbers 1 through 25 in a` `# random order. To be valid, the next number must be the sum of two of those numbers:` `#` `# 26 would be a valid next number, as it could be 1 plus 25 (or many other pairs, like 2 and 24).` `# 49 would be a valid next number, as it is the sum of 24 and 25.` `# 100 would not be valid; no two of the previous 25 numbers sum to 100.` `# 50 would also not be valid; although 25 appears in the previous 25 numbers, the two numbers in the pair must be different.` `#` `# Suppose the 26th number is 45, and the first number (no longer an option,` `# as it is more than 25 numbers ago) was 20. Now, for the next number to be` `# valid, there needs to be some pair of numbers among 1-19, 21-25, or 45 that` `# add up to it:` `#` `# 26 would still be a valid next number, as 1 and 25 are still within the previous 25 numbers.` `# 65 would not be valid, as no two of the available numbers sum to it.` `# 64 and 66 would both be valid, as they are the result of 19+45 and 21+45 respectively.` `#` `# Here is a larger example which only considers the previous 5 numbers (and has a preamble of length 5):` `#` `# 35` `# 20` `# 15` `# 25` `# 47` `# 40` `# 62` `# 55` `# 65` `# 95` `# 102` `# 117` `# 150` `# 182` `# 127` `# 219` `# 299` `# 277` `# 309` `# 576` `#` `# In this example, after the 5-number preamble, almost every number is the sum` `# of two of the previous 5 numbers; the only number that does not follow this` `# rule is 127.` `#` `# The first step of attacking the weakness in the XMAS data is to find the` `# first number in the list (after the preamble) which is not the sum of two of` `# the 25 numbers before it. What is the first number that does not have this` `# property?` ``` ``` `library(tidyverse)` ``` ``` `test_input <- c(35, 20, 15, 25, 47, 40, 62, 55, 65, 95, 102, 117, 150, 182, 127, 219, 299, 277, 309, 576)` ``` ``` `# input <- test_input` `input <- as.numeric(read_lines("../input/09-01.txt"))` ``` ``` `# preamble_length <- 5` `preamble_length <- 25` `window <- 1:preamble_length` `input_start <- preamble_length + 1` `no_sum_found <- TRUE` ``` ``` `while(no_sum_found && (length(input)>=(preamble_length + 1))) {` ``` ``` ` as.data.frame(t(combn(window, 2))) %>%` ` mutate(` ` val1 = input[V1],` ` val2 = input[V2],` ` sum = input[V1] + input[V2]` ` ) -> pair_sums` ``` ``` ` no_sum_found <- any(pair_sums\$sum == input[input_start])` ``` ``` ` if (no_sum_found) input <- tail(input, -1)` ``` ``` `}` ``` ``` `(invalid <- input[input_start])` ``` ``` ``` ``` `# --- Part Two ---` `#` `# The final step in breaking the XMAS encryption relies on the invalid number` `# you just found: you must find a contiguous set of at least two numbers in` `# your list which sum to the invalid number from step 1.` `#` `# Again consider the above example:` `#` `# 35` `# 20` `# 15` `# 25` `# 47` `# 40` `# 62` `# 55` `# 65` `# 95` `# 102` `# 117` `# 150` `# 182` `# 127` `# 219` `# 299` `# 277` `# 309` `# 576` `#` `# In this list, adding up all of the numbers from 15 through 40 produces the` `# invalid number from step 1, 127. (Of course, the contiguous set of numbers` `# in your actual list might be much longer.)` `#` `# To find the encryption weakness, add together the smallest and largest` `# number in this contiguous range; in this example, these are 15 and 47,` `# producing 62.` `#` `# What is the encryption weakness in your XMAS-encrypted list of numbers?` `# s` `# 09-02 -------------------------------------------------------------------` ``` ``` `# input <- test_input` `input <- as.numeric(read_lines("../input/09-01.txt"))` ``` ``` `for (i in seq_along(input)) {` ``` ``` ` csum <- cumsum(input[i:length(input)])` ` if (any(csum == invalid)) break` ``` ``` `}` ``` ``` ```sum(range(input[i:(i+which(csum == invalid)-1)])) ```