-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #58 from frankhereford/day-4
Day 4
- Loading branch information
Showing
8 changed files
with
352 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
{ | ||
"defaultDay": 3, | ||
"defaultDay": 4, | ||
"name": "web", | ||
"version": "0.1.0", | ||
"private": true, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
export function postMessageToWorker(do_print, message) { | ||
//console.log("do_print", do_print, "message", message) | ||
if (do_print) { | ||
console.log(message) | ||
self.postMessage({ action: 'statusUpdate', message }); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
#![allow(unreachable_code)] | ||
#![allow(unused_variables)] | ||
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 mut iteration = -1; | ||
// let content = include_str!("input/day_04_part_1_test_input.txt"); | ||
let content = include_str!("input/day_04_input.txt"); | ||
|
||
let input_chunks = Regex::new(r"Card +(\d+): +(.*) \| +(.*)").unwrap(); | ||
|
||
let mut card_scores: Vec<u32> = Vec::new(); | ||
content.lines().for_each(|line| { | ||
// Provide a mechanism to limit the volume of output on the console. | ||
iteration += 1; | ||
let mut show_message = false; | ||
if (iteration) % 100 == 0 { | ||
show_message = true; | ||
} | ||
|
||
let characters: Vec<_> = line.chars().collect(); | ||
if characters[0] == '#' { | ||
// postMessageToWorker(show_message, "Skipping line because it is a comment."); | ||
return; | ||
} | ||
|
||
postMessageToWorker(show_message, " "); | ||
postMessageToWorker(show_message, &format!("Iteration: {}, input: {}", iteration, line)); | ||
|
||
if let Some(caps) = input_chunks.captures(line) { | ||
let card = caps.get(1).map_or("", |m| m.as_str()); | ||
let card_int = card.parse::<u32>().expect("Should be able to parse game"); | ||
let winning_numbers_as_string = caps.get(2).map_or("", |m| m.as_str()); | ||
let our_numbers_as_string = caps.get(3).map_or("", |m| m.as_str()); | ||
let winning_numbers = split_digits_over_whitespace(winning_numbers_as_string); | ||
let our_numbers = split_digits_over_whitespace(our_numbers_as_string); | ||
let intersection: Vec<_> = winning_numbers.iter().filter(|&n| our_numbers.contains(n)).collect(); | ||
let intersection_count = intersection.len() as u32; | ||
let mut card_score = 0; | ||
if intersection_count > 0 { | ||
card_score = 2_u32.pow(intersection_count - 1); | ||
} | ||
card_scores.push(card_score); | ||
postMessageToWorker(show_message, &format!("card: {}", card)); | ||
postMessageToWorker(show_message, &format!("winning numbers: {:?}", winning_numbers)); | ||
postMessageToWorker(show_message, &format!("our numbers: {:?}", our_numbers)); | ||
postMessageToWorker(show_message, &format!("our winners: {:?}", intersection)); | ||
postMessageToWorker(show_message, &format!("card score: {:?}", card_score)); | ||
} | ||
|
||
}); | ||
let sum: u32 = card_scores.iter().sum(); | ||
postMessageToWorker(true, &format!("⭐️ Total cards score: {}", sum)); | ||
} | ||
|
||
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 2: \n"); | ||
let mut iteration = -1; | ||
//let content = include_str!("input/day_04_part_1_test_input.txt"); | ||
let content = include_str!("input/day_04_input.txt"); | ||
|
||
let input_chunks = Regex::new(r"Card +(\d+): +(.*) \| +(.*)").unwrap(); | ||
|
||
let mut card_counts: Vec<u32> = Vec::new(); | ||
for _ in 0..content.lines().count(){ | ||
card_counts.push(1); | ||
} | ||
|
||
content.lines().for_each(|line| { | ||
// Provide a mechanism to limit the volume of output on the console. | ||
iteration += 1; | ||
let mut show_message = false; | ||
if (iteration) % 100 == 0 { | ||
show_message = true; | ||
} | ||
|
||
let characters: Vec<_> = line.chars().collect(); | ||
if characters[0] == '#' { | ||
// postMessageToWorker(show_message, "Skipping line because it is a comment."); | ||
return; | ||
} | ||
|
||
postMessageToWorker(show_message, " "); | ||
postMessageToWorker(show_message, &format!("Iteration: {}, input: {}", iteration, line)); | ||
|
||
if let Some(caps) = input_chunks.captures(line) { | ||
let card = caps.get(1).map_or("", |m| m.as_str()); | ||
let card_int = card.parse::<u32>().expect("Should be able to parse game"); | ||
let card_index = card_int - 1; | ||
let winning_numbers_as_string = caps.get(2).map_or("", |m| m.as_str()); | ||
let our_numbers_as_string = caps.get(3).map_or("", |m| m.as_str()); | ||
let winning_numbers = split_digits_over_whitespace(winning_numbers_as_string); | ||
let our_numbers = split_digits_over_whitespace(our_numbers_as_string); | ||
let intersection: Vec<_> = winning_numbers.iter().filter(|&n| our_numbers.contains(n)).collect(); | ||
let intersection_count = intersection.len() as u32; | ||
let amount_to_increase = card_counts[card_index as usize]; | ||
postMessageToWorker(show_message, &format!("number of matches: {:?}", intersection_count)); | ||
postMessageToWorker(show_message, &format!("amount_to_increase: {}", amount_to_increase)); | ||
//postMessageToWorker(show_message, &format!("card_counts going in: {:?}", card_counts)); | ||
for index in card_index..(card_index + intersection_count) { | ||
let index_to_increase = index + 1; | ||
//postMessageToWorker(show_message, &format!("bumping index {} by {}", index_to_increase, amount_to_increase)); | ||
card_counts[index_to_increase as usize] += amount_to_increase; | ||
} | ||
postMessageToWorker(show_message, &format!("card_counts: {:?}", card_counts)); | ||
|
||
// postMessageToWorker(show_message, &format!("card: {}", card)); | ||
// postMessageToWorker(show_message, &format!("winning numbers: {:?}", winning_numbers)); | ||
// postMessageToWorker(show_message, &format!("our numbers: {:?}", our_numbers)); | ||
// postMessageToWorker(show_message, &format!("our winners: {:?}", intersection)); | ||
} | ||
|
||
}); | ||
postMessageToWorker(true, &format!("Final card_counts: {:?}", card_counts)); | ||
let sum: u32 = card_counts.iter().sum(); | ||
postMessageToWorker(true, &format!("⭐️ Total card count: {}", sum)); | ||
} |
Oops, something went wrong.