2023 - Day 5 : v3
This commit is contained in:
parent
30754dafaa
commit
0cdb274daa
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue