Aetherus
Advent of Code 2020 - Day 4
This topic is about Day 4 of the Advent of Code 2020 .
Thanks to @egze, we have a private leaderboard:
https://adventofcode.com/2020/leaderboard/private/view/39276
The join code is:
39276-eeb74f9a
Most Liked
aaronnamba
Observations:
- Woof, data validation… kinda tedious. A lot like work, and I do AoC to take a break from work…
- I anticipated having to look up things, so I parsed into a map, but that ended up being entirely unnecessary.
- Thank goodness for pattern matching.
Excerpt:
def all_fields_valid?(record) do
Enum.all?(record, fn {field, value} -> valid?(field, value) end)
end
def valid?(field, year) when field in ["byr", "eyr", "iyr"] and is_binary(year),
do: valid?(field, String.to_integer(year))
def valid?("byr", year) when year in 1920..2002, do: true
def valid?("iyr", year) when year in 2010..2020, do: true
def valid?("eyr", year) when year in 2020..2030, do: true
def valid?("hgt", {cm, "cm"}) when cm in 150..193, do: true
def valid?("hgt", {inch, "in"}) when inch in 59..76, do: true
def valid?("hgt", {_, _}), do: false
def valid?("hgt", height), do: valid?("hgt", Integer.parse(height))
def valid?("hcl", color), do: Regex.match?(~r/^#[0-9a-f]{6}$/, color)
def valid?("ecl", color) when color in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"],
do: true
def valid?("pid", pid), do: Regex.match?(~r/^[0-9]{9}$/, pid)
def valid?("cid", _), do: true
def valid?(_, _), do: false
5
Aetherus
A straightforward solution for Part 2:
#!/usr/bin/env elixir
defmodule Validator do
def valid?({"byr", value}) do
value
|> String.to_integer()
|> Kernel.in(1920..2002)
end
def valid?({"iyr", value}) do
value
|> String.to_integer()
|> Kernel.in(2010..2020)
end
def valid?({"eyr", value}) do
value
|> String.to_integer()
|> Kernel.in(2020..2030)
end
def valid?({"hgt", value}) do
case String.split(value, ~r/(?<=\d)(?=[a-z])/) do
[num, unit] ->
valid_height?(String.to_integer(num), unit)
_ -> false
end
end
def valid?({"hcl", value}) do
value =~ ~r/^\#[0-9a-f]{6}$/
end
def valid?({"ecl", value}) do
value in ~w[amb blu brn gry grn hzl oth]
end
def valid?({"pid", value}) do
value =~ ~r/^\d{9}$/
end
def valid?({_key, _value}) do
true
end
defp valid_height?(num, "cm"), do: num in (150..193)
defp valid_height?(num, "in"), do: num in (59..76)
defp valid_height?(_, _), do: false
end
required_fields = ~w[
byr
iyr
eyr
hgt
hcl
ecl
pid
]
to_passport = fn(fields)->
fields
|> Stream.map(&String.split(&1, ":"))
|> Stream.map(&List.to_tuple/1)
|> Map.new()
end
valid? = fn(passport)->
has_all_required_keys? = Enum.all?(required_fields, &Map.has_key?(passport, &1))
all_values_are_valid? = Enum.all?(passport, &Validator.valid?/1)
has_all_required_keys? and all_values_are_valid?
end
"day4.txt"
|> File.read!()
|> String.split("\n\n")
|> Stream.map(&String.split/1)
|> Enum.map(to_passport)
|> Enum.count(valid?)
|> IO.puts()
4
Damirados
As this is typical day to day work I just imported Ecto in my solution
2
NobbZ
Very slowly catching up!
2
aaronnamba
I see some pattern matching in there, but you could do a lot more of it. Also, Integer.parse is your friend on the height field.
1
Popular in Challenges
This topic is about Day 14 of the Advent of Code 2020 .
Thanks to @egze, we have a private leaderboard:
https://adventofcode.com/2020/l...
New
Note by the Moderators: This topic is to talk about the Day 2 of the Advent of Code.
For general discussion about the Advent of Code 201...
New
Today is a brute-force day: advent-of-code-2024/lib/advent_of_code2024/day6.ex at main · ibarakaiev/advent-of-code-2024 · GitHub
Takes a...
New
Note by the Moderators: This topic is to talk about Day 6 of the Advent of Code.
For general discussion about the Advent of Code 2018 an...
New
Note: This topic is to talk about Day 10 of the Advent of Code 2019 .
There is a private leaderboard for elixirforum members. You can jo...
New
Continuation of Advent of Code 2022:christmas_tree:, Day 1:
Day 2!
Leaderboard:
New
Note: This topic is to talk about Day 23 of the Advent of Code.
For general discussion about the Advent of Code 2018 and links to topics...
New
This topic is about Day 2 of the Advent of Code 2021.
We have a private leaderboard (shared with users of Erlang Forums):
https://adven...
New
Note by the Moderators: This topic is for general discussion about the Advent of Code 2018.
To prevent people from being spoiled about s...
New
Hello all, hopefully I post this before someone else does and I don’t dupe.
IMO Day 4 was much easier than Day 3 (yay, I can sleep befor...
New
Other popular topics
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
Manning 2016 Halloween weekend sale via Deal of the Day
Friday, October 28 - Half off all MEAPs - code WM102816LT
Saturday, October 29 ...
New
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
15:22:35.803 [error] gen_event {lager_file_backend...
New
Good day to you all.
I have been struggling to get a query involving like and ilike to work.
Can anyone assist me on this, please?
pro...
New
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode.
The solution seems to be, in a hyphena...
New
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
Hi,
I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
Hi,
I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New








