This commit is contained in:
Rh4096 2024-12-01 19:54:24 +07:00
commit cf68639d1e
8 changed files with 1141 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/target
/input

65
Cargo.lock generated Normal file
View file

@ -0,0 +1,65 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "aoc2024"
version = "0.1.0"
dependencies = [
"thiserror",
]
[[package]]
name = "proc-macro2"
version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [
"proc-macro2",
]
[[package]]
name = "syn"
version = "2.0.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "thiserror"
version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "unicode-ident"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"

7
Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
edition = "2021"
name = "aoc2024"
version = "0.1.0"
[dependencies]
thiserror = "2"

1000
input/day1.txt Normal file

File diff suppressed because it is too large Load diff

1
src/lib.rs Normal file
View file

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

5
src/main.rs Normal file
View file

@ -0,0 +1,5 @@
use aoc2024::solutions::day_1::part_two;
fn main() {
println!("{}", part_two());
}

60
src/solutions/day_1.rs Normal file
View file

@ -0,0 +1,60 @@
use std::collections::HashMap;
const INPUT: &str = include_str!("../../input/day1.txt");
pub fn part_one() -> u64 {
let (mut left, mut right) = INPUT
.lines()
.filter_map(|s| s.split_once(' ').map(|(s, x)| (s.trim(), x.trim())))
.filter_map(
|(s, x)| match (s.parse::<u64>().ok(), x.parse::<u64>().ok()) {
(Some(x), Some(y)) => Some((x, y)),
_ => None,
},
)
.fold((Vec::new(), Vec::new()), |(mut v1, mut v2), (x, y)| {
v1.push(x);
v2.push(y);
(v1, v2)
});
left.sort();
right.sort();
left.into_iter()
.zip(right)
.map(|(l, r)| if l > r { l - r } else { r - l })
.sum()
}
pub fn part_two() -> u64 {
let mut cache = HashMap::<u64, u64>::new();
let mut similarity_score = 0;
let (left, right) = INPUT
.lines()
.filter_map(|s| s.split_once(' ').map(|(s, x)| (s.trim(), x.trim())))
.filter_map(
|(s, x)| match (s.parse::<u64>().ok(), x.parse::<u64>().ok()) {
(Some(x), Some(y)) => Some((x, y)),
_ => None,
},
)
.fold((Vec::new(), Vec::new()), |(mut v1, mut v2), (x, y)| {
v1.push(x);
v2.push(y);
(v1, v2)
});
for key in left {
if let Some(&val) = cache.get(&key) {
similarity_score += key * val;
} else {
let val = right.iter().filter(|e| e.eq(&&key)).count() as u64;
cache.insert(key, val);
similarity_score += key * val;
}
}
similarity_score
}

1
src/solutions/mod.rs Normal file
View file

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