2015 day 11
This commit is contained in:
parent
4beec9475d
commit
471a3064ad
75
2015/src/bin/day11.rs
Normal file
75
2015/src/bin/day11.rs
Normal file
|
@ -0,0 +1,75 @@
|
|||
use aoc::input;
|
||||
|
||||
fn main() {
|
||||
let mut pass = input::read_chars();
|
||||
|
||||
// Part 1
|
||||
get_next_pass(&mut pass);
|
||||
println!("Next pass: {}", pass);
|
||||
|
||||
// Part 2
|
||||
get_next_pass(&mut pass);
|
||||
println!("Next pass: {}", pass);
|
||||
}
|
||||
|
||||
fn get_next_pass(pass: &mut String) {
|
||||
loop {
|
||||
unsafe { inc(pass.as_bytes_mut()) }
|
||||
let pb = pass.as_bytes();
|
||||
if has_seq(pb) && !has_banned_chars(pb) && has_pairs(&pass) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn has_seq(pass: &[u8]) -> bool {
|
||||
for i in 0..(pass.len() - 2) {
|
||||
if pass[i] == pass[i + 1] - 1 && pass[i + 1] == pass[i + 2] - 1 {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn has_banned_chars(pass: &[u8]) -> bool {
|
||||
for b in b"iol".iter() {
|
||||
if pass.contains(b) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn has_pairs(pass: &str) -> bool {
|
||||
let mut num_pairs = 0;
|
||||
let mut pc = ' ';
|
||||
let mut skip_next = false;
|
||||
for c in pass.chars() {
|
||||
if skip_next {
|
||||
skip_next = false;
|
||||
pc = c;
|
||||
continue
|
||||
}
|
||||
if c == pc {
|
||||
num_pairs += 1;
|
||||
skip_next = true;
|
||||
}
|
||||
pc = c;
|
||||
}
|
||||
num_pairs >= 2
|
||||
}
|
||||
|
||||
fn inc(pass: &mut [u8]) {
|
||||
let mut i = pass.len() - 1;
|
||||
loop {
|
||||
let lc = pass[i];
|
||||
if lc < b'z' {
|
||||
let offset = if lc == b'i' || lc == b'o' || lc == b'l' { 2 } else { 1 };
|
||||
pass[i] = pass[i] + offset;
|
||||
break;
|
||||
} else {
|
||||
pass[i] = b'a';
|
||||
i -= 1;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue