Antonio Perrone

Posted on

Problem Day 3: Gear Ratios

Here the day 3 problem statement: https://adventofcode.com/2023/day/3

Solution Part 1

``````pub fn part_one(input: &str) -> Option<u32> {
let grid = input.split('\n').collect::<Vec<&str>>();

let mut coordinates: HashSet<[usize; 2]> = HashSet::new();

for (r, line) in grid.iter().enumerate() {
for (c, ch) in line.chars().enumerate() {
if ch.is_numeric() || ch == '.' {
continue;
}

for i in r - 1..r + 2 {
for j in c - 1..c + 2 {
if i >= grid.len()
|| j >= grid[i].len()
|| !(grid[i].chars().nth(j).unwrap().is_numeric())
{
continue;
}
let mut k = j;
while k > 0 && grid[i].chars().nth(k - 1).unwrap().is_numeric() {
k -= 1;
}

coordinates.insert([i, k]);
}
}
}
}

let mut result = 0;

for c in coordinates.iter() {
let mut digits: Vec<String> = vec![];

let mut col = c[1];
while col < grid[c[0]].len() && grid[c[0]].chars().nth(col).unwrap().is_numeric() {
digits.push(grid[c[0]].chars().nth(col).unwrap().to_string());
col += 1
}

result += digits.join("").parse::<u32>().unwrap();
}
Some(result)
}
``````

Solution Part 2

``````pub fn part_two(input: &str) -> Option<u32> {
let grid = input.split('\n').collect::<Vec<&str>>();
let mut result = 0;

for (r, line) in grid.iter().enumerate() {
for (c, ch) in line.chars().enumerate() {
if ch != '*' {
continue;
}

let mut coordinates: HashSet<[usize; 2]> = HashSet::new();

for i in r - 1..r + 2 {
for j in c - 1..c + 2 {
if i >= grid.len()
|| j >= grid[i].len()
|| !(grid[i].chars().nth(j).unwrap().is_numeric())
{
continue;
}
let mut k = j;
while k > 0 && grid[i].chars().nth(k - 1).unwrap().is_numeric() {
k -= 1;
}

coordinates.insert([i, k]);
}
}

if coordinates.len() != 2 {
continue;
}

let mut product = 1;

for c in coordinates.iter() {
let mut digits: Vec<String> = vec![];

let mut col = c[1];
while col < grid[c[0]].len() && grid[c[0]].chars().nth(col).unwrap().is_numeric() {
digits.push(grid[c[0]].chars().nth(col).unwrap().to_string());
col += 1
}

product *= digits.join("").parse::<u32>().unwrap();
}

result += product;
}
}

Some(result)
}
``````

Here the repository with all puzzle solutions.