summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorArne Dußin2021-12-01 13:05:54 +0100
committerArne Dußin2021-12-01 13:05:54 +0100
commit36dc513e41c349fa69231b81433ccbad911743a6 (patch)
tree791221a43654e77bf6c49a8231dc0e814539dc05 /src
downloadaoc2021-36dc513e41c349fa69231b81433ccbad911743a6.tar.gz
aoc2021-36dc513e41c349fa69231b81433ccbad911743a6.zip
Add solution to day 1
Diffstat (limited to 'src')
-rw-r--r--src/day_1.rs47
-rw-r--r--src/main.rs52
2 files changed, 99 insertions, 0 deletions
diff --git a/src/day_1.rs b/src/day_1.rs
new file mode 100644
index 0000000..6632baa
--- /dev/null
+++ b/src/day_1.rs
@@ -0,0 +1,47 @@
+pub fn run(input: Vec<String>)
+{
+ // Convert inputs to unsigned integer numbers
+ let input: Vec<u32> = input
+ .into_iter()
+ .map(|s| {
+ s.parse()
+ .expect("All lines are required to be unsigned integers")
+ })
+ .collect();
+
+ part1(&input);
+ part2(&input);
+}
+
+fn part1(input: &[u32])
+{
+ let mut last_depth = u32::MAX;
+ let num_down_slopes = input
+ .iter()
+ .filter(|&depth| {
+ let going_deeper = *depth > last_depth;
+ last_depth = *depth;
+
+ going_deeper
+ })
+ .count();
+
+ println!("Solution to part 1: {}", num_down_slopes);
+}
+
+fn part2(input: &[u32])
+{
+ let mut last_aliased_depth = u32::MAX;
+ let num_aliased_down_slopes = input
+ .windows(3)
+ .filter(|&depths| {
+ let aliased_depth: u32 = depths.iter().sum();
+ let going_deeper = aliased_depth > last_aliased_depth;
+ last_aliased_depth = aliased_depth;
+
+ going_deeper
+ })
+ .count();
+
+ println!("Solution to part 2: {}", num_aliased_down_slopes);
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..c45571e
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,52 @@
+mod day_1;
+
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::path::PathBuf;
+use std::str::FromStr;
+
+use argparse::{ArgumentParser, Store};
+
+fn read_input(day: u8) -> Vec<String>
+{
+ let file_name = PathBuf::from_str("input")
+ .unwrap()
+ .join(format!("day_{}.txt", day));
+ let input_file =
+ File::open(&file_name).expect(&format!("Unable to open input file {:?}", file_name));
+ let reader = BufReader::new(input_file);
+
+ reader
+ .lines()
+ .map(|r| r.expect("Unable to read line in input file"))
+ .collect()
+}
+
+fn run(day: u8, input: Vec<String>)
+{
+ match day {
+ 1 => day_1::run(input),
+ o => panic!("Day {} is not implemented (yet)", o),
+ }
+}
+
+fn main()
+{
+ let mut day: u8 = 1;
+ {
+ let mut ap = ArgumentParser::new();
+ ap.set_description("Run advent of code 2015 solvers");
+
+ ap.refer(&mut day).add_option(
+ &["-d", "--day"],
+ Store,
+ "The day of the month of which the solver should be run",
+ );
+
+ ap.parse_args_or_exit();
+ }
+
+ println!("Attempting to solve day {}", day);
+ let input = read_input(day);
+ run(day, input);
+}