Skip to content

Commit

Permalink
Merge pull request #58 from frankhereford/day-4
Browse files Browse the repository at this point in the history
Day 4
  • Loading branch information
frankhereford authored Dec 5, 2023
2 parents 1ec0250 + aca1159 commit a77500a
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 1 deletion.
2 changes: 1 addition & 1 deletion nextjs/package.json
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,
Expand Down
1 change: 1 addition & 0 deletions nextjs/src/pages/components/Terminal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ function getNewText(printed: string, content: string) {
escapedPrinted = escapedPrinted.replace(/\]/g, '\\]')
escapedPrinted = escapedPrinted.replace(/\(/g, '\\(')
escapedPrinted = escapedPrinted.replace(/\)/g, '\\)')
escapedPrinted = escapedPrinted.replace(/\|/g, '\\|')
const pattern = `^${escapedPrinted}([\\s\\S]*)`
const regex = new RegExp(pattern)
const results = regex.exec(content)
Expand Down
1 change: 1 addition & 0 deletions nextjs/src/pages/webworkers/workerHelpers.js
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 });
}
}
4 changes: 4 additions & 0 deletions rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ pub fn solution(n: u32) -> () {
solutions::day_03::solution_part_1();
solutions::day_03::solution_part_2();
},
4 => {
solutions::day_04::solution_part_1();
solutions::day_04::solution_part_2();
},
_ => ()
}
}
137 changes: 137 additions & 0 deletions rust/src/solutions/day_04.rs
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));
}
Loading

0 comments on commit a77500a

Please sign in to comment.