a shitty day4 attempt

main
Ray Slakinski 2020-12-05 08:24:23 -05:00
parent 986a35d0fc
commit e9bc83227e
5 changed files with 1258 additions and 0 deletions

View File

@ -0,0 +1,10 @@
[package]
name = "day_4"
version = "0.1.0"
authors = ["Ray Slakinski <ray.slakinski@gmail.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
scan_fmt = "0.2.5"

1070
2020/day_4/input 100644

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,137 @@
use std::{collections::BTreeMap, println};
#[macro_use]
extern crate scan_fmt;
fn main() {
let required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"];
let contents = std::fs::read_to_string("input").unwrap();
let mut d = BTreeMap::new();
let mut valid_count = 0;
for line in contents.lines() {
if line.len() > 0 {
let seg = line.split(" ");
for s in seg {
let kv: Vec<_> = s.split(":").collect();
d.insert(kv[0].to_string(), kv[1].to_string());
}
} else {
let mut approved = true;
for field in required_fields.iter() {
if !d.contains_key(field.to_string().as_str()) {
println!("Didn't find key {}", field);
approved = false;
}
}
for (key, val) in &d {
if !approved {
println!("Not Approved! {:?}", d);
break;
}
match key.as_str() {
"byr" => {
let byr = val.parse::<i32>().unwrap();
let minmax = 1920..=2002;
if !minmax.contains(&byr) {
approved = false;
}
}
"iyr" => {
let iyr = val.parse::<i32>().unwrap();
let minmax = 2010..=2020;
if !minmax.contains(&iyr) {
approved = false;
}
}
"eyr" => {
let eyr = val.parse::<i32>().unwrap();
let minmax = 2020..=2030;
if !minmax.contains(&eyr) {
approved = false;
}
}
"hgt" => {
if let Ok((hgt, unit)) = scan_fmt!(&val, "{d}{}", i32, String) {
match unit.as_str() {
"cm" => {
let minmax = 150..=193;
if !minmax.contains(&hgt) {
approved = false;
}
}
"in" => {
let minmax = 59..=76;
if !minmax.contains(&hgt) {
approved = false;
}
}
_ => {
println!("malformed hgt value: {}:{}", key, val);
approved = false;
}
}
}
}
"hcl" => {
let hcl = scan_fmt!(&val, "#{[0-9a-f]}", String);
match hcl {
Ok(v) => {
if !v.len() == 6 {
approved = false;
}
}
Err(_) => {
println!("malformed hcl value: {}:{}", key, val);
approved = false;
}
}
}
"ecl" => {
let valid_ecl = ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"];
if !valid_ecl.contains(&val.as_str()) {
approved = false;
}
}
"pid" => {
let pid = scan_fmt!(&val, "{[0-9]}", String);
match pid {
Ok(v) => {
if v.len() < 9 || v.len() > 9 {
approved = false;
} else {
println!("pid = {:?} {}", v, v.len());
}
}
Err(_) => {
println!("malformed pid value: {}:{}", key, val);
approved = false;
}
}
}
"cid" => println!("cid"),
_ => approved = false,
}
}
if approved && (d.len() >= 7 && d.len() <= 8) {
valid_count += 1;
// if d.contains_key("cid") {
println!("Approved! {:?}", d);
// }
}
println!("clearing {:?}", d);
d.clear();
}
}
// past guesses:
// 264, <
// 195, <
// 191
// 187
// 186
// 185
// 156
// 152
// 148
// 102
// 78
println!("Found {} approved passports", valid_count - 1);
}

14
2020/day_4/test 100644
View File

@ -0,0 +1,14 @@
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929
hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm
hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in

27
2020/day_4/test2 100644
View File

@ -0,0 +1,27 @@
eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946
hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f
eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719