View Source Advent of Code Utils
Input fetching and boilerplate generation for Advent of Code.
The goal of this project is to eliminate most of the manual labor involved with working on the yearly Advent of Code challenges.
As a sample, this is the workflow you'd use when working on the challenge of the first of December 2020:
$ mix aoc
* Creating: lib/2020/1.ex
* Creating: input/2020_1.txt
* Creating: input/2020_1_example.txt
Today's challenge can be found at: https://adventofcode.com/2020/day/1
Afterwards, lib/2020/1.ex will look as follows:
import AOC
aoc 2020, 1 do
def p1(input) do
end
def p2(input) do
end
endWhile solving your challenge, you can use the AOC.IEx.p1e/1 and
AOC.IEx.p2e/1 helpers in iex to test your solution so far with the example
input. Once ready, you can use AOC.IEx.p1i/1 and AOC.IEx.p2i/1 to run your
solution on your puzzle input. These helpers can also be set up to
automatically recompile your mix project.
All of this is configurable so that you can adjust this project to fit your own
workflow. For instance, you can forego the iex helpers, and instead access
the contents of the fetched input by using input_path/0, input_string/0 or
input_stream/0. Example input is available through example_path/0,
example_string/0 or example_stream/0.
Check out the docs for
more information!
setup-use
Setup & Use
Add
advent_of_code_utilsto your list of dependencies inmix.exs:def deps do [ {:advent_of_code_utils, "~> 3.1"} ] endConfigure your Advent of Code project in
config/config.exs:Store your session cookie in
config/config.exs. You can find this by inspecting your cookies after logging in to the advent of code website.config :advent_of_code_utils, session: "<your cookie>"(Optional) Set
auto_compile?totrueif you want the variousAOC.IEx.p*helpers to recompile your project:config :advent_of_code_utils, auto_compile?: true(Optional) Configure
iexto display charlists as lists. This will prevent lists like[99, 97, 116]to show up as'cat':config :iex, inspect: [charlists: :as_lists]If you follow these steps, your
config/config.exsshould look as follows:import Config config :advent_of_code_utils, auto_compile?: true, session: "<your session cookie>" config :iex, inspect: [charlists: :as_lists]
(Optional) Add
import AOC.IExto your.iex.exsfile. This allows you to use the utilities defined inAOC.IExwithout specifying the module name.(Optional) Add
input/to your.gitignorefile if you use git.
Now that you are set up, you can use mix aoc to work on today's challenge.
The day and year of a challenge can be passed in various ways, so this project
can still be used when working on older challenges.
If you only want to use this application to fetch the input of challenge,
without generating any code, you can use mix aoc.get instead of mix aoc.
Additionally, you can skip most of the optional steps above.
example-input
Example Input
Besides fetching input, mix aoc.get and mix aoc will also fetch example
input for the given day. This is done by reading the first code example on the
challenge webpage, which is generally that day's example input.
Since this method is not 100% reliable, you may you wish to disable this
behaviour. This can be done by passing the --no-example flag to mix aoc or
mix aoc.get or by setting fetch_example to false in your config.exs file.
time-zones
Time Zones
By default, this project uses your system time (as determined by
NaiveDateTime.local_now/0), to determine the current "day". Said otherwise,
if your computer says it is currently the 8th of December, mix aoc.get,
AOC.IEx.p1/2, and other functions which reason about time will assume it is
the 8th day of December. This can be problematic if you live in a time zone
which does not align well with the publication time of the AOC puzzles
(midnight US Eastern Standard Time).
This problem can be solved by setting the time_zone option of
advent_of_code_utils. When this option is set to :aoc, the project will
determine the current day based on EST, the time zone of the advent of code
servers. When it is said to :local (the default), your system time will be
used. Alternatively, a valid time zone string can be supplied, in which case
the project will use determine the current day based on the provided time zone.
# Use the aoc timezone instead of local time
config :advent_of_code_utils, time_zone: :aoc
issues
Issues
This project grew from a collection of utilities I wrote for myself when working on advent of code. I polished these utilities, but it is possible some bugs are still present. If you run into any issue, feel free to create an issue on GitHub.
aoc-automation-guidelines
AoC Automation Guidelines
This tool follows the automation guidelines on the /r/adventofcode community wiki. The following information is intended to specify how we follow these guidelines:
- All code that communicates with the AoC servers is located in
lib/mix/tasks/aoc.get.ex. - This tool only communicates with the AoC servers at the request of the user
(i.e. when they use
mix aoc.getormix aoc). - Fetched inputs are stored locally and are never retrieved again unless the
user deletes the retrieved file manually (
do_if_file_does_not_exist/2). - The
User-Agentheader is set infetch/2and contains my personal contact information and a reference to this repository.