advent_of_code/elixir/lib/aoc.ex

39 lines
1.3 KiB
Elixir

defmodule AoC do
defp get_session!(), do: File.read!("./.session") |> String.trim()
defp get_request_headers!(), do: [Cookie: "session=#{get_session!()}"]
def fetch_input!(year, day) do
Req.get!(
"https://adventofcode.com/#{year}/day/#{day}/input",
headers: get_request_headers!()
)
|> Map.get(:body)
end
def fetch_reportcard!(year) do
import Enum, only: [sort_by: 2, at: 2]
import String, only: [split: 2, trim: 1, contains?: 2, to_integer: 1]
day_class = fn classes -> classes |> split(" ") |> at(0) |> split("-") |> at(1) |> trim() end
days_complete = fn classes ->
cond do
contains?(classes, "verycomplete") -> 2
contains?(classes, "complete") -> 1
true -> 0
end
end
session = get_session!()
Req.get!("https://adventofcode.com/#{year}", headers: [cookie: "session=#{session}"]).body
|> Floki.parse_document!(html_parser: Floki.HTMLParser.Html5ever)
|> Floki.find("pre.calendar > a")
|> Stream.map(fn e ->
"#{Floki.attribute(e, "class")}\n"
end)
|> Stream.map(fn classes -> {day_class.(classes), days_complete.(classes)} end)
|> Stream.map(fn {day, c} -> {day |> split("day") |> at(1) |> to_integer(), c} end)
|> sort_by(&elem(&1, 0))
end
end