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