My solutions for each task.
Goals and Non-Goals are similar to last year:
- Solve the puzzles.
- Solve them as quickly as possible.
- (optional) Refactor if something bothers me too much.
- Yet still: Have fun with the puzzles!
- Enjoy the coding practice and built up the "muscle memory" for Rust.
- Learn more Rust on the way.
- Become more confident.
- Allow rough edges here and there.
- Have fun!
-
Performance and efficiency.
Usually try to optimize for less to no allocations if possible. (Maybe next year I'll try to do a
#![no_std]
/embedded setup.)Input data gets embedded to also avoid the filesystem. This can bloat the binaries though.
-
Relatively idiomatic Rust
Although not all common patterns will be used; enums are usually common, but AoC puzzles mostly lend themselves to simple string and number crunching. Sometimes shorter code might be more preferrable than the Rusty code.
- The most, best, optimal, idiomatic way of writing Rust.¹
- Perfectionism.
- Competition.
¹ Well, a bit of idiomatic code is probably still good.
Multi-bin crate: Each day becomes its own binary, the CLI only needs switches for which part to run and if example inputs should be used.
- multiple binaries, one for each day
- binary name must include day value
- prepare task: create files and fetch input (needs session cookie)
- each day: create bin file, compile, prepare run, code solution, puzzle run
Each day prints its solution in the following format:
[D01.1] solution: 69177
solved in 33.63µs
Single day helper:
# fish
function day; day$argv; day$argv -s; end
# and call it
day 5
To get a list of all days and parts:
### fish ###
for d in (seq 1 5); day$d; day$d -s; end
# as a self deleting function with input last
function aoc; for d in (seq 1 $argv); day$d; day$d -s; end; functions -e aoc; end; aoc 5
# or if you want to reuse it
function aoc; for d in (seq 1 $argv); day$d; day$d -s; end; end
aoc 5 # call this in your current shell session
### bash ###
for d in $(seq 1 5); do day$d; day$d -s; done
# as a self deleting function with input last
aoc() { for d in $(seq 1 $1); do day$d; day$d -s; done; unset -f aoc; }; aoc 5
# or if you want to reuse it
aoc() { for d in $(seq 1 $1); do day$d; day$d -s; done }
aoc 5 # call this in your current shell session
To get a binary runtime comparison with hyperfine:
hyperfine -N -w 100 "day{day}" "day{day} -s" -P day 1 5