First day part 1 & 2 solutions
This commit is contained in:
commit
9f82abbd55
6 changed files with 1079 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aoc2024"
|
||||||
|
version = "0.1.0"
|
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "aoc2024"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
1000
input/day1.txt
Normal file
1000
input/day1.txt
Normal file
File diff suppressed because it is too large
Load diff
50
src/bin/day1.rs
Normal file
50
src/bin/day1.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
use std::collections::{BinaryHeap, HashMap};
|
||||||
|
|
||||||
|
use aoc2024::solve;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
solve(1, part1, part2);
|
||||||
|
}
|
||||||
|
|
||||||
|
const LINES_IN_INPUT: usize = 1000;
|
||||||
|
|
||||||
|
fn part1(input: &str) -> u64 {
|
||||||
|
let (mut list1, mut list2) = (
|
||||||
|
BinaryHeap::<u64>::with_capacity(LINES_IN_INPUT),
|
||||||
|
BinaryHeap::<u64>::with_capacity(LINES_IN_INPUT),
|
||||||
|
);
|
||||||
|
for line in input.lines() {
|
||||||
|
let elements: Vec<u64> = line
|
||||||
|
.split_whitespace()
|
||||||
|
.map(|s| s.parse::<u64>().unwrap())
|
||||||
|
.collect();
|
||||||
|
list1.push(elements[0]);
|
||||||
|
list2.push(elements[1]);
|
||||||
|
}
|
||||||
|
let mut distance = 0u64;
|
||||||
|
while !list1.is_empty() {
|
||||||
|
let (left, right) = (list1.pop().unwrap(), list2.pop().unwrap());
|
||||||
|
distance += left.abs_diff(right);
|
||||||
|
}
|
||||||
|
distance
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> u64 {
|
||||||
|
let mut list1 = Vec::<u64>::with_capacity(LINES_IN_INPUT);
|
||||||
|
let mut occurences = HashMap::<u64, u64>::with_capacity(LINES_IN_INPUT);
|
||||||
|
for line in input.lines() {
|
||||||
|
let elements: Vec<u64> = line
|
||||||
|
.split_whitespace()
|
||||||
|
.map(|s| s.parse::<u64>().unwrap())
|
||||||
|
.collect();
|
||||||
|
list1.push(elements[0]);
|
||||||
|
let value = occurences.entry(elements[1]).or_default();
|
||||||
|
*value += 1;
|
||||||
|
}
|
||||||
|
let mut score = 0u64;
|
||||||
|
for element in list1 {
|
||||||
|
let element_occurences = occurences.get(&element).map_or(0, |o| *o);
|
||||||
|
score += element * element_occurences;
|
||||||
|
}
|
||||||
|
score
|
||||||
|
}
|
15
src/lib.rs
Normal file
15
src/lib.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
pub fn solve<F, G, FRet, GRet>(day: u8, part1: F, part2: G)
|
||||||
|
where
|
||||||
|
FRet: Display,
|
||||||
|
F: FnOnce(&str) -> FRet,
|
||||||
|
GRet: Display,
|
||||||
|
G: FnOnce(&str) -> GRet,
|
||||||
|
{
|
||||||
|
let filename = format!("input/day{day}.txt");
|
||||||
|
let input = std::fs::read_to_string(filename).unwrap();
|
||||||
|
println!("Day {day}");
|
||||||
|
println!("Part 1: {}", part1(&input));
|
||||||
|
println!("Part 2: {}", part2(&input));
|
||||||
|
}
|
Loading…
Reference in a new issue