Git Product home page Git Product logo

aoc's Introduction

Tanenbaum

Tanenbaum logo

Summary

Tanenbaum is an OCaml starter project for Advent of Code.

Feature overview

  • Automatic downloading + caching of puzzle inputs
  • CLI for running puzzles + submitting answers to adventofcode.com
  • Automatic puzzle detection + registration
  • ReasonML support out of the box

Quick-start

Project setup

First, clone or fork this repo and change directories into the repo.

Note

If you're a nix user you can skip the following steps and instead run: $ nix develop

Create your opam switch

$ opam switch create . --deps-only --y

Install developer tool dependencies

$ opam install ocaml-lsp-server ocamlformat utop

Validate you can build with dune

$ dune build

Warning

If any of these steps fail or cause an error please open an issue

Configure authentication

Tanenbaum needs a session token from adventofcode.com in order to download your puzzle inputs and submit your answers.

Start by logging in to adventofcode.com, then browsing to one of the puzzle dashboards (e.g. https://adventofcode.com/2015).

Open your developer tools and reload the page. This should issue a GET request, e.g. GET https://adventofcode.com/2015. Look for the Cookie: request header, which should contain a value that looks like (where x is a hex value):

session=5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5

This value is your session token. You'll need to store it as an environment variable called AUTH_TOKEN. One convenient way of doing this is to use a tool like direnv, e.g.:

.envrc:

export AUTH_TOKEN="5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5"

Tip

If you don't want to configure authentication, you will manually need to create your input directories and files. This can be done by creating the following directory structure from the project root:

$ mkdir inputs/{year}/{day}.txt

where Day 01 of 2023 would look like:

$ mkdir inputs/2023/01.txt

Working on problems

Each problem needs to conform to the Problem.T interface, which provides basic information about which year/day the problem is for, and functions to call which compute the puzzle output from puzzle input.

Adding problem files

Tanenbaum will automatically register .ml or .re files in lib/problems which start with problem -- e.g. lib/problems/problem_2023_01.ml or lib/problems/problem_2023_01.re. Once you've added a file of this form, you can run it from the CLI.

For example, if we'd like to start working on day 1 of year 2023, Tanenbaum will automatically we can add this file:

OCaml

lib/problems/problem_2023_01.ml;

let year = 2023
let day = 1

module Part_1 = struct
  let run (input : string) : (string, string) result = Ok input
end

module Part_2 = struct
  let run (input : string) : (string, string) result = Ok input
end

ReasonML

lib/problems/problem_2023_01.re;

let year = 2023;
let day = 1;

module Part_1 = {
  let run = (input: string): result(string, string) => Ok(input);
};

module Part_2 = {
  let run = (input: string): result(string, string) => Ok(input);
};

Tip

It's also helpful to add a .mli or .rei file, which gives the compiler more information about which parts of your code are unused and can therefore be cleaned up:

OCaml

lib/problems/problem_2023_01.mli:

include Problem.T

ReasonML

lib/problems/problem_2023_01.rei:

include Problem.T;

Running problems

Once you've added your problem, you can test your solution by running it with dune (optionally providing the --watch flag will re-run your problem when you change your code). This will output your answer to the terminal:

$ dune exec --watch bin/main.exe -- \
  --year=2023 \
  --day=1 \
  --part=1

  # output 
  your_answer

Submitting answers

Once you're convinced that your problem produces the correct output, you can either copy and paste your solution into the answer form on adventofcode.com, or you can also submit your answer using the CLI via the --submit flag.

Warning

You'll want to disable the --watch flag if you have it enabled -- otherwise you'll end up making a lot of requests to adventofcode.com...

dune exec bin/main.exe -- \
  --year=2023 \
  --day=1 \
  --part=1 \
  --submit

Tips and tricks

Testing against other inputs

Advent of Code typically provides smaller inputs, in order to check that your code works. I tend to allow Tanenbaum to download the puzzle input first, then I can replace the puzzle input with whatever input I'd like to test.

I can then revert back to the official puzzle input by deleting the file (Tanenbaum will download a fresh copy when I run it again).

aoc's People

Contributors

d4hines avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.