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.1
- Perfectionism.
- Competition.
1 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