Watch
1
0
Fork
You've already forked advent-of-code
0

Day 4 Part 2

This commit is contained in:
Jeremy Kaplan 2020-12-03 22:03:13 -08:00
commit cfa5b4b929

View file

@ -27,7 +27,7 @@ defmodule Day4 do
# "cid" # "cid"
] ]
defp valid?(passport) do defp all_fields?(passport) do
Enum.all?(@required_fields, fn field -> Enum.all?(@required_fields, fn field ->
case Map.fetch(passport, field) do case Map.fetch(passport, field) do
{:ok, _val} -> true {:ok, _val} -> true
@ -36,7 +36,67 @@ defmodule Day4 do
end) end)
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/^(?<num>\d+)(?<units>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 def part1 do
read_input()
|> parse_passports()
|> Enum.count(&all_fields?/1)
end
def part2 do
read_input() read_input()
|> parse_passports() |> parse_passports()
|> Enum.count(&valid?/1) |> Enum.count(&valid?/1)
@ -44,3 +104,4 @@ defmodule Day4 do
end end
Day4.part1() |> IO.inspect() Day4.part1() |> IO.inspect()
Day4.part2() |> IO.inspect()