Day 11 part 1.
This commit is contained in:
76
src/day11.rs
Normal file
76
src/day11.rs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
use aoc_runner_derive::aoc;
|
||||||
|
|
||||||
|
#[aoc(day11, part1)]
|
||||||
|
fn part1(input: &str) -> String {
|
||||||
|
PasswordCounter::from(input.to_owned()).find(|p| {
|
||||||
|
let r1 = rule1(&p);
|
||||||
|
let r2 = rule2(&p);
|
||||||
|
let r3 = rule3(&p);
|
||||||
|
r1 && r2 && r3
|
||||||
|
}).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rule1(pw: &str) -> bool {
|
||||||
|
let pw = pw.as_bytes();
|
||||||
|
for i in 0..pw.len() - 2 {
|
||||||
|
if pw[i + 1] == pw[i] + 1 && pw[i + 2] == pw[i] + 2 {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rule2(pw: &str) -> bool {
|
||||||
|
!pw.contains(['i', 'o', 'l'])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rule3(pw: &str) -> bool {
|
||||||
|
let mut pair_one = None;
|
||||||
|
let pw = pw.as_bytes();
|
||||||
|
for i in 0..pw.len() - 1 {
|
||||||
|
if pw[i] == pw[i + 1] {
|
||||||
|
if let Some(b) = pair_one {
|
||||||
|
if b != pw[i] {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pair_one = Some(pw[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
struct PasswordCounter {
|
||||||
|
current: [u8; 8],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PasswordCounter {
|
||||||
|
fn from(seed: String) -> Self {
|
||||||
|
let mut current = [0u8; 8];
|
||||||
|
for i in 0..8 {
|
||||||
|
current[i] = seed.as_bytes()[i];
|
||||||
|
}
|
||||||
|
PasswordCounter { current }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for PasswordCounter {
|
||||||
|
type Item = String;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
let pw = &mut self.current;
|
||||||
|
for i in (0..pw.len()).rev() {
|
||||||
|
pw[i] += 1;
|
||||||
|
if pw[i] != b'z' + 1 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pw[i] = b'a';
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(String::from_iter(self.current.iter().map(|b| *b as char)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {}
|
||||||
@@ -3,5 +3,6 @@ extern crate aoc_runner;
|
|||||||
extern crate aoc_runner_derive;
|
extern crate aoc_runner_derive;
|
||||||
|
|
||||||
mod day10;
|
mod day10;
|
||||||
|
mod day11;
|
||||||
|
|
||||||
aoc_lib! { year = 2015 }
|
aoc_lib! { year = 2015 }
|
||||||
|
|||||||
Reference in New Issue
Block a user