Day 1: Historian Hysteria
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/22323136
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You are viewing a single thread.
View all comments 2 points
*
Rust
I’m doing it in Rust again this year. I stopped keeping up with it after day 3 last year, so let’s hope I last longer this time around.
Solution Spoiler Alert
use std::collections::HashMap;
use crate::utils::read_lines;
pub fn solution1() {
let (mut id_list1, mut id_list2) = get_id_lists();
id_list1.sort();
id_list2.sort();
let total_distance = id_list1
.into_iter()
.zip(id_list2)
.map(|(left, right)| (left - right).abs())
.sum::<i32>();
println!("Total distance = {total_distance}");
}
pub fn solution2() {
let (id_list1, id_list2) = get_id_lists();
let id_count_map = id_list2
.into_iter()
.fold(HashMap::<_, i32>::new(), |mut map, id| {
*map.entry(id).or_default() += 1i32;
map
});
let similarity_score = id_list1
.into_iter()
.map(|id| id * id_count_map.get(&id).copied().unwrap_or_default())
.sum::<i32>();
println!("Similarity score = {similarity_score}");
}
fn get_id_lists() -> (Vec<i32>, Vec<i32>) {
read_lines("src/day1/input.txt")
.map(|line| {
let mut ids = line.split_whitespace().map(|id| {
id.parse::<i32>()
.expect("Ids from input must be valid integers")
});
(
ids.next().expect("First Id on line must be present"),
ids.next().expect("Second Id on line must be present"),
)
})
.unzip()
}