Day 4 Part 2
This commit is contained in:
parent
755142de86
commit
cfa5b4b929
1 changed files with 62 additions and 1 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue