Advent of Code solutions
1set dotenv-load
2set quiet
3set shell := ["fish", "-c"]
4
5env_year := env_var_or_default("YEAR", "2024")
6session := env_var("SESSION")
7
8relative := trim_start_match(invocation_dir(), justfile_dir())
9current_year := replace_regex(relative, "^/(\\d+).*$", "$1")
10current_day := replace_regex(relative, "^/\\d+/(\\d+)$|.*", "$1")
11
12default_year := if current_year != "" { current_year } else { env_year }
13
14llvm_prefix := env("LLVM_SYS_191_PREFIX", "")
15clang := if llvm_prefix == "" { "clang" } else { llvm_prefix / "bin/clang" }
16
17
18p1 input="input": (part "p1" current_day current_year input)
19p2 input="input": (part "p2" current_day current_year input)
20compile part: (_compile current_year current_day part)
21run part input="input": (_run current_year current_day part input)
22
23all: (year "2020") (year "2021") (year "2022") (year "2023") (year "2024")
24year year=current_year: (day "1" year) (day "2" year) (day "3" year) (day "4" year) (day "5" year) (day "6" year) (day "7" year) (day "8" year) (day "9" year) (day "10" year) (day "11" year) (day "12" year) (day "13" year) (day "14" year) (day "15" year) (day "16" year) (day "17" year) (day "18" year) (day "19" year) (day "20" year) (day "21" year) (day "22" year) (day "23" year) (day "24" year) (day "25" year)
25day day=current_day year=current_year: (part "p1" day year) (part "p2" day year)
26part part day=current_day year=current_year input="input": (get day year) (_compile year day part) && (_run year day part input)
27
28_compile year day part:
29 #!/usr/bin/env fish
30 if test ! -d {{year}}/{{day}}
31 exit 0
32 end
33 cd {{year}}/{{day}}
34 if test -f {{part}}.tri
35 trilogy compile {{part}}.tri > {{part}}.ll
36 {{clang}} -O3 {{part}}.ll -o {{part}}
37 rm {{part}}.ll
38 else if test -f {{part}}.erl
39 erl -compile {{part}}.erl
40 else if test -f {{part}}.swift
41 swiftc {{part}}.swift > /dev/null
42 else if test -f {{part}}.rs
43 rustc {{part}}.rs > /dev/null
44 else if test -f {{part}}.c
45 gcc {{part}}.c -o {{part}} > /dev/null
46 else if test -f {{part}}.cpp
47 g++ -std=c++2c {{part}}.cpp -o {{part}} > /dev/null
48 else if test -f {{part}}.hs
49 ghc {{part}} -O -outputdir.{{part}} > /dev/null
50 else if ls | rg "\.cabal\$" -q
51 cabal build {{part}} > /dev/null
52 else if test -d {{part}} -a -f {{part}}/gleam.toml
53 pushd {{part}}
54 gleam build
55 end
56
57_run year day part input="input":
58 #!/usr/bin/env fish
59 if test ! -d {{year}}/{{day}}
60 exit 0
61 end
62 cd {{year}}/{{day}}
63 if test -x {{part}} -a ! -d {{part}}
64 time ./{{part}} < {{input}}
65 exit 0
66 end
67 set fn (fd -d 1 -t f {{part}})
68 if test -n "$fn" -a -x "$fn"
69 time "./$fn" < {{input}}
70 else if test -f {{part}}.pl
71 time swipl -s "$fn" -g main,halt < {{input}}
72 else if test -f {{part}}.tri
73 time trilogy run {{part}}.tri < {{input}}
74 else if test -f {{part}}.py
75 time python3 "$fn" < {{input}}
76 else if test -f {{part}}.rb
77 time ruby "$fn" < {{input}}
78 else if test -f {{part}}.ts
79 time deno "$fn" < {{input}}
80 else if test -f {{part}}.php
81 time php "$fn" < {{input}}
82 else if test -f {{part}}.ex
83 time elixir "$fn" < {{input}}
84 else if test -d {{part}} -a -f {{part}}/gleam.toml
85 pushd {{part}}
86 time gleam run "$fn" < ../{{input}}
87 else if test -f {{part}}.erl
88 time erl -noshell -s {{part}} main -s init stop < {{input}}
89 else if ls | rg "\.cabal\$" -q
90 time cabal run {{part}} < {{input}}
91 end
92
93get day=current_day year=default_year:
94 #!/usr/bin/env fish
95 if test -f {{year}}/{{day}}/input
96 exit 0
97 end
98 echo "Getting {{year}} day {{day}}"
99 mkdir -p {{year}}/{{day}}
100 curl https://adventofcode.com/{{year}}/day/{{day}}/input \
101 -X GET \
102 -H "Cookie: session={{session}}" \
103 -H "User-Agent: Cameron Eldridge <cameldridge@gmail.com>" \
104 -o {{year}}/{{day}}/input