y2015d5
This commit is contained in:
parent
8370d27bea
commit
6c6b50dee0
1000
y2015/resources/5_input.txt
Normal file
1000
y2015/resources/5_input.txt
Normal file
File diff suppressed because it is too large
Load Diff
20
y2015/src/bin/d5.rs
Normal file
20
y2015/src/bin/d5.rs
Normal file
@ -0,0 +1,20 @@
|
||||
use std::fs;
|
||||
|
||||
use y2015::days::d5;
|
||||
|
||||
fn main() {
|
||||
part1();
|
||||
part2();
|
||||
}
|
||||
|
||||
fn part1() {
|
||||
let root = env!("CARGO_MANIFEST_DIR");
|
||||
let content = fs::read_to_string(format!("{root}/resources/5_input.txt")).unwrap();
|
||||
println!("{}", d5::process_part1(&content));
|
||||
}
|
||||
|
||||
fn part2() {
|
||||
let root = env!("CARGO_MANIFEST_DIR");
|
||||
let content = fs::read_to_string(format!("{root}/resources/5_input.txt")).unwrap();
|
||||
println!("{}", d5::process_part2(&content));
|
||||
}
|
105
y2015/src/days/d5.rs
Normal file
105
y2015/src/days/d5.rs
Normal file
@ -0,0 +1,105 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
const DISALLOWED: [(u8, u8); 4] = [(b'a', b'b'), (b'c', b'd'), (b'p', b'q'), (b'x', b'y')];
|
||||
const VOWELS: [u8; 5] = [b'a', b'e', b'i', b'o', b'u'];
|
||||
|
||||
pub fn process_part1(input: &str) -> i32 {
|
||||
input
|
||||
.lines()
|
||||
.map(|line| line.as_bytes())
|
||||
.map(|line| {
|
||||
let mut num_vowels = 0;
|
||||
let mut has_double = false;
|
||||
if VOWELS.contains(&line[0]) {
|
||||
num_vowels += 1;
|
||||
}
|
||||
for window in line.windows(2) {
|
||||
if DISALLOWED.contains(&(window[0], window[1])) {
|
||||
return 0;
|
||||
}
|
||||
if window[0] == window[1] {
|
||||
has_double = true;
|
||||
}
|
||||
if VOWELS.contains(&window[1]) {
|
||||
num_vowels += 1;
|
||||
}
|
||||
}
|
||||
if num_vowels >= 3 && has_double {
|
||||
return 1;
|
||||
}
|
||||
0
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
|
||||
// used the following solution to debug
|
||||
// cat input | grep "\(..\).*\1" | grep "\(.\).\1" | wc -l
|
||||
pub fn process_part2(input: &str) -> i32 {
|
||||
input
|
||||
.lines()
|
||||
.map(|line| line.as_bytes())
|
||||
.map(|line| {
|
||||
let mut pairs = HashMap::new();
|
||||
let mut has_sandwich = false;
|
||||
for window in line.windows(3) {
|
||||
if window[0] == window[2] {
|
||||
has_sandwich = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if !has_sandwich {
|
||||
return 0;
|
||||
}
|
||||
let mut last_pair = "".to_string();
|
||||
let mut is_valid = true;
|
||||
for window in line.windows(2) {
|
||||
let pair = String::from_utf8(window.to_vec()).unwrap();
|
||||
if pair == last_pair && is_valid {
|
||||
is_valid = false;
|
||||
continue;
|
||||
}
|
||||
is_valid = true;
|
||||
pairs
|
||||
.entry(pair.clone())
|
||||
.and_modify(|counter| *counter += 1)
|
||||
.or_insert(1);
|
||||
last_pair = pair;
|
||||
}
|
||||
for (_, count) in pairs.into_iter() {
|
||||
if count >= 2 {
|
||||
println!("{}", String::from_utf8(line.to_vec()).unwrap());
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
0
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests_5 {
|
||||
use super::*;
|
||||
|
||||
const INPUT1: &str = "ugknbfddgicrmopn
|
||||
aaa
|
||||
jchzalrnumimnmhp
|
||||
haegwjzuvuyypxyu
|
||||
dvszwmarrgswjxmb";
|
||||
|
||||
#[test]
|
||||
fn it_works() {
|
||||
let result = process_part1(INPUT1);
|
||||
assert_eq!(result, 2);
|
||||
}
|
||||
|
||||
const INPUT2: &str = "qjhvhtzxzqqjkmpb
|
||||
xxyxx
|
||||
uurcxstgmygtbstg
|
||||
ieodomkazucvgmuy";
|
||||
|
||||
#[test]
|
||||
fn part2() {
|
||||
let result = process_part2(INPUT2);
|
||||
assert_eq!(result, 2);
|
||||
}
|
||||
}
|
@ -2,3 +2,4 @@ pub mod d1;
|
||||
pub mod d2;
|
||||
pub mod d3;
|
||||
pub mod d4;
|
||||
pub mod d5;
|
||||
|
Loading…
Reference in New Issue
Block a user