Rust Day 6 - Another solution
This commit is contained in:
parent
24f05860a2
commit
24b28937f9
4 changed files with 105 additions and 17 deletions
|
@ -12,6 +12,12 @@ mod part_2;
|
||||||
mod solutions;
|
mod solutions;
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
println!("Part 1: {}", solve_vertesians_nodeps_const::<4>(INPUT));
|
println!(
|
||||||
println!("Part 2: {}", solve_vertesians_nodeps_const::<14>(INPUT));
|
"Part 1: {}",
|
||||||
|
solve_nicopap_vertesians_nodeps_const::<4>(INPUT)
|
||||||
|
);
|
||||||
|
println!(
|
||||||
|
"Part 2: {}",
|
||||||
|
solve_nicopap_vertesians_nodeps_const::<14>(INPUT)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -287,23 +287,46 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_vertesians_nodeps_const(bencher: &mut test::Bencher) {
|
fn bench_nicopap_vertesians_nodeps_const(bencher: &mut test::Bencher) {
|
||||||
bencher.iter(|| solve_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT));
|
bencher.iter(|| solve_nicopap_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vertesians_nodeps_const_with_solution() {
|
fn test_nicopap_vertesians_nodeps_const_with_solution() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
solve_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT),
|
solve_nicopap_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT),
|
||||||
1723
|
1723
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vertesians_nodeps_const_with_sample_solutions() {
|
fn test_nicopap_vertesians_nodeps_const_with_sample_solutions() {
|
||||||
for (sample_input, sample_answer) in SAMPLES {
|
for (sample_input, sample_answer) in SAMPLES {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
solve_vertesians_nodeps_const::<WINDOW_SIZE>(sample_input),
|
solve_nicopap_vertesians_nodeps_const::<WINDOW_SIZE>(sample_input),
|
||||||
|
sample_answer
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_vertesians_3_1(bencher: &mut test::Bencher) {
|
||||||
|
bencher.iter(|| solve_vertesians_nodeps_3_1::<WINDOW_SIZE>(crate::INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_vertesians_3_1_with_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
solve_vertesians_nodeps_3_1::<WINDOW_SIZE>(crate::INPUT),
|
||||||
|
1723
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_vertesians_3_1_with_sample_solutions() {
|
||||||
|
for (sample_input, sample_answer) in SAMPLES {
|
||||||
|
assert_eq!(
|
||||||
|
solve_vertesians_nodeps_3_1::<WINDOW_SIZE>(sample_input),
|
||||||
sample_answer
|
sample_answer
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -287,23 +287,46 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_vertesians_nodeps_const(bencher: &mut test::Bencher) {
|
fn bench_nicopap_vertesians_nodeps_const(bencher: &mut test::Bencher) {
|
||||||
bencher.iter(|| solve_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT));
|
bencher.iter(|| solve_nicopap_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vertesians_nodeps_const_with_solution() {
|
fn test_nicopap_vertesians_nodeps_const_with_solution() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
solve_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT),
|
solve_nicopap_vertesians_nodeps_const::<WINDOW_SIZE>(crate::INPUT),
|
||||||
3708
|
3708
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vertesians_nodeps_const_with_sample_solutions() {
|
fn test_nicopap_vertesians_nodeps_const_with_sample_solutions() {
|
||||||
for (sample_input, sample_answer) in SAMPLES {
|
for (sample_input, sample_answer) in SAMPLES {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
solve_vertesians_nodeps_const::<WINDOW_SIZE>(sample_input),
|
solve_nicopap_vertesians_nodeps_const::<WINDOW_SIZE>(sample_input),
|
||||||
|
sample_answer
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_vertesians_3_1(bencher: &mut test::Bencher) {
|
||||||
|
bencher.iter(|| solve_vertesians_nodeps_3_1::<WINDOW_SIZE>(crate::INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_vertesians_3_1_with_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
solve_vertesians_nodeps_3_1::<WINDOW_SIZE>(crate::INPUT),
|
||||||
|
3708
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_vertesians_3_1_with_sample_solutions() {
|
||||||
|
for (sample_input, sample_answer) in SAMPLES {
|
||||||
|
assert_eq!(
|
||||||
|
solve_vertesians_nodeps_3_1::<WINDOW_SIZE>(sample_input),
|
||||||
sample_answer
|
sample_answer
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -482,17 +482,17 @@ mod vertesians_nodeps_improved {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const fn solve_vertesians_nodeps_const<const N: usize>(input: &'static str) -> usize {
|
pub const fn solve_nicopap_vertesians_nodeps_const<const N: usize>(input: &'static str) -> usize {
|
||||||
// For 0ns results
|
// For 0ns results
|
||||||
// match N {
|
// match N {
|
||||||
// 4 => nicopap_vertesians_const::RESULT_PART_1,
|
// 4 => nicopap_vertesians_const::RESULT_PART_1,
|
||||||
// 14 => nicopap_vertesians_const::RESULT_PART_2,
|
// 14 => nicopap_vertesians_const::RESULT_PART_2,
|
||||||
// _ => unreachable!(),
|
// _ => unreachable!(),
|
||||||
// }
|
// }
|
||||||
nicopap_vertesians_const::process::<N>(input.as_bytes())
|
nicopap_vertesians_nodeps_const::process::<N>(input.as_bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
mod nicopap_vertesians_const {
|
mod nicopap_vertesians_nodeps_const {
|
||||||
pub(super) const RESULT_PART_1: usize = process::<4>(include_bytes!("./input.txt"));
|
pub(super) const RESULT_PART_1: usize = process::<4>(include_bytes!("./input.txt"));
|
||||||
pub(super) const RESULT_PART_2: usize = process::<14>(include_bytes!("./input.txt"));
|
pub(super) const RESULT_PART_2: usize = process::<14>(include_bytes!("./input.txt"));
|
||||||
|
|
||||||
|
@ -526,3 +526,39 @@ mod nicopap_vertesians_const {
|
||||||
flipped_count == (N as u32)
|
flipped_count == (N as u32)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn solve_vertesians_nodeps_3_1<const N: usize>(input: &'static str) -> usize {
|
||||||
|
vertesians_nodeps_3_1::main::<N>(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
mod vertesians_nodeps_3_1 {
|
||||||
|
pub(super) fn main<const N: usize>(input: &'static str) -> usize {
|
||||||
|
let data = input
|
||||||
|
.chars()
|
||||||
|
.map(|c| 1 << (c as u32 - 0x61))
|
||||||
|
.collect::<Vec<u32>>();
|
||||||
|
|
||||||
|
assert!(!data.is_empty(), "Received empty input");
|
||||||
|
|
||||||
|
process::<N>(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process<const N: usize>(data: Vec<u32>) -> usize {
|
||||||
|
for counter in 0.. {
|
||||||
|
let combined = {
|
||||||
|
let mut combined = 0;
|
||||||
|
for i in 0..N {
|
||||||
|
combined |= data[counter + i];
|
||||||
|
}
|
||||||
|
combined
|
||||||
|
};
|
||||||
|
|
||||||
|
// Thanks to Gibonius for the suggestion to use u32::count_ones()
|
||||||
|
if combined.count_ones() == N as u32 {
|
||||||
|
return counter + N;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
panic!("No valid sequence found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue