From f7adcd5ba8fe15629fa59a60015e6c093dfa9a99 Mon Sep 17 00:00:00 2001 From: structix Date: Wed, 4 Dec 2024 12:29:35 +0100 Subject: [PATCH] Add day4 --- 2024/day4/.gitignore | 2 + 2024/day4/Cargo.lock | 7 +++ 2024/day4/Cargo.toml | 6 +++ 2024/day4/src/main.rs | 102 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 2024/day4/.gitignore create mode 100644 2024/day4/Cargo.lock create mode 100644 2024/day4/Cargo.toml create mode 100644 2024/day4/src/main.rs diff --git a/2024/day4/.gitignore b/2024/day4/.gitignore new file mode 100644 index 0000000..348d29e --- /dev/null +++ b/2024/day4/.gitignore @@ -0,0 +1,2 @@ +/target +input.txt diff --git a/2024/day4/Cargo.lock b/2024/day4/Cargo.lock new file mode 100644 index 0000000..e92c02c --- /dev/null +++ b/2024/day4/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day4" +version = "0.1.0" diff --git a/2024/day4/Cargo.toml b/2024/day4/Cargo.toml new file mode 100644 index 0000000..0ebbbc8 --- /dev/null +++ b/2024/day4/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day4" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/2024/day4/src/main.rs b/2024/day4/src/main.rs new file mode 100644 index 0000000..e7d7543 --- /dev/null +++ b/2024/day4/src/main.rs @@ -0,0 +1,102 @@ +use std::{fs, isize}; + +fn main() { + let file = fs::read_to_string("./input.txt").unwrap(); + let grid = file.lines().collect::>(); + + println!("Solution 1: {}", puzzle1(&grid)); + println!("Solution 2: {}", puzzle2(&grid)); +} + +fn puzzle1(grid: &[&str]) -> i32 { + let mut count = 0; + + let glen = grid.len() as isize; + let xlen = grid[0].len() as isize; + + let directions: [(isize, isize); 8] = [ + (0, 1), + (1, 0), + (0, -1), + (-1, 0), + (1, 1), + (1, -1), + (-1, 1), + (-1, -1), + ]; + + for y in 0..glen { + for x in 0..xlen { + for (dy, dx) in directions { + let ymul = y + 3 * dy; + let xmul = x + 3 * dx; + + if 0 <= ymul && ymul < glen && 0 <= xmul && xmul < glen { + let gridx = grid[y as usize].chars().nth(x as usize).unwrap(); + let gridm = grid[(y + dy) as usize] + .chars() + .nth((x + dx) as usize) + .unwrap(); + let grida = grid[(y + 2 * dy) as usize] + .chars() + .nth((x + 2 * dx) as usize) + .unwrap(); + let grids = grid[(y + 3 * dy) as usize] + .chars() + .nth((x + 3 * dx) as usize) + .unwrap(); + if gridx == 'X' && gridm == 'M' && grida == 'A' && grids == 'S' { + count += 1; + } + } + } + } + } + + count +} + +fn puzzle2(grid: &[&str]) -> i32 { + let mut count = 0; + + let glen = grid.len(); + let xlen = grid[0].len(); + + for y in 0..glen { + for x in 0..xlen { + if !(y + 2 < glen && x + 2 < xlen) { + continue; + } + + let gridstart = grid[y].chars().nth(x).unwrap(); + let gridmid = grid[y + 1].chars().nth(x + 1).unwrap(); + let gridbotright = grid[y + 2].chars().nth(x + 2).unwrap(); + let gridbotleft = grid[y + 2].chars().nth(x).unwrap(); + let gridupright = grid[y].chars().nth(x + 2).unwrap(); + + match gridstart { + 'M' => { + if gridmid == 'A' + && gridbotright == 'S' + && (gridbotleft == 'M' && gridupright == 'S' + || gridbotleft == 'S' && gridupright == 'M') + { + count += 1; + } + } + 'S' => { + if gridmid == 'A' + && gridbotright == 'M' + && (gridbotleft == 'M' && gridupright == 'S' + || gridbotleft == 'S' && gridupright == 'M') + { + count += 1; + } + } + _ => continue, + } + } + } + + count +}