Compare commits

...

3 commits

Author SHA1 Message Date
d25a9aad57 ️ Day 4: Performance and cleanup 2024-12-04 19:45:57 +01:00
2d89799e44 Day 4: Solved part 2! 2024-12-04 19:38:35 +01:00
134512e4ba Day 4: Solved part 1! 2024-12-04 19:33:28 +01:00
2 changed files with 125 additions and 73 deletions

View file

@ -3,8 +3,8 @@
[![About](https://img.shields.io/badge/Advent%20of%20Code-2024-brightgreen?style=flat-square)](https://adventofcode.com/2024/about)
[![Language: Rust](https://img.shields.io/badge/Language-Rust-orange.svg?style=flat-square)](https://en.wikipedia.org/wiki/Rust_(programming_language))
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](https://mit-license.org/)
![Days completed](https://img.shields.io/badge/Days%20completed-2.5-red?style=flat-square)
![Stars](https://img.shields.io/badge/Stars-5-yellow?style=flat-square)
![Days completed](https://img.shields.io/badge/Days%20completed-3.5-red?style=flat-square)
![Stars](https://img.shields.io/badge/Stars-7-yellow?style=flat-square)
> ⚠️ This README is copied from my previous years solution. It is not fully adopted to 2024 yet.

View file

@ -1,21 +1,7 @@
use crate::dprintln;
use super::{Answer, Day, DayImpl};
const CURRENT_DAY: u8 = 4;
#[derive(Debug, Clone, Copy)]
enum Direction {
East,
West,
North,
South,
NorthEast,
NorthWest,
SouthEast,
SouthWest,
}
#[derive(Debug, Clone)]
pub struct LetterWall(Vec<Vec<char>>);
@ -30,77 +16,144 @@ impl LetterWall {
}
}
fn is_upper_left_of_xmas(&self, x: usize, y: usize) -> Option<Direction> {
#[rustfmt::skip]
#[rustfmt::skip]
fn get_xmas_direction_count(&self, x: usize, y: usize) -> u64 {
let mut directions = 0;
let map = (
self.at(x, y), self.at(x+1, y), self.at(x+2, y), self.at(x+3, y),
self.at(x, y+1), self.at(x+1, y+1), self.at(x+2, y+1), self.at(x+3, y+1),
self.at(x, y+2), self.at(x+1, y+2), self.at(x+2, y+2), self.at(x+3, y+2),
self.at(x, y+3), self.at(x+1, y+3), self.at(x+2, y+3), self.at(x+3, y+3)
);
if let (
Some(&'X'), Some(&'M'), Some(&'A'), Some(&'S'),
_, _, _, _,
_, _, _, _,
_, _, _, _
) = map {
directions += 1;
}
if let (
Some('S'), Some('A'), Some('M'), Some('X'),
_, _, _, _,
_, _, _, _,
_, _, _, _
) = map {
directions += 1;
}
if let (
Some('X'), _, _, _,
Some('M'), _, _, _,
Some('A'), _, _, _,
Some('S'), _, _, _
) = map {
directions += 1;
}
if let (
Some('S'), _, _, _,
Some('A'), _, _, _,
Some('M'), _, _, _,
Some('X'), _, _, _
) = map {
directions += 1;
}
if let (
Some('X'), _, _, _,
_, Some('M'), _, _,
_, _, Some('A'), _,
_, _, _, Some('S')
) = map {
directions += 1;
}
if let (
Some('S'), _, _, _,
_, Some('A'), _, _,
_, _, Some('M'), _,
_, _, _, Some('X')
) = map {
directions += 1;
}
if let (
_, _, _, Some('X'),
_, _, Some('M'), _,
_, Some('A'), _, _,
Some('S'), _, _, _
) = map {
directions += 1;
}
if let (
_, _, _, Some('S'),
_, _, Some('A'), _,
_, Some('M'), _, _,
Some('X'), _, _, _
) = map {
directions += 1;
}
directions
}
#[rustfmt::skip]
fn is_cross_mas(&self, x: usize, y: usize) -> bool {
match(
self.at( x, y), self.at( x+1, y), self.at( x+2, y), self.at( x+3, y),
self.at( x, y+1), self.at( x+1, y+1), self.at( x+2, y+1), self.at( x+3, y+1),
self.at( x, y+2), self.at( x+1, y+2), self.at( x+2, y+2), self.at( x+3, y+2),
self.at( x, y+3), self.at( x+1, y+3), self.at( x+2, y+3), self.at( x+3, y+3)
self.at( x, y), self.at( x+1, y), self.at( x+2, y),
self.at( x, y+1), self.at( x+1, y+1), self.at( x+2, y+1),
self.at( x, y+2), self.at( x+1, y+2), self.at( x+2, y+2)
) {
(
Some('X'), Some('M'), Some('A'), Some('S'),
_, _, _, _,
_, _, _, _,
_, _, _, _
) => Some(Direction::East),
Some('M'), _, Some('S'),
_, Some('A'), _,
Some('M'), _, Some('S'),
) => true,
(
Some('S'), Some('A'), Some('M'), Some('X'),
_, _, _, _,
_, _, _, _,
_, _, _, _
) => Some(Direction::West),
Some('S'), _, Some('S'),
_, Some('A'), _,
Some('M'), _, Some('M'),
) => true,
(
Some('X'), _, _, _,
Some('M'), _, _, _,
Some('A'), _, _, _,
Some('S'), _, _, _
) => Some(Direction::South),
Some('M'), _, Some('M'),
_, Some('A'), _,
Some('S'), _, Some('S'),
) => true,
(
Some('S'), _, _, _,
Some('A'), _, _, _,
Some('M'), _, _, _,
Some('X'), _, _, _
) => Some(Direction::North),
(
Some('X'), _, _, _,
_, Some('M'), _, _,
_, _, Some('A'), _,
_, _, _, Some('S')
) => Some(Direction::SouthEast),
(
Some('S'), _, _, _,
_, Some('A'), _, _,
_, _, Some('M'), _,
_, _, _, Some('X')
) => Some(Direction::NorthWest),
(
_, _, _, Some('X'),
_, _, Some('M'), _,
_, Some('A'), _, _,
Some('S'), _, _, _
) => Some(Direction::SouthWest),
(
_, _, _, Some('S'),
_, _, Some('A'), _,
_, Some('M'), _, _,
Some('X'), _, _, _
) => Some(Direction::NorthEast),
_ => None
Some('S'), _, Some('M'),
_, Some('A'), _,
Some('S'), _, Some('M'),
) => true,
_ => false
}
}
pub fn count_xmas(&self) -> u64 {
let mut count = 0;
for y in 0..self.0.len() {
for x in 0..self.0[0].len() {
if let Some(_dir) = self.is_upper_left_of_xmas(x, y) {
dprintln!("FOUND AT {} {} '{}' - DIR: {:?}", x, y, self.0[y][x], _dir);
count += self.get_xmas_direction_count(x, y);
}
}
return count as u64;
}
pub fn count_cross_mas(&self) -> u64 {
let mut count = 0;
for y in 0..self.0.len() {
for x in 0..self.0[0].len() {
if self.is_cross_mas(x, y) {
count += 1;
}
}
}
return count;
return count as u64;
}
}
@ -118,7 +171,7 @@ impl DayImpl<Data> for Day<CURRENT_DAY> {
}
fn expected_results() -> (Answer, Answer) {
(Answer::Number(18), Answer::Number(0))
(Answer::Number(18), Answer::Number(9))
}
fn init(input: &str) -> (Self, Data) {
@ -126,11 +179,10 @@ impl DayImpl<Data> for Day<CURRENT_DAY> {
}
fn one(&self, data: &mut Data) -> Answer {
// NOTE TO SELF: Actual result above 2334
Answer::Number(data.count_xmas())
}
fn two(&self, data: &mut Data) -> Answer {
Answer::Number(0)
Answer::Number(data.count_cross_mas())
}
}