115 lines
2.6 KiB
Rust
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(())
|
|
}
|