Day 4 (Puzzle 1) - Rucksack Reorganization

Decided to use Rust for this and boy did it take hours...
It is a very simplistic program without any fancy whistles. But it runs and succeeded in the puzzle!
main
Peery 1 year ago
parent 2c44d2b9bb
commit c7ffe2b2d1

7
day4/Cargo.lock generated

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "advent_of_code_day4"
version = "0.0.1"

@ -0,0 +1,7 @@
[package]
name = "advent_of_code_day4"
version = "0.0.1"
authors = ["Peery"]
edition = "2021"
[dependencies]

@ -0,0 +1,6 @@
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8

File diff suppressed because it is too large Load Diff

@ -0,0 +1,84 @@
#![crate_name = "advent_of_code_day4"]
//use std::env;
use std::fs;
use std::path::{Path};
fn parse_sectors(input: &str) -> Vec<Vec<Vec<u32>>> {
/// Parse the given string for the sector starts and ends.
///
/// # Arguments
/// * `input` - A string directly read from the file
assert!(!input.is_empty());
let lines: Vec<&str> = input.split("\n").collect();
let mut sector_groups: Vec<Vec<Vec<u32>>> = Vec::new(); // <[<1,2,3>, <3,4,5>]>
for line in &lines {
let secs_str: Vec<&str> = line.split(",").collect(); // splitting into sector ranges, ["1-3", "3-5"]
if secs_str.len() != 2 {
continue
}
let mut line_vector: Vec<Vec<u32>> = Vec::new();
// str_range_exp = "1-3"
let str_range_params: Vec<&str> = secs_str[0].split("-").collect();
let mut range: Vec<u32> = Vec::new();
for i in str_range_params[0].parse::<u32>().unwrap()..(str_range_params[1].parse::<u32>().unwrap()+1) {
range.push(i);
}
line_vector.push(range.clone());
let str_range_params: Vec<&str> = secs_str[1].split("-").collect();
let mut range: Vec<u32> = Vec::new();
for i in str_range_params[0].parse::<u32>().unwrap()..(str_range_params[1].parse::<u32>().unwrap()+1) {
range.push(i);
}
line_vector.push(range.clone());
sector_groups.push(line_vector);
}
//println!("My Ranges are: {:?}", sector_groups);
return sector_groups;
}
fn check_for_overlaps(pair: &Vec<Vec<u32>>) -> Vec<u32> {
/// Checks the given two lust of values for overlaps in each other.
/// If there are overlaps a vector of them is returned.
/// If not an empty array is returned
assert!(pair.len() == 2);
let mut overlaps: Vec<u32> = Vec::new();
for value in &pair[0] {
if pair[1].contains(value) {
overlaps.push(*value);
}
}
return overlaps;
}
fn main() {
let input_path = Path::new("./input/input.lst");
let contents = fs::read_to_string(input_path).unwrap();
//println!("My given file: \n{}", contents);
let sector_pairs: Vec<Vec<Vec<u32>>> = parse_sectors(&contents);
let mut complete_overlap_count = 0;
for pair in &sector_pairs {
let overlaps: Vec<u32> = check_for_overlaps(&pair);
//println!("Overlap is: {:?}", overlaps);
if overlaps.len() == pair[0].len() || overlaps.len() == pair[1].len() {
println!("Found a complete overlap in the following pair: {:?}", pair);
complete_overlap_count += 1;
}
}
println!();
println!("Found {} pairs with complete overlaps!", complete_overlap_count);
}
Loading…
Cancel
Save