solution: day2
This commit is contained in:
79
src/bin/02.rs
Normal file
79
src/bin/02.rs
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
use hashbrown::HashMap;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
fn direction(d: char) -> (isize, isize) {
|
||||||
|
match d {
|
||||||
|
'U' => (-1, 0),
|
||||||
|
'D' => (1, 0),
|
||||||
|
'L' => (0, -1),
|
||||||
|
'R' => (0, 1),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<isize> {
|
||||||
|
let (mut y, mut x) = (1, 1);
|
||||||
|
let digits: HashMap<(isize, isize), isize> = (0..=2)
|
||||||
|
.cartesian_product(0..=2)
|
||||||
|
.map(|(y, x)| ((y, x), y * 3 + x + 1))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut res = 0;
|
||||||
|
|
||||||
|
for line in input.lines() {
|
||||||
|
res *= 10;
|
||||||
|
for c in line.chars() {
|
||||||
|
let (dy, dx) = direction(c);
|
||||||
|
let (ny, nx) = (y + dy, x + dx);
|
||||||
|
if digits.contains_key(&(ny, nx)) {
|
||||||
|
(y, x) = (ny, nx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res += digits[&(y, x)];
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(res)
|
||||||
|
}
|
||||||
|
pub fn part_two(input: &str) -> Option<String> {
|
||||||
|
let (mut y, mut x) = (2, 0);
|
||||||
|
#[rustfmt::skip]
|
||||||
|
let digits = HashMap::<(isize, isize), char>::from([
|
||||||
|
((0, 2), '1'), ((1, 1), '2'), ((1, 2), '3'), ((1, 3), '4'),
|
||||||
|
((2, 0), '5'), ((2, 1), '6'), ((2, 2), '7'), ((2, 3), '8'),
|
||||||
|
((2, 4), '9'), ((3, 1), 'A'), ((3, 2), 'B'), ((3, 3), 'C'),
|
||||||
|
((4, 2), 'D'),
|
||||||
|
]);
|
||||||
|
let mut res = String::new();
|
||||||
|
|
||||||
|
for line in input.lines() {
|
||||||
|
for c in line.chars() {
|
||||||
|
let (dy, dx) = direction(c);
|
||||||
|
let (ny, nx) = (y + dy, x + dx);
|
||||||
|
if digits.contains_key(&(ny, nx)) {
|
||||||
|
(y, x) = (ny, nx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.push(digits[&(y, x)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(res)
|
||||||
|
}
|
||||||
|
fn main() {
|
||||||
|
let input = &aoc::read_file("inputs", 2);
|
||||||
|
aoc::solve!(1, part_one, input);
|
||||||
|
aoc::solve!(2, part_two, input);
|
||||||
|
}
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
let input = aoc::read_file("examples", 2);
|
||||||
|
assert_eq!(part_one(&input), Some(1985));
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
let input = aoc::read_file("examples", 2);
|
||||||
|
assert_eq!(part_two(&input), Some("5DB3".to_string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
4
src/examples/02.txt
Normal file
4
src/examples/02.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
ULL
|
||||||
|
RRDDD
|
||||||
|
LURDL
|
||||||
|
UUUUD
|
||||||
Reference in New Issue
Block a user