aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index 635a672..ff4ac74 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,7 +3,8 @@
use std::fs;
use std::hash::{Hash, Hasher};
use std::cmp;
-use std::collections::{HashSet, HashMap};
+use std::collections::{HashSet, HashMap, VecDeque};
+use std::iter::FromIterator;
use regex::Regex;
fn read_file(file: &str) -> String {
@@ -31,6 +32,13 @@ fn read_numbers(file: &str) -> Vec<i32> {
.collect()
}
+fn read_numbers_64(file: &str) -> Vec<i64> {
+ read_file(file).split('\n')
+ .filter(|x| !x.is_empty())
+ .map(|x| x.parse::<i64>().unwrap())
+ .collect()
+}
+
fn find_pair_with_sum(numbers: &HashSet<i32>, goal: i32) -> Option<(i32, i32)> {
for i in numbers {
if numbers.contains(&(goal - i)) {
@@ -580,8 +588,49 @@ fn day8() {
println!("8b: {}", console.repair());
}
+fn find_xmas_number(input: &[i64], prev_count: usize) -> i64 {
+ let mut queue = VecDeque::from_iter(input.iter().copied().take(prev_count));
+
+ for number in input.iter().skip(prev_count) {
+ match queue.iter().find(|x| queue.contains(&(number - *x))) {
+ None => return *number,
+ Some(_) => {
+ queue.pop_front();
+ queue.push_back(*number);
+ },
+ }
+ }
+ panic!("nothing found");
+}
+
+fn find_xmas_weakness(input: &[i64], goal: i64) -> i64 {
+ for (i, _) in input.iter().enumerate() {
+ let mut min = goal;
+ let mut max = 0;
+ let mut sum = 0;
+ for val_j in input.iter().skip(i) {
+ min = cmp::min(min, *val_j);
+ max = cmp::max(max, *val_j);
+ sum += val_j;
+ if sum == goal {
+ return min + max;
+ }
+ }
+ }
+ panic!("nothing found");
+}
+
+fn day9() {
+ let input = read_numbers_64("input09");
+
+ let number = find_xmas_number(&input, 25);
+ println!("9a: {}", number);
+
+ println!("9b: {}", find_xmas_weakness(&input, number));
+}
+
fn main() {
- day8();
+ day9();
}
#[cfg(test)]
@@ -758,4 +807,15 @@ mod tests {
console.reset();
assert_eq!(console.repair(), 8);
}
+
+ #[test]
+ fn test_day9() {
+ let input = [35, 20, 15, 25, 47, 40, 62, 55, 65, 95, 102, 117, 150, 182, 127, 219, 299, 277, 309, 576];
+ let input = Vec::from_iter(input.iter().copied());
+
+ let number = find_xmas_number(&input, 5);
+ assert_eq!(number, 127);
+
+ assert_eq!(find_xmas_weakness(&input, number), 62);
+ }
}