added day 19

This commit is contained in:
Ishan Jain 2024-12-19 14:24:04 +05:30
parent fc488c89dd
commit b319e46483
2 changed files with 122 additions and 0 deletions

61
src/day19/1.rs Normal file
View File

@ -0,0 +1,61 @@
#![feature(test)]
extern crate test;
use fxhash::FxHashSet;
const INPUTS: [&str; 2] = [
"r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb",
include_str!("./input.txt"),
];
pub fn run(input: &str) -> i64 {
let (towels, to_make) = input.split_once("\n\n").unwrap();
let towels = towels.split(", ").map(|x| x.bytes().collect::<Vec<u8>>()).collect::<FxHashSet<Vec<u8>>>();
let to_make = to_make.lines().map(|x| x.bytes().collect::<Vec<u8>>());
let mut count = 0;
for pattern in to_make {
count += test(&towels, &pattern) as i64;
}
count
}
fn test(towels: &FxHashSet<Vec<u8>>, pattern: &[u8]) -> bool {
let n = pattern.len();
let mut dp = vec![false; n + 1];
dp[0] = true;
for i in 1..n+1 {
for j in 0..i {
if dp[j] && towels.contains(&pattern[j..i]) {
dp[i] = true;
break;
}
}
}
dp[n]
}
fn main() {
for input in INPUTS.iter() {
println!("answer = {}", run(input));
}
}
#[bench]
fn part1(b: &mut test::Bencher) {
b.iter(|| {
let v = run(INPUTS[1]);
test::black_box(v);
});
}

61
src/day19/2.rs Normal file
View File

@ -0,0 +1,61 @@
#![feature(test)]
extern crate test;
use fxhash::FxHashSet;
const INPUTS: [&str; 2] = [
"r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb",
include_str!("./input.txt"),
];
pub fn run(input: &str) -> i64 {
let (towels, to_make) = input.split_once("\n\n").unwrap();
let towels = towels.split(", ").map(|x| x.bytes().collect::<Vec<u8>>()).collect::<FxHashSet<Vec<u8>>>();
let to_make = to_make.lines().map(|x| x.bytes().collect::<Vec<u8>>());
let mut count = 0;
for pattern in to_make {
let sum = test(&towels, &pattern);
count += sum;
}
count
}
fn test(towels: &FxHashSet<Vec<u8>>, pattern: &[u8]) -> i64 {
let n = pattern.len();
let mut dp = vec![0; n + 1];
dp[0] = 1; // only 1 way to make an empty string
for i in 1..n+1 {
for j in 0..i {
if towels.contains(&pattern[j..i]) {
dp[i] += dp[j];
}
}
}
dp[n]
}
fn main() {
for input in INPUTS.iter() {
println!("answer = {}", run(input));
}
}
#[bench]
fn part1(b: &mut test::Bencher) {
b.iter(|| {
let v = run(INPUTS[1]);
test::black_box(v);
});
}