AOC2022/day05/src/main.rs

109 lines
3.3 KiB
Rust

use std::fs;
use std::str::FromStr;
fn main() {
const FILE_PATH: &str = "input";
println!("Hi this is the fifth day of AOC2022, first we will read the file {}", FILE_PATH);
let contents = fs::read_to_string(FILE_PATH)
.expect("Should have been able to read the file");
println!("First we parse this mess");
let (snacks, moves) = parse(&contents);
println!("Then we do the moves as told!");
let snacks = operate9000(snacks, moves);
println!("Aaaand, the top crates are: {}", peek(&snacks));
println!("Aw, it was a CrateMover 9001, no problem we make snacks!");
let (snacks, moves) = parse(&contents);
println!("Then we do the moves as told, this time the correct way!");
let snacks = operate9001(snacks, moves);
println!("Aaaand, the top crates are: {}", peek(&snacks));
}
fn peek(snacks: &Vec<Vec<char>>) -> String{
let mut top = String::new();
for s in snacks{
let ptr = s.len()-1;
top.push(s[ptr]);
}
top
}
fn operate9000(snacks: Vec<Vec<char>>, moves: Vec<(usize, usize, usize)>) -> Vec<Vec<char>>{
let mut snacks = snacks.to_owned();
for mov in moves{
for _ in 0..mov.0{
let c = snacks[mov.1-1].pop().expect("You must be able to do the isntruction");
snacks[mov.2-1].push(c);
}
}
snacks
}
fn operate9001(snacks: Vec<Vec<char>>, moves: Vec<(usize, usize, usize)>) -> Vec<Vec<char>>{
let mut snacks = snacks.to_owned();
for mov in moves{
let mut c = Vec::new();
for _ in 0..mov.0{
c.push(snacks[mov.1-1].pop().expect("You must be able to do the isntruction"));
}
for _ in 0..c.len(){
snacks[mov.2-1].push(c.pop().expect("Always full here lemao"));
}
}
snacks
}
fn parse(s: &str) -> (Vec<Vec<char>>, Vec<(usize, usize, usize)>){
let mut s = s.split("\n\n");
let mut snacks = Vec::new();
let mut moves = Vec::new();
//Stacks
let mut stacks = s.next().expect("there must be things in the stacks").lines().rev();
let n: Vec<char> = stacks.next().expect("REASON").chars().rev().collect();
let n: usize = n[1].to_digit(10).expect("Must be a number") as usize;
for _ in 0..n{
snacks.push(Vec::new())
}
for line in stacks{
let line: Vec<char> = line.chars().collect();
for i in 0..n{
let caja = line[i*4+1];
if caja != ' '{
snacks[i].push(caja);
}
}
}
//Moves
for line in s.next().expect("There must be instructions").lines(){
let line: Vec<&str> = line.split(" ").collect();
moves.push((usize::from_str(line[1]).expect("Must be a number"), usize::from_str(line[3]).expect("Must be a number"), usize::from_str(line[5]).expect("Must be a number")));
}
(snacks, moves)
}
#[cfg(test)]
mod test {
const INPUT: &str = r#" [D]
[N] [C]
[Z] [M] [P]
1 2 3
move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2"#;
use super::*;
#[test]
fn stacks1() {
let (snacks, moves) = parse(INPUT);
let snacks = operate9000(snacks, moves);
assert_eq!(peek(&snacks), "CMZ");
}
#[test]
fn stacks2() {
let (snacks, moves) = parse(INPUT);
let snacks = operate9001(snacks, moves);
assert_eq!(peek(&snacks), "MCD");
}
}