Day4
This commit is contained in:
111
day4/rust/src/main.rs
Normal file
111
day4/rust/src/main.rs
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user