solve Day03 in rust

This commit is contained in:
WieErWill 2023-12-03 14:28:04 +01:00
parent 4d560c4530
commit da452f1711
4 changed files with 110 additions and 1 deletions

View File

@ -58,3 +58,10 @@ Consider the same engine schematic again:
In this schematic, there are two gears. The first is in the top left; it has part numbers 467 and 35, so its gear ratio is 16345. The second gear is in the lower right; its gear ratio is 451490. (The * adjacent to 617 is not a gear because it is only adjacent to one part number.) Adding up all of the gear ratios produces 467835.
What is the sum of all of the gear ratios in your engine schematic?
## Solution Algorithm
1. **Read the Schematic**: Read the engine schematic from a file into a grid format for processing.
2. **Identify Part Numbers**: For each character in the grid, check if it's adjacent to a symbol (other than .). If so, extract the full number starting from that digit (ensuring left-to-right reading).
3. **Find Gears and Calculate Ratios**: Iterate through the grid and identify * symbols. For each *, find all adjacent part numbers. If exactly two part numbers are found, calculate the gear ratio by multiplying these two numbers.
3. **Sum Gear Ratios**: Add up all the calculated gear ratios to get the total sum.

8
Day03/rust/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

94
Day03/rust/src/main.rs Normal file
View File

@ -0,0 +1,94 @@
use std::fs::File;
use std::io::{self, BufRead, BufReader};
use std::path::Path;
fn parse_schematic(file_path: &Path) -> io::Result<Vec<String>> {
let file = File::open(file_path)?;
let reader = BufReader::new(file);
reader.lines().collect()
}
fn get_adjacent_positions(rows: usize, cols: usize, row: usize, col: usize) -> Vec<(usize, usize)> {
let mut positions = Vec::new();
for i in row.saturating_sub(1)..=(row + 1).min(rows - 1) {
for j in col.saturating_sub(1)..=(col + 1).min(cols - 1) {
if i != row || j != col {
positions.push((i, j));
}
}
}
positions
}
fn find_start_of_number(schematic: &[String], row: usize, mut col: usize) -> usize {
while col > 0 && schematic[row].chars().nth(col - 1).unwrap().is_digit(10) {
col -= 1;
}
col
}
fn extract_full_number(schematic: &mut [String], start_row: usize, start_col: usize) -> i32 {
let start_col = find_start_of_number(schematic, start_row, start_col);
let mut number = String::new();
let mut col = start_col;
while col < schematic[start_row].len() && schematic[start_row].chars().nth(col).unwrap().is_digit(10) {
number.push(schematic[start_row].chars().nth(col).unwrap());
schematic[start_row].replace_range(col..=col, ".");
col += 1;
}
number.parse::<i32>().unwrap_or(0)
}
fn find_gears_and_calculate_ratios(schematic: &mut Vec<String>) -> i32 {
let rows = schematic.len();
let cols = schematic[0].len();
let mut total_ratio_sum = 0;
for row in 0..rows {
for col in 0..cols {
if schematic[row].chars().nth(col).unwrap() == '*' {
let mut part_numbers = Vec::new();
for (i, j) in get_adjacent_positions(rows, cols, row, col) {
if schematic[i].chars().nth(j).unwrap().is_digit(10) {
let part_number = extract_full_number(schematic, i, j);
if !part_numbers.contains(&part_number) {
part_numbers.push(part_number);
}
}
}
if part_numbers.len() == 2 {
let gear_ratio = part_numbers[0] * part_numbers[1];
total_ratio_sum += gear_ratio;
println!("Found gear at line {} with ratio {}", row + 1, gear_ratio);
}
}
}
}
total_ratio_sum
}
fn main() {
let test_path = Path::new("../test.txt");
let input_path = Path::new("../input.txt");
match parse_schematic(test_path) {
Ok(mut test_schematic) => {
let test_result = find_gears_and_calculate_ratios(&mut test_schematic);
println!("Test Result: {}", test_result);
assert_eq!(test_result, 467835, "Test failed: Expected 467835");
}
Err(e) => println!("Error reading test file: {}", e),
}
match parse_schematic(input_path) {
Ok(mut input_schematic) => {
let total_ratio_sum = find_gears_and_calculate_ratios(&mut input_schematic);
println!("Total sum of gear ratios: {}", total_ratio_sum);
}
Err(e) => println!("Error reading input file: {}", e),
}
}

View File

@ -30,7 +30,7 @@ I aim to complete each day's puzzle on the same day, but as with any challenge,
|-----|----------|----------|-------------|
| 01 | ✅ | ✅ | [Day01 README](/Day01/README.md) |
| 02 | ✅ | ✅ | [Day02 README](/Day02/README.md) |
| 03 | ❓ | ❓ | [Day25 README](/Day03/README.md) |
| 03 | ✅ | ✅ | [Day25 README](/Day03/README.md) |
| 04 | ❓ | ❓ | [Day25 README](/Day04/README.md) |
| 05 | ❓ | ❓ | [Day25 README](/Day05/README.md) |
| 06 | ❓ | ❓ | [Day25 README](/Day06/README.md) |