Begins work on day 2 problems, also adds the DataSet enum to separate the data set from the run mode

master
Joey Pollack 1 year ago
parent 7069e03132
commit 81b51a85e7

17
Cargo.lock generated

@ -7,6 +7,7 @@ name = "advent_of_code_2024"
version = "0.1.0"
dependencies = [
"day_1",
"day_2",
"solver_base",
"utils",
]
@ -19,6 +20,22 @@ dependencies = [
"utils",
]
[[package]]
name = "day_2"
version = "0.1.0"
dependencies = [
"solver_base",
"utils",
]
[[package]]
name = "day_3"
version = "0.1.0"
dependencies = [
"solver_base",
"utils",
]
[[package]]
name = "solver_base"
version = "0.1.0"

@ -5,15 +5,24 @@ edition = "2021"
[workspace]
# resolver = "2" # Important! wgpu/Bevy needs this! .. so not important for this project?
members = ["crates/utils", "crates/solver_base", "crates/day_1"]
members = [
"crates/utils",
"crates/solver_base",
"crates/day_1",
"crates/day_2",
"crates/day_3"
]
[dependencies]
utils = { workspace = true }
solver_base = { workspace = true }
day_1 = { workspace = true }
day_2 = { workspace = true }
[workspace.dependencies]
utils = { path = "crates/utils" }
solver_base = { path = "crates/solver_base" }
day_1 = { path = "crates/day_1" }
day_1 = { path = "crates/day_1" }
day_2 = { path = "crates/day_2" }
day_3 = { path = "crates/day_3" }

@ -1,9 +1,19 @@
use ::solver_base::solver_base::{Solver, RunMode};
/******************************************************************************
* @file day_1.rs
* @author Joey Pollack
* @date 2024/12/03 (y/m/d)
* @modified 2024/12/03 (y/m/d)
* @copyright Joseph R Pollack
* @brief Advent of Code 2024 day 1 problems
******************************************************************************/
use ::solver_base::solver_base::{Solver, DataSet, RunMode};
use utils::utils;
pub struct Day1
{
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
data_a: Vec<i32>,
@ -19,7 +29,7 @@ impl Day1
{
pub fn new() -> Day1
{
Day1 { run_mode: RunMode::FirstCaseTest, do_debug_prints: false, data_a: vec![], data_b: vec![], distances: vec![], final_result: 0 }
Day1 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, data_a: vec![], data_b: vec![], distances: vec![], final_result: 0 }
}
fn solve_first_case(self: &mut Self) -> String
@ -93,19 +103,17 @@ impl Solver for Day1
println!("DATA: {}", data);
}
fn init(self: &mut Self, run_mode: RunMode, enable_debug_prints: bool)
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
{
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
let dir = utils::get_working_dir();
let data_filename =
match self.run_mode
match self.data_set
{
RunMode::FirstCaseTest => format!("{}/data/test_input", dir),
RunMode::FirstCase => format!("{}/data/input", dir),
RunMode::SecondCaseTest => format!("{}/data/test_input", dir),
RunMode::SecondCase => format!("{}/data/input", dir),
DataSet::Test => format!("{}/data/test_input", dir),
DataSet::Full => format!("{}/data/input", dir),
};
@ -142,12 +150,12 @@ impl Solver for Day1
{
match self.run_mode
{
RunMode::FirstCase | RunMode::FirstCaseTest =>
RunMode::FirstCase =>
{
self.solve_first_case()
},
RunMode::SecondCase | RunMode::SecondCaseTest =>
RunMode::SecondCase =>
{
self.solve_second_case()
}

@ -0,0 +1,9 @@
[package]
name = "day_2"
description = "Day 2 of the Advent of Code 2024"
version = "0.1.0"
edition = "2021"
[dependencies]
solver_base = { workspace = true }
utils = { workspace = true }

@ -0,0 +1,33 @@
use std::{env, fs, path::Path};
fn main()
{
// let out_dir = env::var("OUT_DIR").unwrap();
// let cwd = env::var("CARGO_MANIFEST_DIR").unwrap();
// println!("CWD: {}\n", cwd);
// let data_dir = cwd + "\\data";
// let data_path = Path::new(&data_dir);
// println!("Data path: {}", data_path.to_string_lossy());
// let data_path = Path::new("data/test_input");
// let out_dir = env::var("OUT_DIR").unwrap();
// panic!("out_dir: {}", out_dir);
let out_path = format!("../../target/{}", &env::var("PROFILE").unwrap());
let out_path = Path::new(&out_path);
//let out_path = Path::new(&out_dir).join(&env::var("PROFILE").unwrap());
let out_path_data = out_path.join(Path::new("data"));
if !out_path_data.exists()
{
fs::create_dir(&out_path_data).expect(&format!("Could not create data directory at: {}", out_path_data.to_string_lossy()));
}
for file in fs::read_dir("data").unwrap()
{
let file = file.unwrap();
let dest = out_path.join(file.path());
fs::copy(file.path(), &dest).expect(&format!("Could not copy file {} to {}", file.path().to_string_lossy(), dest.to_string_lossy()));
}
}

File diff suppressed because it is too large Load Diff

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

@ -0,0 +1,113 @@
/******************************************************************************
* @file day_2.rs
* @author Joey Pollack
* @date 2024/12/03 (y/m/d)
* @modified 2024/12/03 (y/m/d)
* @copyright Joseph R Pollack
* @brief Advent of Code 2024 day 2 problems
******************************************************************************/
use crate::report::Report;
use ::solver_base::solver_base::{Solver, DataSet, RunMode};
use utils::utils;
pub struct Day2
{
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
reports: Vec<Report>,
pub final_result: i32,
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// DAY 2 IMPL
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl Day2
{
pub fn new() -> Day2
{
Day2 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, reports: vec![], final_result: 0 }
}
fn solve_first_case(self: &mut Self) -> String
{
// TODO: Day2::solve_first_case
self.final_result.to_string()
}
fn solve_second_case(self: &mut Self) -> String
{
// TODO: Day2::solve_second_case
self.final_result.to_string()
}
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SOLVER TRAIT IMPL
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl Solver for Day2
{
fn print_test()
{
println!("DAY 2 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
{
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
let dir = utils::get_working_dir();
let data_filename =
match self.data_set
{
DataSet::Test => format!("{}/data/test_input", dir),
DataSet::Full => format!("{}/data/input", dir),
};
let data = utils::load_data(&data_filename);
for r in data.split("\n")
{
if self.do_debug_prints
{
println!("Raw report: {}", r);
}
let mut lvl_list: Vec<i32> = vec![];
for value in r.split(" ")
{
lvl_list.push(value.parse::<i32>().unwrap());
}
if self.do_debug_prints
{
println!("Processed report: {:#?}", lvl_list);
}
self.reports.push(Report::new(lvl_list));
}
}
fn solve(self: &mut Self) -> String
{
match self.run_mode
{
RunMode::FirstCase =>
{
self.solve_first_case()
},
RunMode::SecondCase =>
{
self.solve_second_case()
}
}
}
}

@ -0,0 +1,3 @@
pub mod day_2;
pub (crate) mod report;

@ -0,0 +1,31 @@
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum Status
{
Safe,
Unsafe,
Unknown,
}
#[derive(Clone, Debug)]
pub struct Report
{
levels: Vec<i32>,
status: Status,
}
impl Report
{
pub fn new(lvls: Vec<i32>) -> Report
{
Report { levels: lvls , status: Status::Unknown }
}
pub fn analyze(self: &mut Report) -> Status
{
// TODO: Report::analyze()
Status::Unknown
}
}

@ -0,0 +1,9 @@
[package]
name = "day_3"
description = "Day 3 of the Advent of Code 2024"
version = "0.1.0"
edition = "2021"
[dependencies]
solver_base = { workspace = true }
utils = { workspace = true }

@ -0,0 +1,33 @@
use std::{env, fs, path::Path};
fn main()
{
// let out_dir = env::var("OUT_DIR").unwrap();
// let cwd = env::var("CARGO_MANIFEST_DIR").unwrap();
// println!("CWD: {}\n", cwd);
// let data_dir = cwd + "\\data";
// let data_path = Path::new(&data_dir);
// println!("Data path: {}", data_path.to_string_lossy());
// let data_path = Path::new("data/test_input");
// let out_dir = env::var("OUT_DIR").unwrap();
// panic!("out_dir: {}", out_dir);
let out_path = format!("../../target/{}", &env::var("PROFILE").unwrap());
let out_path = Path::new(&out_path);
//let out_path = Path::new(&out_dir).join(&env::var("PROFILE").unwrap());
let out_path_data = out_path.join(Path::new("data"));
if !out_path_data.exists()
{
fs::create_dir(&out_path_data).expect(&format!("Could not create data directory at: {}", out_path_data.to_string_lossy()));
}
for file in fs::read_dir("data").unwrap()
{
let file = file.unwrap();
let dest = out_path.join(file.path());
fs::copy(file.path(), &dest).expect(&format!("Could not copy file {} to {}", file.path().to_string_lossy(), dest.to_string_lossy()));
}
}

@ -0,0 +1,92 @@
/******************************************************************************
* @file day_3.rs
* @author Joey Pollack
* @date 2024/12/03 (y/m/d)
* @modified 2024/12/03 (y/m/d)
* @copyright Joseph R Pollack
* @brief Advent of Code 2024 day 3 problems
******************************************************************************/
use ::solver_base::solver_base::{Solver, DataSet, RunMode};
use utils::utils;
pub struct Day3
{
data_set: DataSet,
run_mode: RunMode,
do_debug_prints: bool,
pub final_result: i32,
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// DAY 3 IMPL
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl Day3
{
pub fn new() -> Day3
{
Day3 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, final_result: 0 }
}
fn solve_first_case(self: &mut Self) -> String
{
self.final_result.to_string()
}
fn solve_second_case(self: &mut Self) -> String
{
self.final_result.to_string()
}
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SOLVER TRAIT IMPL
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl Solver for Day3
{
fn print_test()
{
println!("DAY 3 TEST PRINT");
}
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool)
{
self.run_mode = run_mode;
self.do_debug_prints = enable_debug_prints;
let dir = utils::get_working_dir();
let data_filename =
match self.data_set
{
DataSet::Test => format!("{}/data/test_input", dir),
DataSet::Full => format!("{}/data/input", dir),
};
let _data = utils::load_data(&data_filename);
// TODO: Day3::init
}
fn solve(self: &mut Self) -> String
{
match self.run_mode
{
RunMode::FirstCase =>
{
self.solve_first_case()
},
RunMode::SecondCase =>
{
self.solve_second_case()
}
}
}
}

@ -0,0 +1,2 @@
pub mod day_3;

@ -3,12 +3,17 @@
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum RunMode
{
FirstCaseTest,
FirstCase,
SecondCaseTest,
SecondCase,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum DataSet
{
Test,
Full,
}
pub trait Solver
{
@ -18,6 +23,6 @@ pub trait Solver
println!("SOLVER BASE PRINT TEST");
}
fn init(self: &mut Self, run_mode: RunMode, enable_debug_prints: bool);
fn init(self: &mut Self, data_set: DataSet, run_mode: RunMode, enable_debug_prints: bool);
fn solve(self: &mut Self) -> String;
}

@ -1,18 +1,34 @@
/******************************************************************************
* @file main.rs
* @author Joey Pollack
* @date 2024/12/03 (y/m/d)
* @modified 2024/12/03 (y/m/d)
* @copyright Joseph R Pollack
* @brief Advent of Code 2024 main file
******************************************************************************/
use day_1::day_1::Day1;
use solver_base::solver_base::{Solver, RunMode};
use day_2::day_2::Day2;
use solver_base::solver_base::{Solver, DataSet, RunMode};
fn main()
{
// DAY 1
let mut day_1 = Day1::new();
day_1.init(RunMode::FirstCase, false);
day_1.init(DataSet::Full, RunMode::FirstCase, false);
let day1_result = day_1.solve();
println!("Day1 Part 1 Final Result: {}", day1_result);
let mut day_1 = Day1::new();
day_1.init(RunMode::SecondCase, false);
day_1.init(DataSet::Full, RunMode::SecondCase, false);
let day1_result = day_1.solve();
println!("Day1 Part 2 Final Result: {}", day1_result);
// DAY 2
let mut day_2 = Day2::new();
day_2.init(DataSet::Full, RunMode::FirstCase, true);
let day2_result = day_2.solve();
println!("Day2 Part 1 Final Result: {}", day2_result);
}

Loading…
Cancel
Save