From cfa5b4b9292080972da2f9743eb72b748e6a8564 Mon Sep 17 00:00:00 2001 From: Jeremy Kaplan Date: Thu, 3 Dec 2020 22:03:13 -0800 Subject: [PATCH] Day 4 Part 2 --- 2020/day4/day4.ex | 63 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/2020/day4/day4.ex b/2020/day4/day4.ex index 0103866..02629ea 100644 --- a/2020/day4/day4.ex +++ b/2020/day4/day4.ex @@ -27,7 +27,7 @@ defmodule Day4 do # "cid" ] - defp valid?(passport) do + defp all_fields?(passport) do Enum.all?(@required_fields, fn field -> case Map.fetch(passport, field) do {:ok, _val} -> true @@ -36,7 +36,67 @@ defmodule Day4 do end) end + defp parse_int(val, default) do + try do + String.to_integer(val) + rescue + ArgumentError -> default + end + end + + defp valid?(passport) do + validators = %{ + "byr" => fn val -> + int = parse_int(val, 0) + 1920 <= int && int <= 2002 + end, + "iyr" => fn val -> + int = parse_int(val, 0) + 2010 <= int && int <= 2020 + end, + "eyr" => fn val -> + int = parse_int(val, 0) + 2020 <= int && int <= 2030 + end, + "hgt" => fn val -> + case Regex.named_captures(~r/^(?\d+)(?cm|in)$/, val) do + %{"num" => num, "units" => units} -> + int = parse_int(num, 0) + + case units do + "cm" -> + 150 <= int && int <= 193 + + "in" -> + 59 <= int && int <= 76 + end + + _ -> + false + end + end, + "hcl" => fn val -> Regex.match?(~r/^#[0-9a-f]{6}$/, val) end, + "ecl" => fn val -> Enum.member?(["amb", "blu", "brn", "gry", "grn", "hzl", "oth"], val) end, + "pid" => fn val -> Regex.match?(~r/^[0-9]{9}$/, val) end + # cid + } + + Map.to_list(validators) + |> Enum.all?(fn {field, validator} -> + case Map.get(passport, field) do + nil -> false + val -> validator.(val) + end + end) + end + def part1 do + read_input() + |> parse_passports() + |> Enum.count(&all_fields?/1) + end + + def part2 do read_input() |> parse_passports() |> Enum.count(&valid?/1) @@ -44,3 +104,4 @@ defmodule Day4 do end Day4.part1() |> IO.inspect() +Day4.part2() |> IO.inspect()