Skip to content

Commit

Permalink
Merge pull request #60 from frankhereford/day-6
Browse files Browse the repository at this point in the history
Day 6
  • Loading branch information
frankhereford authored Dec 11, 2023
2 parents 517db93 + 306e150 commit a9a056d
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 4 deletions.
4 changes: 2 additions & 2 deletions nextjs/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"defaultDay": 5,
"maxDay": 5,
"defaultDay": 6,
"maxDay": 6,
"name": "web",
"version": "0.1.0",
"private": true,
Expand Down
4 changes: 4 additions & 0 deletions rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
},
_ => ()
}
}
125 changes: 125 additions & 0 deletions rust/src/solutions/day_06.rs
Original file line number Diff line number Diff line change
@@ -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<u32> = 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<u32> = 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<u32> = 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<u32> {
//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<u32> = Vec::new();
for number in parts_as_strings {
//console::log_1(&format!("number: {}", number).into());
let number_as_int = number.parse::<u32>().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<u64> = 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<u64> = 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<u64> = 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<u64> {
//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<u64> = Vec::new();
for number in parts_as_strings {
//console::log_1(&format!("number: {}", number).into());
let number_as_int = number.parse::<u64>().expect("Should be able to parse number");
found_numbers.push(number_as_int);
}
found_numbers
}
4 changes: 2 additions & 2 deletions rust/src/solutions/day_XX.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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| {
Expand All @@ -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| {
Expand Down
2 changes: 2 additions & 0 deletions rust/src/solutions/input/day_06_input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Time: 53 89 76 98
Distance: 313 1090 1214 1201
2 changes: 2 additions & 0 deletions rust/src/solutions/input/day_06_part_2_input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Time: 53897698
Distance: 313109012141201
2 changes: 2 additions & 0 deletions rust/src/solutions/input/day_06_part_2_test_input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Time: 71530
Distance: 940200
2 changes: 2 additions & 0 deletions rust/src/solutions/input/day_06_test_input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Time: 7 15 30
Distance: 9 40 200
1 change: 1 addition & 0 deletions rust/src/solutions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ pub mod day_02;
pub mod day_03;
pub mod day_04;
pub mod day_05;
pub mod day_06;

0 comments on commit a9a056d

Please sign in to comment.