From ef93b302cefd48c930384ad29eab30089352dbc8 Mon Sep 17 00:00:00 2001 From: kageru Date: Mon, 5 Dec 2022 11:35:34 +0100 Subject: [PATCH] Optimize parsing 2022/05 --- 2022/src/bin/day01.rs | 2 +- 2022/src/bin/day02.rs | 2 +- 2022/src/bin/day03.rs | 2 +- 2022/src/bin/day05.rs | 21 +++++++++++++-------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/2022/src/bin/day01.rs b/2022/src/bin/day01.rs index 2ea041d..f6f0e11 100644 --- a/2022/src/bin/day01.rs +++ b/2022/src/bin/day01.rs @@ -4,7 +4,7 @@ use std::collections::BinaryHeap; use aoc2022::{boilerplate, common::*}; -const DAY: usize = 01; +const DAY: usize = 1; type Parsed = BinaryHeap; fn parse_input(raw: &str) -> Parsed { diff --git a/2022/src/bin/day02.rs b/2022/src/bin/day02.rs index 4d4a73c..aa8d0a1 100644 --- a/2022/src/bin/day02.rs +++ b/2022/src/bin/day02.rs @@ -7,7 +7,7 @@ const DAY: usize = 2; fn round([other, _, own, _]: [u8; 4]) -> usize { (match other.wrapping_sub(own - b'X' + b'A') { 0 => 3 + own - b'W', - 1 | 254 => 0 + own - b'W', + 1 | 254 => own - b'W', _ => 6 + own - b'W', }) as usize } diff --git a/2022/src/bin/day03.rs b/2022/src/bin/day03.rs index 3b48a5b..6d86a0a 100644 --- a/2022/src/bin/day03.rs +++ b/2022/src/bin/day03.rs @@ -4,7 +4,7 @@ use std::collections::HashSet; use aoc2022::{boilerplate, common::*}; -const DAY: usize = 03; +const DAY: usize = 3; type Parsed = Vec<(HashSet, HashSet)>; fn parse_input(raw: &str) -> Parsed { diff --git a/2022/src/bin/day05.rs b/2022/src/bin/day05.rs index 2006119..f782a09 100644 --- a/2022/src/bin/day05.rs +++ b/2022/src/bin/day05.rs @@ -1,5 +1,6 @@ -#![feature(test)] +#![feature(test, slice_take)] extern crate test; + use aoc2022::{boilerplate, common::*}; const DAY: usize = 5; @@ -24,20 +25,24 @@ fn parse_input(raw: &str) -> Parsed { }; let num_stacks = (stack_numbers.trim().bytes().last().unwrap() - b'0') as usize; let mut stacks = vec![vec![]; num_stacks]; - for s in raw_stacks.iter().rev() { - for n in 0..num_stacks { + for &s in raw_stacks.iter().rev() { + for (n, stack) in stacks.iter_mut().enumerate() { match s.as_bytes().get(1 + 4 * n) { Some(b' ') | None => (), - Some(&c) => stacks[n].push(c), + Some(&c) => stack.push(c), } } } let moves = lines .skip(1) - .map(|l| { - let (n, pos) = l[5..].split_once(" from ").unwrap(); - let (src, dst) = pos.split_once(" to ").unwrap(); - Move { n: parse_num(n), src: parse_num::(src) - 1, dst: parse_num::(dst) - 1 } + .map(|l| match l.as_bytes() { + [_, _, _, _, _, n, _, _, _, _, _, _, src, _, _, _, _, dst] => { + Move { n: (n - b'0') as usize, src: (src - b'1') as _, dst: (dst - b'1') as _ } + } + [_, _, _, _, _, n1, n2, _, _, _, _, _, _, src, _, _, _, _, dst] => { + Move { n: ((n1 - b'0') * 10 + n2 - b'0') as _, src: (src - b'1') as _, dst: (dst - b'1') as _ } + } + _ => unreachable!("Operations can’t be repeated more than 99 times"), }) .collect(); (stacks, moves)