mirror of
https://github.com/kristoferssolo/Advent-of-Code.git
synced 2025-10-21 18:00:35 +00:00
finished day 05 part 1
This commit is contained in:
parent
560c46c2fe
commit
5f8be1f74e
1
2023/Cargo.lock
generated
1
2023/Cargo.lock
generated
@ -108,6 +108,7 @@ name = "day-05"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
|
"itertools",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@ -7,3 +7,4 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
color-eyre = { workspace = true }
|
color-eyre = { workspace = true }
|
||||||
|
itertools = { workspace = true }
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
use color_eyre::{eyre::anyhow, Result};
|
use color_eyre::{eyre::anyhow, Result};
|
||||||
use std::{iter::Zip, ops::Range, str::FromStr, vec::IntoIter};
|
use std::str::FromStr;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct Seeds(Vec<usize>);
|
struct Seeds(Vec<usize>);
|
||||||
@ -28,6 +28,12 @@ struct SeedMap {
|
|||||||
range_len: Vec<usize>,
|
range_len: Vec<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SeedMap {
|
||||||
|
fn iter(&self) -> impl Iterator<Item = (&usize, &usize, &usize)> {
|
||||||
|
itertools::izip!(&self.dest_range, &self.source_range, &self.range_len)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Vec<usize>> for SeedMap {
|
impl From<Vec<usize>> for SeedMap {
|
||||||
fn from(value: Vec<usize>) -> Self {
|
fn from(value: Vec<usize>) -> Self {
|
||||||
let mut dest_range = Vec::new();
|
let mut dest_range = Vec::new();
|
||||||
@ -48,31 +54,6 @@ impl From<Vec<usize>> for SeedMap {
|
|||||||
range_len,
|
range_len,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* fn from(value: Vec<usize>) -> Self {
|
|
||||||
let (dest_range, source_range, range_len): (HashSet<_>, HashSet<_>, HashSet<_>) = value
|
|
||||||
.chunks(3)
|
|
||||||
.flat_map(|chunk| match chunk {
|
|
||||||
[dest, source, range] => Some((*dest, *source, *range)),
|
|
||||||
_ => None,
|
|
||||||
})
|
|
||||||
.unzip();
|
|
||||||
Self {
|
|
||||||
dest_range,
|
|
||||||
source_range,
|
|
||||||
range_len,
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
}
|
|
||||||
|
|
||||||
impl IntoIterator for SeedMap {
|
|
||||||
type Item = ((usize, usize), usize);
|
|
||||||
type IntoIter = Zip<Zip<IntoIter<usize>, IntoIter<usize>>, IntoIter<usize>>;
|
|
||||||
fn into_iter(self) -> Self::IntoIter {
|
|
||||||
self.dest_range
|
|
||||||
.into_iter()
|
|
||||||
.zip(self.source_range.into_iter())
|
|
||||||
.zip(self.range_len.into_iter())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process(input: &str) -> Result<usize> {
|
pub fn process(input: &str) -> Result<usize> {
|
||||||
@ -104,28 +85,25 @@ pub fn process(input: &str) -> Result<usize> {
|
|||||||
.filter_map(|map_option| map_option)
|
.filter_map(|map_option| map_option)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let mut new_seeds = Vec::new();
|
|
||||||
let mut step = seeds.0;
|
let mut step = seeds.0;
|
||||||
|
let mut next_step = Vec::new();
|
||||||
|
|
||||||
for map in &maps {
|
for map in &maps {
|
||||||
for ((dest_range, source_range), range_len) in map.clone() {
|
for (&dest_range, &source_range, &range_len) in map.iter() {
|
||||||
for (index, num) in step.clone().iter().enumerate() {
|
for num in step.clone() {
|
||||||
dbg!(index);
|
|
||||||
if (source_range..=source_range + range_len).contains(&num) {
|
if (source_range..=source_range + range_len).contains(&num) {
|
||||||
|
step.retain(|&x| x != num);
|
||||||
let dest = num + dest_range - source_range;
|
let dest = num + dest_range - source_range;
|
||||||
new_seeds.push(dest);
|
next_step.push(dest);
|
||||||
} else {
|
|
||||||
new_seeds.push(*num);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
step = new_seeds.clone();
|
|
||||||
new_seeds.clear();
|
|
||||||
}
|
}
|
||||||
// dbg!(&step);
|
next_step.append(&mut step);
|
||||||
println!("---------------------------------------------");
|
step = next_step.clone();
|
||||||
|
next_step.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(*step.iter().min().ok_or_else(|| anyhow!("Error"))?)
|
Ok(*step.iter().min().unwrap_or(&0))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user