Compare commits

..

2 commits

Author SHA1 Message Date
BoolPurist
64f87d035e Added TODO 2024-08-29 17:45:43 +02:00
BoolPurist
a840565b98 Tidied up day 7 2024-08-29 17:24:55 +02:00
8 changed files with 41 additions and 491 deletions

3
.gitignore vendored
View file

@ -1,3 +1,6 @@
/target /target
/real_puzzel_input/* /real_puzzel_input/*
!/real_puzzel_input/.gitkeep !/real_puzzel_input/.gitkeep
# From synthing
.stfolder

5
TODO.md Normal file
View file

@ -0,0 +1,5 @@
# TODO
- Add MIT license
- Seperate solution into own library crate
- Implment subcommand to execute puzzle input files and print out how every long every one takes

View file

@ -1,451 +0,0 @@
Compiling advent_of_code_2023 v0.1.0 (/home/nice_graphic/Code/AdventOfCode/advent_of_code_2023_in_rust)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.74s
Running `target/debug/advent_of_code_2023 -d 5 -t 2 -r real_puzzel_input/day5_real.txt`
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 1742065688,
end: 1750102221,
},
SeedRange {
start: 2567370277,
end: 2599723683,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 0,
end: 8416624,
},
SeedRange {
start: 266989853,
end: 274550609,
},
SeedRange {
start: 300866774,
end: 317512630,
},
SeedRange {
start: 358218184,
end: 372723591,
},
SeedRange {
start: 380891048,
end: 442413628,
},
SeedRange {
start: 515244023,
end: 557308930,
},
SeedRange {
start: 683066098,
end: 684855124,
},
SeedRange {
start: 807721029,
end: 832371103,
},
SeedRange {
start: 1194459751,
end: 1203805997,
},
SeedRange {
start: 1468004524,
end: 1485692688,
},
SeedRange {
start: 1543990204,
end: 1544270679,
},
SeedRange {
start: 2018290756,
end: 2019801469,
},
SeedRange {
start: 2019801470,
end: 2042706893,
},
SeedRange {
start: 2115385660,
end: 2129003835,
},
SeedRange {
start: 2129003836,
end: 2211102547,
},
SeedRange {
start: 2392979056,
end: 2408003322,
},
SeedRange {
start: 2607311497,
end: 2674349508,
},
SeedRange {
start: 2746561268,
end: 2747062564,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 58753428,
end: 65411093,
},
SeedRange {
start: 100997493,
end: 137201535,
},
SeedRange {
start: 157986927,
end: 199863499,
},
SeedRange {
start: 204313376,
end: 218545188,
},
SeedRange {
start: 332621358,
end: 372723591,
},
SeedRange {
start: 426571448,
end: 467405784,
},
SeedRange {
start: 495575122,
end: 511974002,
},
SeedRange {
start: 743910440,
end: 759938333,
},
SeedRange {
start: 759938334,
end: 760087643,
},
SeedRange {
start: 793045073,
end: 807721028,
},
SeedRange {
start: 867655257,
end: 896123052,
},
SeedRange {
start: 896123053,
end: 973947275,
},
SeedRange {
start: 973947276,
end: 993981548,
},
SeedRange {
start: 993981549,
end: 1002343672,
},
SeedRange {
start: 1055927934,
end: 1095728907,
},
SeedRange {
start: 1095728908,
end: 1119175102,
},
SeedRange {
start: 1154854138,
end: 1180635906,
},
SeedRange {
start: 1238423661,
end: 1248511724,
},
SeedRange {
start: 1512990961,
end: 1523584140,
},
SeedRange {
start: 1534040686,
end: 1546302601,
},
SeedRange {
start: 1803258673,
end: 1809841397,
},
SeedRange {
start: 1809841398,
end: 1841935458,
},
SeedRange {
start: 1856531115,
end: 1913738155,
},
SeedRange {
start: 2018290756,
end: 2028995369,
},
SeedRange {
start: 2674349509,
end: 2681453545,
},
SeedRange {
start: 2738910873,
end: 2744209881,
},
SeedRange {
start: 2747062565,
end: 2783941215,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 475181169,
end: 490368072,
},
SeedRange {
start: 836186785,
end: 843842518,
},
SeedRange {
start: 2734840928,
end: 2738910872,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 244009039,
end: 254933582,
},
SeedRange {
start: 305477485,
end: 329774690,
},
SeedRange {
start: 442413629,
end: 458180769,
},
SeedRange {
start: 1260160771,
end: 1272797031,
},
SeedRange {
start: 1272797032,
end: 1286745099,
},
SeedRange {
start: 1769136092,
end: 1817580770,
},
SeedRange {
start: 1941952815,
end: 1959258660,
},
SeedRange {
start: 2941559481,
end: 2963703887,
},
SeedRange {
start: 3338671715,
end: 3392340230,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 332621358,
end: 351714897,
},
SeedRange {
start: 372723592,
end: 390393835,
},
SeedRange {
start: 426571448,
end: 467405784,
},
SeedRange {
start: 1203805998,
end: 1248511724,
},
SeedRange {
start: 1512990961,
end: 1523584140,
},
SeedRange {
start: 1628354042,
end: 1634087664,
},
SeedRange {
start: 2089724509,
end: 2193360445,
},
SeedRange {
start: 2333003205,
end: 2348927163,
},
SeedRange {
start: 2919622420,
end: 2941559480,
},
SeedRange {
start: 3241659967,
end: 3257744758,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 137201536,
end: 157986926,
},
SeedRange {
start: 218545189,
end: 220477638,
},
SeedRange {
start: 600713965,
end: 665397099,
},
SeedRange {
start: 832371104,
end: 836186784,
},
SeedRange {
start: 843842519,
end: 867655256,
},
SeedRange {
start: 1119175103,
end: 1138382174,
},
SeedRange {
start: 1491903136,
end: 1499334672,
},
SeedRange {
start: 1523584141,
end: 1543990203,
},
SeedRange {
start: 2281428417,
end: 2289569154,
},
SeedRange {
start: 2492935748,
end: 2514211768,
},
SeedRange {
start: 2562030648,
end: 2567370276,
},
SeedRange {
start: 2744209882,
end: 2758197105,
},
SeedRange {
start: 2961556571,
end: 2970025309,
},
SeedRange {
start: 2970025310,
end: 2975037528,
},
SeedRange {
start: 3055485859,
end: 3060533366,
},
SeedRange {
start: 3336845004,
end: 3337449016,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 372723592,
end: 390393835,
},
SeedRange {
start: 1203805998,
end: 1230926691,
},
SeedRange {
start: 1230926692,
end: 1234898502,
},
SeedRange {
start: 1450460003,
end: 1468004523,
},
SeedRange {
start: 1546302602,
end: 1600730425,
},
SeedRange {
start: 1628354042,
end: 1634087664,
},
SeedRange {
start: 1644303246,
end: 1684446508,
},
SeedRange {
start: 1702371352,
end: 1750102221,
},
SeedRange {
start: 1899676495,
end: 1926978899,
},
SeedRange {
start: 1950759356,
end: 1994459585,
},
SeedRange {
start: 2089724509,
end: 2193360445,
},
SeedRange {
start: 2172619534,
end: 2188333609,
},
SeedRange {
start: 2333003205,
end: 2348927163,
},
SeedRange {
start: 2567370277,
end: 2607311496,
},
SeedRange {
start: 2885502549,
end: 2941559480,
},
SeedRange {
start: 3241659967,
end: 3257744758,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 1672236638,
end: 1707764533,
},
SeedRange {
start: 2064249380,
end: 2073429343,
},
]
[src/solutions/day5/task2.rs:42:5] &current_branches = [
SeedRange {
start: 688038520,
end: 693497941,
},
SeedRange {
start: 1485692689,
end: 1491903135,
},
SeedRange {
start: 1750102222,
end: 1755861445,
},
SeedRange {
start: 1775334238,
end: 1803258672,
},
]

View file

@ -1,5 +1,5 @@
pub trait AdventIterator: Iterator { pub trait AdventIterator: Iterator {
fn into_chunks<const N: usize>(self) -> impl Iterator<Item = Chunck<N, Self::Item>> fn into_chunks<const N: usize>(self) -> impl Iterator<Item = Chunk<N, Self::Item>>
where where
Self: Sized, Self: Sized,
{ {
@ -10,14 +10,14 @@ pub trait AdventIterator: Iterator {
impl<I> AdventIterator for I where I: Iterator {} impl<I> AdventIterator for I where I: Iterator {}
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum Chunck<const N: usize, T> { pub enum Chunk<const N: usize, T> {
Next([T; N]), Next([T; N]),
Rest(Vec<T>), Rest(Vec<T>),
} }
pub fn in_chunks<const N: usize, T>( pub fn in_chunks<const N: usize, T>(
mut iterator: impl Iterator<Item = T>, mut iterator: impl Iterator<Item = T>,
) -> impl Iterator<Item = Chunck<N, T>> { ) -> impl Iterator<Item = Chunk<N, T>> {
let mut buffer = Vec::new(); let mut buffer = Vec::new();
let mut done = false; let mut done = false;
std::iter::from_fn(move || { std::iter::from_fn(move || {
@ -32,7 +32,7 @@ pub fn in_chunks<const N: usize, T>(
return if buffer.is_empty() { return if buffer.is_empty() {
None None
} else { } else {
Some(Chunck::Rest(std::mem::take(&mut buffer))) Some(Chunk::Rest(std::mem::take(&mut buffer)))
}; };
} }
} }
@ -40,31 +40,31 @@ pub fn in_chunks<const N: usize, T>(
let array: [T; N] = std::mem::take(&mut buffer) let array: [T; N] = std::mem::take(&mut buffer)
.try_into() .try_into()
.unwrap_or_else(|_| panic!("Buffer must have the same size as the N ({})", N)); .unwrap_or_else(|_| panic!("Buffer must have the same size as the N ({})", N));
Some(Chunck::Next(array)) Some(Chunk::Next(array))
}) })
} }
#[cfg(test)] #[cfg(test)]
mod testing { mod testing {
use crate::iterations::{in_chunks, Chunck}; use crate::iterations::{in_chunks, Chunk};
#[test] #[test]
fn should_split_chunks() { fn should_split_chunks() {
fn assert_case<const N: usize>(input: Vec<u32>, expected: Vec<Chunck<N, u32>>) { fn assert_case<const N: usize>(input: Vec<u32>, expected: Vec<Chunk<N, u32>>) {
let actual: Vec<Chunck<N, u32>> = in_chunks::<N, u32>(input.into_iter()).collect(); let actual: Vec<Chunk<N, u32>> = in_chunks::<N, u32>(input.into_iter()).collect();
assert_eq!(expected, actual); assert_eq!(expected, actual);
} }
assert_case::<2>(vec![2], vec![Chunck::Rest(vec![2])]); assert_case::<2>(vec![2], vec![Chunk::Rest(vec![2])]);
assert_case::<2>(vec![], vec![]); assert_case::<2>(vec![], vec![]);
assert_case::<2>(vec![2, 2], vec![Chunck::Next([2, 2])]); assert_case::<2>(vec![2, 2], vec![Chunk::Next([2, 2])]);
assert_case::<2>( assert_case::<2>(
vec![1, 2, 3], vec![1, 2, 3],
vec![Chunck::Next([1, 2]), Chunck::Rest(vec![3])], vec![Chunk::Next([1, 2]), Chunk::Rest(vec![3])],
); );
assert_case::<1>( assert_case::<1>(
vec![1, 2, 3], vec![1, 2, 3],
vec![Chunck::Next([1]), Chunck::Next([2]), Chunck::Next([3])], vec![Chunk::Next([1]), Chunk::Next([2]), Chunk::Next([3])],
); );
} }
} }

View file

@ -1,10 +1,12 @@
use categorized_hand::{CategorizedHand, JokerOrdered}; use categorized_hand::{CategorizedHand, JokerOrdered};
use crate::solutions::day7::dealt_hand::DealtHand;
mod categorized_hand; mod categorized_hand;
mod dealt_hand; mod dealt_hand;
mod hand_kind; mod hand_kind;
mod parsing; mod parsing;
mod second_ordering; mod second_ordering;
mod hello;
pub fn solve_task_1(input: &str) -> String { pub fn solve_task_1(input: &str) -> String {
let parsed = parsing::parse_input(input); let parsed = parsing::parse_input(input);
@ -20,10 +22,15 @@ pub fn solve_task_1(input: &str) -> String {
pub fn solve_task_2(input: &str) -> String { pub fn solve_task_2(input: &str) -> String {
const JOKER: char = 'J'; const JOKER: char = 'J';
let parsed = parsing::parse_input(input); let parsed = parsing::parse_input(input);
let sorted_and_categorized: Vec<CategorizedHand> = { let sorted_and_categorized= categorize_and_sort_with_a_joker(parsed, JOKER);
let total_winning = calc_total_winning(&sorted_and_categorized);
total_winning.to_string()
}
fn categorize_and_sort_with_a_joker(parsed: Vec<DealtHand>, joker: char) -> Vec<CategorizedHand> {
let mut categorized: Vec<JokerOrdered> = parsed let mut categorized: Vec<JokerOrdered> = parsed
.into_iter() .into_iter()
.map(|not_categorized| (not_categorized, JOKER).into()) .map(|not_categorized| (not_categorized, joker).into())
.map(JokerOrdered::new) .map(JokerOrdered::new)
.collect(); .collect();
categorized.sort(); categorized.sort();
@ -32,9 +39,6 @@ pub fn solve_task_2(input: &str) -> String {
.into_iter() .into_iter()
.map(|to_unwrap| to_unwrap.into()) .map(|to_unwrap| to_unwrap.into())
.collect() .collect()
};
let total_winning = calc_total_winning(&sorted_and_categorized);
total_winning.to_string()
} }
fn calc_total_winning(sorted: &[CategorizedHand]) -> usize { fn calc_total_winning(sorted: &[CategorizedHand]) -> usize {

View file

@ -39,13 +39,8 @@ fn hand_cmp(
) -> std::cmp::Ordering { ) -> std::cmp::Ordering {
match left.kind.cmp(&right.kind) { match left.kind.cmp(&right.kind) {
std::cmp::Ordering::Equal => { std::cmp::Ordering::Equal => {
assert!( assert_eq!(left.kind, right.kind, "If ordering is equal then the hand kind must be the same too\n\
left.kind == right.kind, left kind: ({:?}) and right kind: ({:?})", left.kind, right.kind);
"If ordering is equal then the hand kind must be the same too\n\
left kind: ({:?}) and right kind: ({:?})",
left.kind,
right.kind
);
second_ordering::compare_along_str( second_ordering::compare_along_str(
left.rest().hand(), left.rest().hand(),
right.rest().hand(), right.rest().hand(),
@ -53,13 +48,8 @@ fn hand_cmp(
) )
} }
not_equal_ordering => { not_equal_ordering => {
assert!( assert_ne!(left.kind, right.kind, "If ordering is not equal then the hand kind must not be the same either\n\
left.kind != right.kind, left kind: ({:?}) and right kind: ({:?})", left.kind, right.kind);
"If ordering is not equal then the hand kind must not be the same either\n\
left kind: ({:?}) and right kind: ({:?})",
left.kind,
right.kind
);
not_equal_ordering not_equal_ordering
} }
} }

View file

@ -1,6 +1,5 @@
use std::{str::FromStr, usize}; use std::{str::FromStr, usize};
use derive_more::derive::Debug;
use thiserror::Error; use thiserror::Error;
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]

View file