Skip to content

NonlinearFruit/advent-of-code-2024

Repository files navigation

Advent of Code 2024

GitHub last commit (branch) GitHub Workflow Status (with event) star count test count


          .-----.          .------------------.         
       .--'~ ~ ~|        .-' *       \  /     '-.   1 **
    .--'~  ,* ~ |        |  >o<   \_\_\|_/__/   |   2 **
.---': ~ '(~), ~|        | >@>O< o-_/.()__------|   3 **
|@..#'. ~ " ' ~ |        |>O>o<@< \____       .'|   4 **
|               |        |          ..          |   5 
|               |        |        .'  '.        |   6 
|               |        |        |    |        |   7 
|   .--.        |        |        |    |        |   8 
'---'  |        |        |        |    |        |   9 
       |        |        |        |    |        |  10 
       |        |        |        |    |        |  11 
       |        |        |        |    |        |  12 
       |        |        |        |    |        |  13 
       |        |        |        |    |        |  14 
       |        |        |        |    |        |  15 
       |        |        |        |    |        |  16 
       |        |        |        |    |        |  17 
       |        |        |        |    |        |  18 
       |        |        |        |    |        |  19 
       |        |        |        '.  .'        |  20 
.------'        '------. |          ''          |  21 
|                      | |                      |  22 
|                      | |                      |  23 
|                      | |                      |  24 
|                      | '-.                  .-'  25 
'----------------------'   '------------------'         

Why Nushell

Nushell was placed on my radar in early 2023. My gut reaction was 'I hate powershell'. With some persistance from friends, the idea of Nushell was starting to take root. In the fall, it was time to put pen to paper and satiate my curiousity. Advent of Code 2023 (source) was the testing ground. I learned a lot about Nushell and started using it day-to-day for scripting. The built-in testing framework was sunsetted at some point in 2024. That was a problem so I built nuUnit (source).

This year when Advent of Code 2024 came around, I evaluated several other languages. In a proper familiar language, maybe I could complete all 25 days... It also could be a great chance to learn Clojure or Go... Practicing Lua or Python would be fun... But it was hard to resist battle testing nuUnit and pushing Nushell to it's limits. So I buckled in for another rocky ride exploring what Nushel is capable of.

Prerequisites

cargo install nushell # https://github.com/nushell/nushell
cargo install aoc-cli # https://github.com/scarvalhojr/aoc-cli
vim ~/.adventofcode.session # https://github.com/scarvalhojr/aoc-cli?tab=readme-ov-file#session-cookie

Usage

nu -c 'use toolkit.nu; toolkit pull puzzle'
Download the puzzle input and description

Usage:
  > pull puzzle <day> 

Flags:
  -h, --help: Display the help message for this command

Parameters:
  day <int>

Input/output types:
  ╭───┬───────┬────────╮
  │ # │ input │ output │
  ├───┼───────┼────────┤
  │ 0 │ any   │ any    │
  ╰───┴───────┴────────╯


nu -c 'use toolkit.nu; toolkit run puzzle'
Run a puzzle solver

Usage:
  > run puzzle <day> 

Flags:
  -h, --help: Display the help message for this command

Parameters:
  day <int>

Input/output types:
  ╭───┬───────┬────────╮
  │ # │ input │ output │
  ├───┼───────┼────────┤
  │ 0 │ any   │ any    │
  ╰───┴───────┴────────╯


nu -c 'use toolkit.nu; toolkit submit answer'
Submit an answer to a puzzle

Usage:
  > submit answer <day> 

Flags:
  -h, --help: Display the help message for this command

Parameters:
  day <int>

Input/output types:
  ╭───┬───────┬────────╮
  │ # │ input │ output │
  ├───┼───────┼────────┤
  │ 0 │ any   │ any    │
  ╰───┴───────┴────────╯


nu -c 'use toolkit.nu; toolkit update readme'
Recalculate the README

Usage:
  > update readme 

Flags:
  -h, --help: Display the help message for this command

Input/output types:
  ╭───┬───────┬────────╮
  │ # │ input │ output │
  ├───┼───────┼────────┤
  │ 0 │ any   │ any    │
  ╰───┴───────┴────────╯


Nushell v0.100.0: Lessons Learned

  • On day 2, when piping into an if, could not call a defined function in the else clause. The error was something like variable not defined but the stacktrace was a couple functions higher than the else clause
  • nuUnit importing tests from a separate file doesn't work
  • open ~/tilde/path/from/home doesn't work directly any more, path expand is necessary first
  • Opening relative paths (eg: day-04-ceres-search/input) is nuUnit tests is painful
    • Same with importing modules, it is difficult to know what kind of relative path to use (eg: working directory, calling file's directory)
  • A package manager of some sort is sorely needed. Being able to easily distribute and reuse code would be really helpful

Links

About

Using thematic puzzles to TDD in Nushell

Topics

Resources

Stars

Watchers

Forks