clean up day5, don't use itertools

This commit is contained in:
Joe Ardent 2022-12-06 14:55:16 -08:00
parent 5779749423
commit 96441ccdbd
2 changed files with 27 additions and 38 deletions

View file

@ -6,7 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
aoc-runner = "0.3.0"
aoc-runner-derive = "0.3.0"
itertools = "0.10.5"
regex = "1.7.0"
aoc-runner = "0.3"
aoc-runner-derive = "0.3"
#itertools = "0.10.5"
regex = "1.7"

View file

@ -1,53 +1,43 @@
use aoc_runner_derive::{aoc as aoc_run, aoc_generator};
use itertools::Itertools;
type Stax = Vec<Vec<char>>;
type Inst = (usize, usize, usize);
enum Pstate {
Setup,
Instr,
}
#[aoc_generator(day5)]
fn parse_input_day1(input: &str) -> (Stax, Vec<Inst>) {
let mut out = Vec::new();
let mut inst = Vec::new();
let mut state = Pstate::Setup;
let mut parsing_crates = true;
for _ in 0..9 {
out.push(Vec::new());
}
let re = regex::Regex::new(r"^move (\d+) from (\d+) to (\d+)$").unwrap();
for line in input.lines() {
match state {
Pstate::Setup => {
if line.trim().starts_with('1') {
continue;
}
if line.trim().is_empty() {
state = Pstate::Instr;
}
for (i, cell) in line.chars().chunks(4).into_iter().enumerate() {
let cell: String = cell.collect();
let cell = cell.trim();
if !cell.is_empty() {
let cell = cell.strip_prefix('[').unwrap().strip_suffix(']').unwrap();
out[i].push(cell.chars().next().unwrap());
}
if parsing_crates {
if line.trim().starts_with('1') {
continue;
}
if line.trim().is_empty() {
parsing_crates = false;
}
for (i, cell) in line.as_bytes().chunks(4).enumerate() {
let cell = std::str::from_utf8(cell).unwrap().trim();
if !cell.is_empty() {
let cell = cell.strip_prefix('[').unwrap().strip_suffix(']').unwrap();
out[i].push(cell.chars().next().unwrap());
}
}
// parse the instructions
Pstate::Instr => {
let ins = re.captures(line).unwrap();
inst.push((
ins[1].parse().unwrap(),
ins[2].parse::<usize>().unwrap() - 1,
ins[3].parse::<usize>().unwrap() - 1,
));
}
} else {
let ins = re.captures(line).unwrap();
inst.push((
ins[1].parse().unwrap(),
ins[2].parse::<usize>().unwrap() - 1,
ins[3].parse::<usize>().unwrap() - 1,
));
}
}
for stack in out.iter_mut() {
stack.reverse();
}
@ -85,9 +75,8 @@ fn p2((stax, inst): &(Stax, Vec<Inst>)) -> String {
let c = from.pop().unwrap();
tmp.push(c);
}
for c in tmp.into_iter().rev() {
stax[*to].push(c);
}
tmp.reverse();
stax[*to].append(&mut tmp);
}
let mut s = String::with_capacity(9);
for stack in stax {