diff --git a/nextjs/package.json b/nextjs/package.json index f986642..78fe660 100644 --- a/nextjs/package.json +++ b/nextjs/package.json @@ -1,6 +1,6 @@ { - "defaultDay": 5, - "maxDay": 5, + "defaultDay": 6, + "maxDay": 6, "name": "web", "version": "0.1.0", "private": true, diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 0cd90b8..058038d 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -53,6 +53,10 @@ pub fn solution(n: u32) -> () { solutions::day_05::solution_part_1(); solutions::day_05::solution_part_2(); }, + 6 => { + solutions::day_06::solution_part_1(); + solutions::day_06::solution_part_2(); + }, _ => () } } \ No newline at end of file diff --git a/rust/src/solutions/day_06.rs b/rust/src/solutions/day_06.rs new file mode 100644 index 0000000..d162280 --- /dev/null +++ b/rust/src/solutions/day_06.rs @@ -0,0 +1,125 @@ +#![allow(unreachable_code)] +#![allow(unused_variables)] +//use web_sys::console; +use wasm_bindgen::prelude::*; + +use regex::Regex; + +#[wasm_bindgen(module = "/src/solutions/workerHelpers.js")] +extern "C" { + fn postMessageToWorker(do_print: bool, message: &str); +} + +pub fn solution_part_1() -> () { + postMessageToWorker(true, "Part 1: \n"); + //let content = include_str!("input/day_06_test_input.txt"); + let content = include_str!("input/day_06_input.txt"); + + let time_line = Regex::new(r"Time:(.*)").unwrap(); + let distance_line = Regex::new(r"Distance:(.*)").unwrap(); + + let mut times: Vec = Vec::new(); + if let Some(caps) = time_line.captures(content) { + let times_as_string = caps.get(1).map_or("", |m| m.as_str().trim()); + times = split_digits_over_whitespace(times_as_string); + } + + let mut distances: Vec = Vec::new(); + if let Some(caps) = distance_line.captures(content) { + let distances_as_string = caps.get(1).map_or("", |m| m.as_str().trim()); + distances = split_digits_over_whitespace(distances_as_string); + } + + //postMessageToWorker(true, &format!("Times: {:?}", times)); + //postMessageToWorker(true, &format!("Distances: {:?}", distances)); + + let mut margins: Vec = Vec::new(); + for race in 0..times.len() { + let duration = times[race]; + let distance = distances[race]; + postMessageToWorker(true, &format!("duration: {}, distance: {}", duration, distance)); + let mut count_of_winners = 0; + for milisecond in 0..duration+1 { + let distance_traveled = milisecond * (duration - milisecond); + if distance_traveled > distance { + count_of_winners += 1; + } + //postMessageToWorker(true, &format!("milisecond: {}, distance_traveled: {}", milisecond, distance_traveled)); + } + postMessageToWorker(true, &format!("count_of_winners: {}", count_of_winners)); + margins.push(count_of_winners); + } + let margins_product: u32 = margins.iter().product(); + + postMessageToWorker(true, &format!("Product of margins_product: {}", margins_product)); +} + +fn split_digits_over_whitespace(input: &str) -> Vec { + //console::log_1(&format!("input: {}", input).into()); + let whitespace = Regex::new(r"\s+").unwrap(); + let parts_as_strings: Vec<&str> = whitespace.split(input).collect(); + let mut found_numbers: Vec = Vec::new(); + for number in parts_as_strings { + //console::log_1(&format!("number: {}", number).into()); + let number_as_int = number.parse::().expect("Should be able to parse number"); + found_numbers.push(number_as_int); + } + found_numbers +} + +pub fn solution_part_2() -> () { + postMessageToWorker(true, "Part 1: \n"); + //let content = include_str!("input/day_06_part_2_test_input.txt"); + let content = include_str!("input/day_06_part_2_input.txt"); + + let time_line = Regex::new(r"Time:(.*)").unwrap(); + let distance_line = Regex::new(r"Distance:(.*)").unwrap(); + + let mut times: Vec = Vec::new(); + if let Some(caps) = time_line.captures(content) { + let times_as_string = caps.get(1).map_or("", |m| m.as_str().trim()); + times = split_digits_over_whitespace_64(times_as_string); + } + + let mut distances: Vec = Vec::new(); + if let Some(caps) = distance_line.captures(content) { + let distances_as_string = caps.get(1).map_or("", |m| m.as_str().trim()); + distances = split_digits_over_whitespace_64(distances_as_string); + } + + //postMessageToWorker(true, &format!("Times: {:?}", times)); + //postMessageToWorker(true, &format!("Distances: {:?}", distances)); + + let mut margins: Vec = Vec::new(); + for race in 0..times.len() { + let duration = times[race]; + let distance = distances[race]; + postMessageToWorker(true, &format!("duration: {}, distance: {}", duration, distance)); + let mut count_of_winners = 0; + for milisecond in 0..duration+1 { + let distance_traveled = milisecond * (duration - milisecond); + if distance_traveled > distance { + count_of_winners += 1; + } + //postMessageToWorker(true, &format!("milisecond: {}, distance_traveled: {}", milisecond, distance_traveled)); + } + postMessageToWorker(true, &format!("count_of_winners: {}", count_of_winners)); + margins.push(count_of_winners); + } + let margins_product: u64 = margins.iter().product(); + + postMessageToWorker(true, &format!("Product of margins_product: {}", margins_product)); +} + +fn split_digits_over_whitespace_64(input: &str) -> Vec { + //console::log_1(&format!("input: {}", input).into()); + let whitespace = Regex::new(r"\s+").unwrap(); + let parts_as_strings: Vec<&str> = whitespace.split(input).collect(); + let mut found_numbers: Vec = Vec::new(); + for number in parts_as_strings { + //console::log_1(&format!("number: {}", number).into()); + let number_as_int = number.parse::().expect("Should be able to parse number"); + found_numbers.push(number_as_int); + } + found_numbers +} diff --git a/rust/src/solutions/day_XX.rs b/rust/src/solutions/day_XX.rs index 1083b62..3835d33 100644 --- a/rust/src/solutions/day_XX.rs +++ b/rust/src/solutions/day_XX.rs @@ -11,7 +11,7 @@ extern "C" { pub fn solution_part_1() -> () { postMessageToWorker(true, "Part 1: \n"); let mut iteration = -1; - let content = include_str!("input/day_XX_part_1_test_input.txt"); + let content = include_str!("input/day_XX_test_input.txt"); // let content = include_str!("input/day_XX_input.txt"); content.lines().for_each(|line| { @@ -38,7 +38,7 @@ pub fn solution_part_2() -> () { return; postMessageToWorker(true, "Part 2: \n"); let mut iteration = -1; - let content = include_str!("input/day_XX_part_2_test_input.txt"); + let content = include_str!("input/day_XX_test_input.txt"); // let content = include_str!("input/day_XX_input.txt"); content.lines().for_each(|line| { diff --git a/rust/src/solutions/input/day_06_input.txt b/rust/src/solutions/input/day_06_input.txt new file mode 100644 index 0000000..b2ea308 --- /dev/null +++ b/rust/src/solutions/input/day_06_input.txt @@ -0,0 +1,2 @@ +Time: 53 89 76 98 +Distance: 313 1090 1214 1201 \ No newline at end of file diff --git a/rust/src/solutions/input/day_06_part_2_input.txt b/rust/src/solutions/input/day_06_part_2_input.txt new file mode 100644 index 0000000..ee30609 --- /dev/null +++ b/rust/src/solutions/input/day_06_part_2_input.txt @@ -0,0 +1,2 @@ +Time: 53897698 +Distance: 313109012141201 \ No newline at end of file diff --git a/rust/src/solutions/input/day_06_part_2_test_input.txt b/rust/src/solutions/input/day_06_part_2_test_input.txt new file mode 100644 index 0000000..3935322 --- /dev/null +++ b/rust/src/solutions/input/day_06_part_2_test_input.txt @@ -0,0 +1,2 @@ +Time: 71530 +Distance: 940200 \ No newline at end of file diff --git a/rust/src/solutions/input/day_06_test_input.txt b/rust/src/solutions/input/day_06_test_input.txt new file mode 100644 index 0000000..b39f49d --- /dev/null +++ b/rust/src/solutions/input/day_06_test_input.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200 \ No newline at end of file diff --git a/rust/src/solutions/mod.rs b/rust/src/solutions/mod.rs index 0cffcb6..bf6b062 100644 --- a/rust/src/solutions/mod.rs +++ b/rust/src/solutions/mod.rs @@ -4,3 +4,4 @@ pub mod day_02; pub mod day_03; pub mod day_04; pub mod day_05; +pub mod day_06;