2021 Day 1 Rust

This commit is contained in:
Maciej Jur 2022-11-27 00:00:37 +01:00
parent 5b78fa4674
commit bd10a789f5
7 changed files with 2086 additions and 0 deletions

7
2021/rust/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "rust"
version = "0.1.0"

8
2021/rust/Cargo.toml Normal file
View file

@ -0,0 +1,8 @@
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

2000
2021/rust/inputs/day01.txt Normal file

File diff suppressed because it is too large Load diff

7
2021/rust/src/main.rs Normal file
View file

@ -0,0 +1,7 @@
mod utils;
mod solutions;
fn main() {
solutions::day01::run();
}

View file

@ -0,0 +1,43 @@
use crate::utils;
use crate::utils::Day;
pub fn run() -> () {
let data = parse_data(utils::read_lines(Day(1)));
println!("Day 1");
println!("Part 1: {}", solve1(&data));
println!("Part 2: {}", solve2(&data));
}
fn solve1(lines: &Vec<i32>) -> i32 {
let mut increments = 0;
let mut prev = i32::MAX;
for &n in lines {
if n > prev { increments += 1 };
prev = n;
};
increments
}
fn solve2(lines: &Vec<i32>) -> i32 {
let length = lines.len();
let left = lines[..length - 1].windows(3);
let right = lines[1..].windows(3);
left.zip(right)
.fold(0, |acc, (left, right)| {
let sum_left: i32 = left.iter().sum();
let sum_right: i32 = right.iter().sum();
acc + if sum_left < sum_right { 1 } else { 0 }
})
}
fn parse_data(lines: Vec<String>) -> Vec<i32> {
lines.iter()
.map(|x| x.parse())
.collect::<Result<Vec<i32>, _>>()
.expect("Failed to parse int")
}

View file

@ -0,0 +1 @@
pub mod day01;

20
2021/rust/src/utils.rs Normal file
View file

@ -0,0 +1,20 @@
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
#[repr(transparent)]
pub struct Day(pub i32);
pub fn read_lines(day: Day) -> Vec<String> {
assert!(1 <= day.0 && day.0 < 25);
_read_lines(format!("inputs/day{:0>2}.txt", day.0))
.expect(format!("Failed to load day {}", day.0).as_str())
}
fn _read_lines<P>(filename: P) -> std::io::Result<Vec<String>>
where P: AsRef<Path> {
let file = File::open(filename)?;
BufReader::new(file).lines().collect()
}