Advent of Code

December 17, 2025 · View on GitHub

These are my solutions in C# and F# for Advent of Code 2015-2024.

You can find benchmarks at the bottom of this README.

About my solutions:

  • My solutions tend to favour high performance over readability, I use Advent of Code as a way to practice my skills in writing high-performance code.
  • If you are struggling to understand any of my solutions, feel free to create an issue to ask about it and I will provide an explanation for you.
  • Oftentimes my solutions may not solve the general case as most of the problems are not clear on all the input constraints, however it will solve all actual inputs that could appear.
  • Feel free to copy my solutions if you are stuck, credit is always appreciated but not required since many of my approaches are not unique.
  • All my solutions are single-threaded, but they will often make use of SIMD as a way to emulate parallelism on a single thread.
  • This repo follows the automation guidelines on the /r/adventofcode community wiki. You can find input caching and User-Agent configuration implemented in AdventRunner.GetInputAsync(). There is no polling implemented in this repository for which throttling is required.

Solutions

Day20152016201720182019202020212022202320242025
1C# | F#C# | F#C# | F#C# | F#C# | F#C#C#C#C#C#C#
2C# | F#C# | F#C# | F#C# | F#C# | F#C#C#C#C#C#C#
3C# | F#C# | F#F#F#F#C#C#C#C#C#C#
4C# | F#C# | F#F#F#F#C#C#C#C#C#C#
5C# | F#C# | F#F#F#F#C#C#C#C#C#C#
6C# | F#C# | F#F#F#F#C#C#C#C#C#
7C# | F#C# | F#F#F#F#C#C#C#C#C#C#
8C# | F#C# | F#F#F#F#C#C#C#C#
9C# | F#C# | F#F#F#F#C#C#C#C#
10C# | F#C# | F#F#F#F#C#C#C#C#
11C# | F#C# | F#F#F#F#C#C#C#
12C# | F#C# | F#F#F#F#C#C#C#
13C# | F#C# | F#F#F#F#C#C#C#
14C# | F#F#F#F#F#C#C#C#
15C# | F#F#F#F#F#C#C#C#
16C# | F#F#F#F#F#C#C#C#
17C# | F#F#F#F#F#C#C#C#
18C# | F#F#F#F#F#C#C#C#
19C# | F#F#F#F#F#C#C#C#C#
20C# | F#F#F#F#F#C#C#C#C#
21C# | F#F#F#F#F#C#C#C#
22C# | F#F#F#F#F#C#C#C#
23C# | F#F#F#F#F#C#C#C#
24C# | F#F#F#F#F#C#C#C#
25C# | F#F#F#F#F#C#C#C#

C# Benchmarks

Benchmarking Environment

BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7171/25H2/2025Update/HudsonValley2)
AMD Ryzen 9 5950X 3.40GHz, 1 CPU, 32 logical and 16 physical cores
.NET SDK 10.0.100
  [Host]     : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3
  DefaultJob : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3

2025

DayP0P50P100Allocations
19.77 μs9.77 μs9.79 μs--
20.31 μs0.32 μs0.32 μs--
377.75 μs78.70 μs79.88 μs--
4231.67 μs233.66 μs244.78 μs94.5 KB
519.64 μs19.69 μs19.87 μs4.1 KB
619.50 μs19.55 μs19.64 μs--
72.40 μs2.44 μs2.50 μs--
8793.67 μs797.98 μs834.26 μs393.9 KB
9100.16 μs100.39 μs100.73 μs34.9 KB
1069.98 μs70.22 μs71.16 μs376 B

2024

DayP0P50P100Allocations
115.13 μs15.24 μs15.59 μs17.6 KB
215.28 μs15.45 μs15.88 μs--
37.15 μs7.22 μs7.31 μs--
46.47 μs6.56 μs6.78 μs--
510.93 μs11.05 μs12.31 μs--
740.62 μs41.40 μs46.08 μs--

2023

DayP0P50P100Allocations
115.69 μs15.78 μs15.95 μs--
22.64 μs2.79 μs2.86 μs--
39.24 μs9.30 μs9.44 μs584 B
410.94 μs11.09 μs12.30 μs--
57.48 μs7.57 μs7.75 μs8.3 KB
60.11 μs0.11 μs0.11 μs--
730.45 μs30.83 μs31.28 μs16.0 KB
898.79 μs99.74 μs104.74 μs21.5 KB
919.74 μs20.00 μs20.54 μs--
1020.90 μs20.98 μs21.29 μs--
112.30 μs2.32 μs2.35 μs584 B
121,221.36 μs1,230.64 μs1,249.56 μs162.7 KB
138.35 μs8.41 μs8.56 μs--
141,672.49 μs1,679.72 μs1,694.68 μs11.7 KB
1525.20 μs25.48 μs26.00 μs65.6 KB
16248.97 μs250.24 μs254.56 μs908.4 KB
173,548.23 μs3,557.76 μs3,590.55 μs411.7 KB
182.67 μs2.68 μs2.72 μs--
1929.31 μs29.51 μs29.73 μs--
203.26 μs3.27 μs3.30 μs15.9 KB
2115.01 μs15.09 μs15.53 μs--
2226.03 μs26.36 μs27.11 μs17.3 KB
23190.34 μs192.65 μs197.80 μs22.9 KB
24157.77 μs159.51 μs161.61 μs13.0 KB
25200.96 μs202.67 μs206.26 μs276.3 KB
All8,017.65 μs8,034.16 μs8,072.53 μs1.9 MB

2023 benchmarks are a result of measuring my solver on 5 separate inputs in a row. This means the results should be more representative and less susceptible to branch prediction biases.

2022

DayP0P50P100Allocations
15.08 μs5.48 μs5.77 μs--
24.93 μs4.96 μs5.00 μs--
34.61 μs4.65 μs4.68 μs--
43.97 μs4.02 μs4.15 μs--
55.60 μs5.68 μs5.73 μs1.8 KB
66.07 μs6.10 μs6.15 μs--
75.24 μs5.28 μs5.33 μs1.1 KB
1985.89 μs86.40 μs88.39 μs177.5 KB
205,226.16 μs5,245.14 μs5,273.71 μs105.9 KB

2021

DayP0P50P100Allocations
13.35 μs3.37 μs3.39 μs--
20.80 μs0.81 μs0.81 μs--
37.34 μs7.39 μs7.48 μs--
46.11 μs6.16 μs6.20 μs--
5178.60 μs179.63 μs180.37 μs23.2 KB
60.32 μs0.32 μs0.32 μs--
710.70 μs10.85 μs11.23 μs8.4 KB
89.90 μs9.96 μs10.01 μs--
916.39 μs16.47 μs16.89 μs--
1012.28 μs12.91 μs14.27 μs--
1116.68 μs16.78 μs16.99 μs--
1219.37 μs19.52 μs19.91 μs50.6 KB
139.16 μs9.28 μs9.53 μs27.7 KB
146.01 μs6.03 μs6.06 μs--
153,579.26 μs3,610.55 μs3,647.05 μs--
165.82 μs5.83 μs5.85 μs--
171.28 μs1.29 μs1.30 μs--
181,211.07 μs1,220.80 μs1,234.70 μs--
192,301.07 μs2,417.58 μs2,522.23 μs78.6 KB
202,001.82 μs2,018.46 μs2,033.79 μs--
21519.79 μs520.98 μs524.82 μs--
221,157.07 μs1,158.51 μs1,163.94 μs702.3 KB
231,114.05 μs1,118.17 μs1,148.80 μs599.4 KB
240.05 μs0.05 μs0.05 μs--
25341.46 μs343.67 μs346.71 μs--

2020

DayP0P50P100Allocations
12.21 μs2.22 μs2.25 μs4.1 KB
29.37 μs9.41 μs9.46 μs--
30.96 μs0.96 μs0.97 μs--
417.89 μs18.04 μs18.64 μs--
54.10 μs4.11 μs4.12 μs--
68.20 μs8.22 μs8.27 μs--
7151.48 μs153.20 μs156.29 μs363.1 KB
82.41 μs2.42 μs2.43 μs9.9 KB
913.58 μs13.62 μs13.73 μs8.0 KB
100.66 μs0.66 μs0.69 μs456 B
114,351.47 μs4,363.01 μs4,423.28 μs878.5 KB
121.89 μs1.90 μs1.91 μs--
131.12 μs1.13 μs1.15 μs1.3 KB
142,357.38 μs2,478.76 μs2,583.43 μs8.5 MB
15185,442.80 μs187,125.30 μs189,936.50 μs120.0 MB
1622.52 μs22.73 μs23.30 μs5.6 KB
1797.09 μs98.67 μs100.33 μs527.5 KB
1837.98 μs39.80 μs40.51 μs1.6 KB
19362.20 μs364.10 μs385.11 μs15.1 KB
20473.96 μs476.81 μs489.69 μs414.9 KB
21134.19 μs136.08 μs140.47 μs142.4 KB
229,420.17 μs9,483.58 μs9,692.30 μs9.9 MB
23137,736.35 μs138,419.77 μs139,212.15 μs4.0 MB
243,072.52 μs3,080.75 μs3,119.53 μs65.6 KB
251,035.56 μs1,039.21 μs1,044.09 μs--

2019

DayP0P50P100Allocations
10.85 μs0.85 μs0.86 μs--
2541.20 μs542.00 μs549.33 μs1.6 KB

2018

DayP0P50P100Allocations
128.68 μs29.45 μs29.87 μs47.3 KB
215.37 μs15.43 μs15.47 μs2.0 KB

2017

DayP0P50P100Allocations
15.15 μs5.16 μs5.19 μs--
22.92 μs2.93 μs2.95 μs216 B

2016

DayP0P50P100Allocations
14.11 μs4.17 μs4.21 μs27.7 KB
25.75 μs5.77 μs5.80 μs--
333.54 μs34.37 μs36.94 μs--
463.61 μs63.92 μs64.21 μs128 B
5389,624.20 μs390,698.40 μs391,177.60 μs744 B
64.99 μs5.01 μs5.03 μs1.1 KB
7300.93 μs302.06 μs304.86 μs1.4 KB
88.05 μs8.07 μs8.12 μs344 B
928.52 μs28.84 μs29.40 μs--
105.72 μs5.77 μs5.81 μs30.6 KB
1115,286.89 μs15,386.05 μs15,539.35 μs11.0 MB
1230,895.29 μs31,066.14 μs31,853.72 μs488 B
1316.02 μs16.11 μs16.20 μs70.2 KB

2015

DayP0P50P100Allocations
13.79 μs3.82 μs3.85 μs--
25.19 μs5.20 μs5.20 μs--
3100.01 μs104.03 μs106.93 μs123.5 KB
4140,766.15 μs140,911.20 μs141,351.90 μs472 B
5113.90 μs114.25 μs114.60 μs--
617,413.24 μs17,466.34 μs17,516.42 μs4.0 MB
745.55 μs45.94 μs46.26 μs106.9 KB
86.81 μs6.97 μs7.28 μs--
9424.56 μs426.42 μs449.27 μs9.3 KB
1023,711.97 μs24,054.05 μs24,194.37 μs46.1 MB
11418.49 μs419.89 μs436.38 μs--
1294.35 μs95.10 μs96.15 μs--
135,121.54 μs5,126.22 μs5,138.65 μs11.1 KB
1434.61 μs34.74 μs34.86 μs1.1 KB
151,420.59 μs1,422.32 μs1,425.23 μs288 B
1637.58 μs38.18 μs38.78 μs58.0 KB
1718.67 μs19.10 μs19.59 μs74.2 KB
185,697.55 μs5,704.43 μs5,724.68 μs83.4 KB
1910.48 μs10.57 μs10.64 μs24.6 KB
201,619.44 μs1,628.32 μs1,631.02 μs181.7 KB
214.04 μs4.05 μs4.07 μs21.1 KB
221,754.93 μs1,765.37 μs1,772.08 μs3.0 MB
234.59 μs4.76 μs4.86 μs3.1 KB
242,161.86 μs2,170.68 μs2,180.56 μs16.6 KB
250.16 μs0.16 μs0.16 μs32 B