2023 - Day 5 : v3

This commit is contained in:
HS-157 2023-12-26 09:52:57 +01:00
parent 30754dafaa
commit 0cdb274daa
1 changed files with 9 additions and 16 deletions

View File

@ -1,11 +1,6 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::fs; use std::fs;
enum ParseError {
InvalidInput,
ParseFailed,
}
#[derive(Debug)] #[derive(Debug)]
struct Range { struct Range {
input: usize, input: usize,
@ -15,7 +10,6 @@ struct Range {
#[derive(Debug)] #[derive(Debug)]
struct Map { struct Map {
name: String,
ranges: Vec<Range>, ranges: Vec<Range>,
next: String, next: String,
} }
@ -30,7 +24,7 @@ fn parse() -> Option<(Vec<usize>, HashMap<String, Map>)> {
let segments: Vec<&str> = contents.split("\n\n").collect(); let segments: Vec<&str> = contents.split("\n\n").collect();
match segments[..] { match segments[..] {
[s, ..] => { [s, ..] => {
let segments: Vec<&str> = s.split(":").collect(); let segments: Vec<&str> = s.split(':').collect();
match segments[..] { match segments[..] {
[_, s] => { [_, s] => {
s.split_whitespace() s.split_whitespace()
@ -52,14 +46,14 @@ fn parse() -> Option<(Vec<usize>, HashMap<String, Map>)> {
for seg in &segments[1..] { for seg in &segments[1..] {
let mut ranges: Vec<Range> = vec![]; let mut ranges: Vec<Range> = vec![];
let segments: Vec<&str> = seg.split("\n").collect(); let segments: Vec<&str> = seg.split('\n').collect();
let Some((names, r)) = segments.split_first() else { let Some((names, r)) = segments.split_first() else {
return None; return None;
}; };
let names = names.replace(" ", "-"); let names = names.replace(' ', "-");
let split = names.split("-").collect::<Vec<_>>(); let split = names.split('-').collect::<Vec<_>>();
let [name, _, next, _] = &split[..] else { let [name, _, next, _] = &split[..] else {
return None; return None;
}; };
@ -84,8 +78,7 @@ fn parse() -> Option<(Vec<usize>, HashMap<String, Map>)> {
maps.insert( maps.insert(
name.to_string(), name.to_string(),
Map { Map {
name: name.to_string(), ranges,
ranges: ranges,
next: next.to_string(), next: next.to_string(),
}, },
); );
@ -115,7 +108,7 @@ fn check_range(seed: usize, map: &Map, maps: &HashMap<String, Map>) -> usize {
let Some(m) = maps.get(&map.next) else { let Some(m) = maps.get(&map.next) else {
return seed; return seed;
}; };
return check_range(seed, m, maps); check_range(seed, m, maps)
} }
fn puzzle1(seeds: &Vec<usize>, maps: &HashMap<String, Map>) { fn puzzle1(seeds: &Vec<usize>, maps: &HashMap<String, Map>) {
@ -123,7 +116,7 @@ fn puzzle1(seeds: &Vec<usize>, maps: &HashMap<String, Map>) {
let map = maps.get("seed").unwrap(); let map = maps.get("seed").unwrap();
for seed in seeds { for seed in seeds {
s.push(check_range(*seed, map, &maps)); s.push(check_range(*seed, map, maps));
} }
// println!(" Seeds → : {:?}", s); // println!(" Seeds → : {:?}", s);
@ -132,7 +125,6 @@ fn puzzle1(seeds: &Vec<usize>, maps: &HashMap<String, Map>) {
} }
fn puzzle2(seeds: Vec<usize>, maps: HashMap<String, Map>) { fn puzzle2(seeds: Vec<usize>, maps: HashMap<String, Map>) {
let mut s: Vec<usize> = vec![];
let map = maps.get("seed").unwrap(); let map = maps.get("seed").unwrap();
let ranges: Vec<_> = seeds let ranges: Vec<_> = seeds
@ -146,7 +138,8 @@ fn puzzle2(seeds: Vec<usize>, maps: HashMap<String, Map>) {
let min: Vec<_> = ranges let min: Vec<_> = ranges
.iter() .iter()
.map(|range| { .map(|range| {
range.clone() range
.clone()
.map(|r| check_range(r, map, &maps)) .map(|r| check_range(r, map, &maps))
.min() .min()
.unwrap() .unwrap()