-
Notifications
You must be signed in to change notification settings - Fork 1
/
day04.jl
62 lines (56 loc) · 1.9 KB
/
day04.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
module Day04
using AdventOfCode2020
function day04(input::String = readInput(joinpath(@__DIR__, "..", "data", "day04.txt")))
data = parse_input(input)
return [part1(data), part2(data)]
end
function parse_input(input::String)
data = []
d = Dict{String,String}()
for line in split(input, '\n')
if isempty(line)
push!(data, d)
d = Dict{String,String}()
continue
end
for elem in split(line)
k, v = split(elem, ':')
d[k] = v
end
end
return data
end
function part1(data)
required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"]
nvalid = 0
for elem in data
invalid = false
for rf in required_fields
if !haskey(elem, rf)
invalid = true
break
end
end
!invalid ? nvalid += 1 : nothing
end
return nvalid
end
function part2(data)
required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"]
nvalid = 0
for elem in data
(!haskey(elem, "byr") || !(1920 <= parse(Int, elem["byr"]) <= 2002)) && continue
(!haskey(elem, "iyr") || !(2010 <= parse(Int, elem["iyr"]) <= 2020)) && continue
(!haskey(elem, "eyr") || !(2020 <= parse(Int, elem["eyr"]) <= 2030)) && continue
(!haskey(elem, "hgt") || !occursin(r"^\d+cm|in$", elem["hgt"])) && continue
m = match(r"(\d+)(cm|in)", elem["hgt"])
m[2] == "cm" && !(150 <= parse(Int, m[1]) <= 193) && continue
m[2] == "in" && !(59 <= parse(Int, m[1]) <= 76) && continue
(!haskey(elem, "hcl") || !occursin(r"^#[0-9a-f]{6}$", elem["hcl"])) && continue
(!haskey(elem, "ecl") || !occursin(r"^amb|blu|brn|gry|grn|hzl|oth$", elem["ecl"])) && continue
(!haskey(elem, "pid") || !occursin(r"^\d{9}$", elem["pid"])) && continue
nvalid += 1
end
return nvalid
end
end # module