day 1 done, no winnow
This commit is contained in:
commit
f5c9c54214
6 changed files with 113 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
target/
|
||||||
|
*/input
|
4
.rustfmt.toml
Normal file
4
.rustfmt.toml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
imports_granularity = "Crate"
|
||||||
|
group_imports = "StdExternalCrate"
|
||||||
|
wrap_comments = true
|
||||||
|
edition = "2024"
|
25
Cargo.lock
generated
Normal file
25
Cargo.lock
generated
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day01"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.7.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.6.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[workspace]
|
||||||
|
resolver = "2"
|
||||||
|
members = ["day01"]
|
||||||
|
|
||||||
|
[workspace.dependencies]
|
||||||
|
winnow = "0.6"
|
7
day01/Cargo.toml
Normal file
7
day01/Cargo.toml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[package]
|
||||||
|
name = "day01"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
winnow.workspace = true
|
69
day01/src/main.rs
Normal file
69
day01/src/main.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = std::fs::read_to_string("input").unwrap();
|
||||||
|
println!("{}", pt2(&input));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pt1(input: &str) -> i32 {
|
||||||
|
let (mut left, mut right) = parse_input(input);
|
||||||
|
left.sort_unstable();
|
||||||
|
right.sort_unstable();
|
||||||
|
left.iter()
|
||||||
|
.zip(right.iter())
|
||||||
|
.map(|(l, r)| (l - r).abs())
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pt2(input: &str) -> i32 {
|
||||||
|
let (left, right) = parse_input(input);
|
||||||
|
let mut rights = HashMap::new();
|
||||||
|
for num in &right {
|
||||||
|
*rights.entry(num).or_insert(0) += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
left.iter().map(|n| n * rights.get(n).unwrap_or(&0)).sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(input: &str) -> (Vec<i32>, Vec<i32>) {
|
||||||
|
let mut left = Vec::new();
|
||||||
|
let mut right = Vec::new();
|
||||||
|
for line in input.split("\n") {
|
||||||
|
let line: Vec<&str> = line
|
||||||
|
.split(|c: char| c.is_whitespace())
|
||||||
|
.filter(|c| !c.is_empty())
|
||||||
|
.collect();
|
||||||
|
if line.len() < 2 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let l: i32 = line[0].parse().unwrap();
|
||||||
|
let r: i32 = line[1].parse().unwrap();
|
||||||
|
left.push(l);
|
||||||
|
right.push(r);
|
||||||
|
}
|
||||||
|
(left, right)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
static P1_TEST: &str = "3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3
|
||||||
|
";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_p1() {
|
||||||
|
let val = pt1(P1_TEST);
|
||||||
|
assert_eq!(11, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_p2() {
|
||||||
|
let val = pt2(P1_TEST);
|
||||||
|
assert_eq!(31, val);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue