feat: day 4
This commit is contained in:
parent
3fd2674cb9
commit
7f811ce999
10
inputs/day04/example.txt
Normal file
10
inputs/day04/example.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX
|
130
src/day04.rs
Normal file
130
src/day04.rs
Normal file
|
@ -0,0 +1,130 @@
|
|||
pub fn pt1(input: &str) -> usize {
|
||||
let lines = input
|
||||
.lines()
|
||||
.map(|l| l.chars().collect::<Vec<_>>())
|
||||
.collect::<Vec<_>>();
|
||||
let mut count = 0;
|
||||
for (i, line) in lines.iter().enumerate() {
|
||||
for (j, c) in line.iter().enumerate() {
|
||||
if *c == 'X' {
|
||||
if j >= 3
|
||||
&& line.get(j.saturating_sub(1)) == Some(&'M')
|
||||
&& line.get(j.saturating_sub(2)) == Some(&'A')
|
||||
&& line.get(j.saturating_sub(3)) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if j + 3 <= line.len()
|
||||
&& line.get(j + 1) == Some(&'M')
|
||||
&& line.get(j + 2) == Some(&'A')
|
||||
&& line.get(j + 3) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if i >= 3
|
||||
&& lines.get(i.saturating_sub(1)).and_then(|l| l.get(j)) == Some(&'M')
|
||||
&& lines.get(i.saturating_sub(2)).and_then(|l| l.get(j)) == Some(&'A')
|
||||
&& lines.get(i.saturating_sub(3)).and_then(|l| l.get(j)) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if i + 3 <= lines.len()
|
||||
&& lines.get(i + 1).and_then(|l| l.get(j)) == Some(&'M')
|
||||
&& lines.get(i + 2).and_then(|l| l.get(j)) == Some(&'A')
|
||||
&& lines.get(i + 3).and_then(|l| l.get(j)) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if i >= 3
|
||||
&& j >= 3
|
||||
&& lines
|
||||
.get(i.saturating_sub(1))
|
||||
.and_then(|l| l.get(j.saturating_sub(1)))
|
||||
== Some(&'M')
|
||||
&& lines
|
||||
.get(i.saturating_sub(2))
|
||||
.and_then(|l| l.get(j.saturating_sub(2)))
|
||||
== Some(&'A')
|
||||
&& lines
|
||||
.get(i.saturating_sub(3))
|
||||
.and_then(|l| l.get(j.saturating_sub(3)))
|
||||
== Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if i >= 3
|
||||
&& j + 3 <= line.len()
|
||||
&& lines.get(i.saturating_sub(1)).and_then(|l| l.get(j + 1)) == Some(&'M')
|
||||
&& lines.get(i.saturating_sub(2)).and_then(|l| l.get(j + 2)) == Some(&'A')
|
||||
&& lines.get(i.saturating_sub(3)).and_then(|l| l.get(j + 3)) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if j >= 3
|
||||
&& i + 3 <= lines.len()
|
||||
&& lines.get(i + 1).and_then(|l| l.get(j.saturating_sub(1))) == Some(&'M')
|
||||
&& lines.get(i + 2).and_then(|l| l.get(j.saturating_sub(2))) == Some(&'A')
|
||||
&& lines.get(i + 3).and_then(|l| l.get(j.saturating_sub(3))) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
if j + 3 <= line.len()
|
||||
&& i + 3 <= lines.len()
|
||||
&& lines.get(i + 1).and_then(|l| l.get(j + 1)) == Some(&'M')
|
||||
&& lines.get(i + 2).and_then(|l| l.get(j + 2)) == Some(&'A')
|
||||
&& lines.get(i + 3).and_then(|l| l.get(j + 3)) == Some(&'S')
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
count
|
||||
}
|
||||
|
||||
pub fn pt2(input: &str) -> usize {
|
||||
let lines = input
|
||||
.lines()
|
||||
.map(|l| l.chars().collect::<Vec<_>>())
|
||||
.collect::<Vec<_>>();
|
||||
let mut count = 0;
|
||||
for (i, line) in lines.iter().enumerate() {
|
||||
for (j, c) in line.iter().enumerate() {
|
||||
if *c == 'A' && (j >= 1 && i >= 1 && j + 1 < line.len() && i + 1 < lines.len()) {
|
||||
let top_left = lines.get(i - 1).and_then(|l| l.get(j - 1));
|
||||
let bottom_right = lines.get(i + 1).and_then(|l| l.get(j + 1));
|
||||
let bottom_left = lines.get(i + 1).and_then(|l| l.get(j - 1));
|
||||
let top_right = lines.get(i - 1).and_then(|l| l.get(j + 1));
|
||||
if ((top_left == Some(&'M') && bottom_right == Some(&'S'))
|
||||
|| (top_left == Some(&'S') && bottom_right == Some(&'M')))
|
||||
&& ((bottom_left == Some(&'M') && top_right == Some(&'S'))
|
||||
|| (bottom_left == Some(&'S') && top_right == Some(&'M')))
|
||||
{
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
count
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::fs::read_to_string;
|
||||
|
||||
use super::{pt1, pt2};
|
||||
|
||||
#[test]
|
||||
pub fn test_pt1() {
|
||||
let input =
|
||||
read_to_string("./inputs/day04/example.txt").expect("Missing example.txt for day04");
|
||||
assert_eq!(pt1(&input), 18)
|
||||
}
|
||||
#[test]
|
||||
pub fn test_pt2() {
|
||||
let input =
|
||||
read_to_string("./inputs/day04/example.txt").expect("Missing example_2.txt for day04");
|
||||
|
||||
assert_eq!(pt2(&input), 9)
|
||||
}
|
||||
}
|
|
@ -3,12 +3,14 @@ use std::{fmt::Display, fs::read_to_string, time::Instant};
|
|||
mod day01;
|
||||
mod day02;
|
||||
mod day03;
|
||||
mod day04;
|
||||
fn main() {
|
||||
color_eyre::install().unwrap();
|
||||
tracing_subscriber::fmt::init();
|
||||
solve_day(1, day01::pt1, day01::pt2);
|
||||
solve_day(2, day02::pt1, day02::pt2);
|
||||
solve_day(3, day03::pt1, day03::pt2);
|
||||
solve_day(4, day04::pt1, day04::pt2);
|
||||
}
|
||||
|
||||
fn solve_day<Fa, Fb, Ta, Tb>(day: u8, part_a: Fa, part_b: Fb)
|
||||
|
|
Loading…
Reference in a new issue