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