Day 05: Doesn’t He Have Intern-Elves For This?

Loading code...

use std::char;

fn parse_input (input: &str) -> impl Iterator<Item = Vec<char>> + '_ {
	return input.lines().map(|x| x.chars().collect::<Vec<_>>())
}

fn count_vowels (line: &Vec<char>) -> usize {
	let vowels = ['a', 'e', 'i', 'o', 'u'];
	
	return line.iter()
		.map(|x| if vowels.contains(x) { 1 } else { 0 })
		.sum();
}

fn contains_letter_pair (line: &Vec<char>) -> bool {
	for i in 1..line.len() {
		if line[i - 1] == line[i] { return true; }
	}
	return false;
}

fn contains_bad_string (line: &Vec<char>) -> bool {
	let bad_strings = ["ab", "cd", "pq", "xy"];
	let line = line.iter().collect::<String>();
	return bad_strings.iter().any(|x| line.contains(x));
}

pub fn day_05_1 (input: &str) -> String {
	return parse_input(input)
		.filter(|x| contains_bad_string(x) == false)
		.filter(|x| contains_letter_pair(x) == true)
		.filter(|x| 3 <= count_vowels(x))
		.count()
		.to_string();
}

fn has_double_no_overlap (line: &Vec<char>) -> bool {
	for i in 0..line.len() - 3 {
		for j in (i+2)..line.len() - 1 {
			if line[i] == line[j] && line[i + 1] == line[j + 1] {
				return true;
			}
		}
	}
	return false;
}

fn has_repeat_with_gap (line: &Vec<char>) -> bool {
	for i in 2..line.len() {
		if line[i] == line[i - 2] {
			return true;
		}
	}
	return false;
}

pub fn day_05_2 (input: &str) -> String {
	return parse_input(input)
		.filter(|x| has_repeat_with_gap(x) == true)
		.filter(|x| has_double_no_overlap(x) == true)
		.count()
		.to_string();
}