feat: solve day 4
This commit is contained in:
parent
acbd3801ca
commit
98d927cd72
2 changed files with 154 additions and 0 deletions
11
data/examples/04.txt
Normal file
11
data/examples/04.txt
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
..@@.@@@@.
|
||||||
|
@@@.@.@.@@
|
||||||
|
@@@@@.@.@@
|
||||||
|
@.@@@@..@.
|
||||||
|
@@.@@@@.@@
|
||||||
|
.@@@@@@@.@
|
||||||
|
.@.@.@.@@@
|
||||||
|
@.@@@.@@@@
|
||||||
|
.@@@@@@@@.
|
||||||
|
@.@.@@@.@.
|
||||||
|
|
||||||
143
src/bin/04.rs
Normal file
143
src/bin/04.rs
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
advent_of_code::solution!(4);
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<u64> {
|
||||||
|
let char_grid: Vec<Vec<char>> = input
|
||||||
|
.split('\n')
|
||||||
|
.filter(|el| !el.is_empty())
|
||||||
|
.map(|line| line.chars().collect())
|
||||||
|
.collect();
|
||||||
|
let mut num_rolls = 0;
|
||||||
|
for (i, row) in char_grid.iter().enumerate() {
|
||||||
|
for (j, c) in row.iter().enumerate() {
|
||||||
|
let mut num = 0;
|
||||||
|
if *c == '@' {
|
||||||
|
if (i + 1) < char_grid.len() && char_grid[i + 1][j] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i + 1) < char_grid.len()
|
||||||
|
&& (j + 1) < row.len()
|
||||||
|
&& char_grid[i + 1][j + 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j + 1) < row.len() && char_grid[i][j + 1] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i as i32 - 1) >= 0 && (j + 1) < row.len() && char_grid[i - 1][j + 1] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i as i32 - 1) as i32 >= 0 && char_grid[i - 1][j] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i as i32 - 1) as i32 >= 0
|
||||||
|
&& (j as i32 - 1) >= 0
|
||||||
|
&& char_grid[i - 1][j - 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j as i32 - 1) >= 0 && char_grid[i][j - 1] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if i + 1 < char_grid.len() && (j as i32 - 1) >= 0 && char_grid[i + 1][j - 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
if num < 4 {
|
||||||
|
num_rolls += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(num_rolls)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<u64> {
|
||||||
|
let mut char_grid: Vec<Vec<char>> = input
|
||||||
|
.split('\n')
|
||||||
|
.filter(|el| !el.is_empty())
|
||||||
|
.map(|line| line.chars().collect())
|
||||||
|
.collect();
|
||||||
|
let mut num_rolls = 0;
|
||||||
|
let mut done = false;
|
||||||
|
while !done {
|
||||||
|
done = true;
|
||||||
|
for (i, row) in char_grid.clone().iter().enumerate() {
|
||||||
|
for (j, c) in row.clone().iter().enumerate() {
|
||||||
|
let mut num = 0;
|
||||||
|
if *c == '@' {
|
||||||
|
if (i + 1) < char_grid.len() && char_grid[i + 1][j] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i + 1) < char_grid.len()
|
||||||
|
&& (j + 1) < row.len()
|
||||||
|
&& char_grid[i + 1][j + 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j + 1) < row.len() && char_grid[i][j + 1] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i as i32 - 1) >= 0 && (j + 1) < row.len() && char_grid[i - 1][j + 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i as i32 - 1) as i32 >= 0 && char_grid[i - 1][j] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i as i32 - 1) as i32 >= 0
|
||||||
|
&& (j as i32 - 1) >= 0
|
||||||
|
&& char_grid[i - 1][j - 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j as i32 - 1) >= 0 && char_grid[i][j - 1] == '@' {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if i + 1 < char_grid.len()
|
||||||
|
&& (j as i32 - 1) >= 0
|
||||||
|
&& char_grid[i + 1][j - 1] == '@'
|
||||||
|
{
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
if num < 4 {
|
||||||
|
num_rolls += 1;
|
||||||
|
char_grid[i][j] = '.';
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(num_rolls)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
|
||||||
|
assert_eq!(result, Some(13));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
|
||||||
|
assert_eq!(result, Some(43));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue