This commit is contained in:
dobiadi
2024-12-04 19:40:26 +01:00
parent 056644562b
commit e00e7079db
7 changed files with 368 additions and 0 deletions

111
day4/rust/src/main.rs Normal file
View File

@@ -0,0 +1,111 @@
struct Direction {
x: isize,
y: isize,
}
struct Map {
map: Vec<Vec<char>>,
rows: usize,
columns: usize,
}
impl Map {
fn get(&self, x: isize, y: isize) -> Option<char> {
if x < 0 || y < 0 || x > (self.rows as isize) - 1 || y > (self.columns as isize) - 1 {
return None;
}
Some(self.map[x as usize][y as usize])
}
}
fn main() {
let stdin = std::io::stdin();
let mut map = Vec::new();
for line in stdin.lines() {
let line = line.unwrap();
let levels: Vec<_> = line.chars().collect();
map.push(levels);
}
let rows = map.len();
let columns = map[0].len();
let map = Map { map, rows, columns };
let search_sequence: Vec<_> = "XMAS".chars().collect();
let directions = vec![
Direction { x: 0, y: 1 },
Direction { x: 0, y: -1 },
Direction { x: 1, y: 0 },
Direction { x: -1, y: 0 },
Direction { x: 1, y: 1 },
Direction { x: 1, y: -1 },
Direction { x: -1, y: 1 },
Direction { x: -1, y: -1 },
];
let mut count = 0;
let mut count2 = 0;
for x in 0..map.rows {
for y in 0..map.columns {
for dir in &directions {
let mut found = true;
for (idx, &s) in search_sequence.iter().enumerate() {
let row = x as isize + idx as isize * dir.x;
let column = y as isize + idx as isize * dir.y;
match map.get(row, column) {
None => {
found = false;
break;
}
Some(value) => {
if value != s {
found = false;
break;
}
}
}
}
if found {
count += 1;
}
}
// Part 2
if let Some('A') = map.get(x as isize, y as isize) {
let row = x as isize;
let column = y as isize;
match (
map.get(row - 1, column - 1),
map.get(row + 1, column + 1),
map.get(row + 1, column - 1),
map.get(row - 1, column + 1),
) {
(Some('M'), Some('S'), Some('M'), Some('S')) => {
count2 += 1;
}
(Some('S'), Some('M'), Some('M'), Some('S')) => {
count2 += 1;
}
(Some('M'), Some('S'), Some('S'), Some('M')) => {
count2 += 1;
}
(Some('S'), Some('M'), Some('S'), Some('M')) => {
count2 += 1;
}
_ => (),
}
}
}
}
println!("{}", count);
println!("{}", count2);
}