Add day4
This commit is contained in:
2
2024/day4/.gitignore
vendored
Normal file
2
2024/day4/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
input.txt
|
7
2024/day4/Cargo.lock
generated
Normal file
7
2024/day4/Cargo.lock
generated
Normal file
@@ -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"
|
6
2024/day4/Cargo.toml
Normal file
6
2024/day4/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "day4"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
102
2024/day4/src/main.rs
Normal file
102
2024/day4/src/main.rs
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
use std::{fs, isize};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file = fs::read_to_string("./input.txt").unwrap();
|
||||||
|
let grid = file.lines().collect::<Vec<&str>>();
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
Reference in New Issue
Block a user