AoC2022/src/bin/day5.rs

115 lines
2.6 KiB
Rust

use itertools::Itertools;
use regex::Regex;
use std::collections::HashSet;
use std::error::Error;
use std::fs::File;
use std::io::{self, BufRead, Lines};
use std::vec::Vec;
fn parse_stacks(lines: &Vec<String>) -> Vec<Vec<char>> {
let mut stacks: Vec<Vec<char>> = Vec::new();
for line in lines {
if !line.contains("[") {
break;
}
let mut pos = 1;
let mut stack = 0;
while pos < line.len() {
let c = line.chars().nth(pos).unwrap();
if stacks.len() <= stack {
stacks.push(Vec::new());
}
if c != ' ' {
stacks[stack].insert(0, c)
}
pos += 4;
stack += 1;
}
}
stacks
}
struct Move {
count: usize,
src: usize,
dst: usize,
}
fn parse_moves(lines: &Vec<String>) -> Vec<Move> {
let move_re = Regex::new(r"^move ([0-9]+) from ([0-9]+) to ([0-9]+)$").unwrap();
let mut move_section = false;
let mut moves: Vec<Move> = Vec::new();
for line in lines {
if line.is_empty() {
move_section = true;
continue;
}
if !move_section {
continue;
}
let results = move_re.captures(line).unwrap();
let count: usize = results[1].parse().unwrap();
let src: usize = results[2].parse().unwrap();
let dst: usize = results[3].parse().unwrap();
moves.push(Move {
count: count,
src: src - 1,
dst: dst - 1,
});
}
moves
}
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("inputs/day5.txt")?;
let mut lines: Vec<String> = io::BufReader::new(file)
.lines()
.map(|l| l.unwrap())
.collect();
let stacks = parse_stacks(&lines);
let moves = parse_moves(&lines);
let mut stacks1 = stacks.clone();
for m in moves.iter() {
for _ in 0..m.count {
let tmp = stacks1[m.src].pop().unwrap();
stacks1[m.dst].push(tmp);
}
}
let mut answer1 = String::new();
for stack in stacks1 {
answer1.push(stack.last().unwrap().to_owned());
}
println!("Answer Part1: {}", answer1);
let mut stacks2 = stacks.clone();
for m in moves.iter() {
let pos = stacks2[m.dst].len();
for _ in 0..m.count {
let tmp = stacks2[m.src].pop().unwrap();
stacks2[m.dst].insert(pos, tmp);
}
}
let mut answer2 = String::new();
for stack in stacks2 {
answer2.push(stack.last().unwrap().to_owned());
}
println!("Answer Part2: {}", answer2);
Ok(())
}