|
|
|
@ -23,10 +23,10 @@ hcl:#cfa07d eyr:2025 pid:166559648
|
|
|
|
|
iyr:2011 ecl:brn hgt:59in
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use crate::Problem;
|
|
|
|
|
use std::num::ParseIntError;
|
|
|
|
|
use std::str::FromStr;
|
|
|
|
|
use std::num::{ParseIntError};
|
|
|
|
|
|
|
|
|
|
use crate::Problem;
|
|
|
|
|
|
|
|
|
|
struct Passport {
|
|
|
|
|
byr: String,
|
|
|
|
@ -40,112 +40,140 @@ struct Passport {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn parse_from_string(s: &str) -> Option<Passport> {
|
|
|
|
|
|
|
|
|
|
let f_i : fn(&str, &str) -> Option<Result<i64, ParseIntError>> = |key, glob| {
|
|
|
|
|
let f_i: fn(&str, &str) -> Option<Result<i64, ParseIntError>> = |key, glob| {
|
|
|
|
|
let mut i = glob.split(" ");
|
|
|
|
|
for pair in i {
|
|
|
|
|
let mut i = pair.split(":");
|
|
|
|
|
if i.next().unwrap() == key {
|
|
|
|
|
let q = i.next().unwrap();
|
|
|
|
|
return Some(q.parse::<i64>())
|
|
|
|
|
return Some(q.parse::<i64>());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let f_s : fn(&str, &str) -> Option<String> = |key, glob| {
|
|
|
|
|
let f_s: fn(&str, &str) -> Option<String> = |key, glob| {
|
|
|
|
|
let mut i = glob.split(" ");
|
|
|
|
|
for pair in i {
|
|
|
|
|
let mut i = pair.split(":");
|
|
|
|
|
if i.next().unwrap() == key {
|
|
|
|
|
|
|
|
|
|
let q = i.next().unwrap();
|
|
|
|
|
return Some(q.to_string())
|
|
|
|
|
return Some(q.to_string());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// let byr = match f_i("byr", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { match v {
|
|
|
|
|
// Ok(v) => { v }
|
|
|
|
|
// Err(e) => { return None }
|
|
|
|
|
// }}
|
|
|
|
|
// };
|
|
|
|
|
// let iyr = match f_i("iyr", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { match v {
|
|
|
|
|
// Ok(v) => { v }
|
|
|
|
|
// Err(e) => { return None }
|
|
|
|
|
// }}
|
|
|
|
|
// };
|
|
|
|
|
// let eyr = match f_i("eyr", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { match v {
|
|
|
|
|
// Ok(v) => { v }
|
|
|
|
|
// Err(e) => { return None }
|
|
|
|
|
// }}
|
|
|
|
|
// };
|
|
|
|
|
// let hgt = match f_s("hgt", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { v }
|
|
|
|
|
// };
|
|
|
|
|
// let hcl = match f_s("hcl", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { v }
|
|
|
|
|
// };
|
|
|
|
|
// let ecl = match f_s("ecl", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { v }
|
|
|
|
|
// };
|
|
|
|
|
// let pid = match f_i("pid", s) {
|
|
|
|
|
// None => { return None }
|
|
|
|
|
// Some(v) => { match v {
|
|
|
|
|
// Ok(v) => { v }
|
|
|
|
|
// Err(e) => { return None }
|
|
|
|
|
// }}
|
|
|
|
|
// };
|
|
|
|
|
// let cid = match f_i("cid", s) {
|
|
|
|
|
// None => { None }
|
|
|
|
|
// Some(v) => { match v {
|
|
|
|
|
// Ok(v) => { Some(v) }
|
|
|
|
|
// Err(e) => { None }
|
|
|
|
|
// }}
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
let byr = match f_s("byr", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
};
|
|
|
|
|
let iyr = match f_s("iyr", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
let byr = match f_i("byr", s) {
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
match v {
|
|
|
|
|
Ok(v) => {
|
|
|
|
|
if v >= 1920 && v <= 2002 {
|
|
|
|
|
v.to_string()
|
|
|
|
|
} else {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Err(e) => { return None; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let eyr = match f_s("eyr", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
let iyr = match f_i("iyr", s) {
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
match v {
|
|
|
|
|
Ok(v) => {
|
|
|
|
|
if v >= 2010 && v <= 2020 {
|
|
|
|
|
v.to_string()
|
|
|
|
|
} else {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Err(e) => { return None; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let eyr = match f_s("eyr", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
let eyr = match f_i("eyr", s) {
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
match v {
|
|
|
|
|
Ok(v) => {
|
|
|
|
|
if v >= 2020 && v <= 2030 {
|
|
|
|
|
v.to_string()
|
|
|
|
|
} else {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Err(e) => { return None; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let hgt = match f_s("hgt", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
if v.find("cm").is_some() {
|
|
|
|
|
let height = v.split("cm").next().unwrap().parse::<i32>().unwrap();
|
|
|
|
|
if height >= 150 && height <= 193 {
|
|
|
|
|
v
|
|
|
|
|
} else {
|
|
|
|
|
//println!("height {}", height);
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
} else if v.find("in").is_some() {
|
|
|
|
|
let height = v.split("in").next().unwrap().parse::<i32>().unwrap();
|
|
|
|
|
if height >= 59 && height <= 76 {
|
|
|
|
|
v
|
|
|
|
|
} else {
|
|
|
|
|
// println!("height {}", height);
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
} else { return None; }
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let hcl = match f_s("hcl", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
if v.starts_with("#") &&
|
|
|
|
|
v[1..].len() == 6 &&
|
|
|
|
|
v[1..].chars().all(|s| {
|
|
|
|
|
if s >= '0' && s <= '9' ||
|
|
|
|
|
s >= 'a' && s <= 'f' {
|
|
|
|
|
true
|
|
|
|
|
} else {
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
}) {
|
|
|
|
|
v
|
|
|
|
|
} else {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let ecl = match f_s("ecl", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
if v == "amb" ||
|
|
|
|
|
v == "blu" ||
|
|
|
|
|
v == "brn" ||
|
|
|
|
|
v == "gry" ||
|
|
|
|
|
v == "grn" ||
|
|
|
|
|
v == "hzl" ||
|
|
|
|
|
v == "oth" {
|
|
|
|
|
v
|
|
|
|
|
} else {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let pid = match f_s("pid", s) {
|
|
|
|
|
None => { return None }
|
|
|
|
|
Some(v) => { v }
|
|
|
|
|
None => { return None; }
|
|
|
|
|
Some(v) => {
|
|
|
|
|
if v.chars().all(char::is_numeric) && v.len() == 9
|
|
|
|
|
{ v } else { return None; }
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let cid = match f_s("cid", s) {
|
|
|
|
|
None => { None }
|
|
|
|
|
Some(v) => { Some(v) }
|
|
|
|
@ -178,8 +206,12 @@ impl Problem for Problem4 {
|
|
|
|
|
let s = s.trim().replace("\n", " ");
|
|
|
|
|
if !s.is_empty() {
|
|
|
|
|
match parse_from_string(s.as_str()) {
|
|
|
|
|
None => {println!("{}", s); None}
|
|
|
|
|
Some(v) => {Some(v)}
|
|
|
|
|
None => {
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
Some(v) => {
|
|
|
|
|
println!("{}", s);
|
|
|
|
|
Some(v) }
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|