package main
import "core:os"
import "core:fmt"
import "core:strings"
import "core:strconv"
PassportFields :: enum {
byr, iyr, eyr, hgt, hcl, ecl, pid, cid
}
Passport :: bit_set[PassportFields];
FullPassport :: bit_set[PassportFields] { .byr, .iyr, .eyr, .hgt, .hcl, .ecl, .pid, .cid };
NorthPoleCredentials :: bit_set[PassportFields] { .byr, .iyr, .eyr, .hgt, .hcl, .ecl, .pid };
main :: proc() {
input, err := os.read_entire_file("input.txt");
inputStr := string(input);
lines := strings.split(inputStr, "\n");
passportIndex := 0;
currentPassport := Passport {};
numValid := 0;
for line in lines {
line := strings.trim_space(line);
if line == "" {
// Check if valid
if FullPassport &~ currentPassport == {} || FullPassport &~ currentPassport == { .cid } {
numValid += 1;
}
passportIndex += 1;
currentPassport = {};
} else {
fields := strings.split(line, " ");
for field in fields {
parts := strings.split(field, ":");
kind := parts[0];
value := parts[1];
if kind == "byr" {
num, ok := strconv.parse_int(value);
if ok && num >= 1920 && num <= 2002 {
currentPassport |= { .byr };
}
} else if kind == "iyr" {
num, ok := strconv.parse_int(value);
if ok && num >= 2010 && num <= 2020 {
currentPassport |= { .iyr };
}
} else if kind == "eyr" {
num, ok := strconv.parse_int(value);
if ok && num >= 2020 && num <= 2030 {
currentPassport |= { .eyr };
}
} else if kind == "hgt" {
num, ok := strconv.parse_int(value[0:len(value) - 2]);
if ok && strings.has_suffix(value, "cm") && num >= 150 && num <= 193 {
currentPassport |= { .hgt };
} else if ok && strings.has_suffix(value, "in") && num >= 59 && num <= 76 {
currentPassport |= { .hgt };
}
} else if kind == "hcl" {
if strings.has_prefix(value, "#") && len(value) - 1 == 6 {
currentPassport |= { .hcl };
}
} else if kind == "ecl" {
if value == "amb" || value == "blu" || value == "brn" || value == "gry" || value == "grn" || value == "hzl" || value == "oth" {
currentPassport |= { .ecl };
}
} else if kind == "pid" {
num, ok := strconv.parse_int(value);
if ok && len(value) == 9 {
currentPassport |= { .pid };
}
} else if kind == "cid" {
currentPassport |= { .cid };
}
}
}
}
fmt.printf("Valid: %d\n", numValid);
}