advent

Haskell solutions to every Advent of Code puzzle from 2015 to 2025: 262 days, one file each, shown here next to a short critique of how each one works and where it is weak.

The years read differently. 2015 to 2020 aim for idiomatic, fairly clean Haskell with a few shared helpers. From 2021 the solutions use a replacement Prelude, Relude at first and then a custom one, and from 2022 they prioritise fun: by 2024 and 2025 every solution is written against quaalude, a dense Unicode prelude with no imports needed, and the median solution is less than a third of the length it was in 2018.

Pick a year and a day below, or use ← and → to step through them. In 2024 and 2025 code, dotted names are quaalude's: hover or focus one for its type.

Lines of code in each solution, by year A dot for every solution, placed by year and by its number of lines of code (not counting blank lines or comments), with each year's median marked. 2015 to 2020 are plain Haskell, with medians of 37 to 74 lines; 2021 and 2022 use Relude and helper modules; 2023 uses adlude, a custom prelude; 2024 and 2025 use quaalude, with medians of 21 and 15 lines. 2015 day 1: 16 lines 2015 day 2: 19 lines 2015 day 3: 40 lines 2015 day 4: 15 lines 2015 day 5: 42 lines 2015 day 6: 66 lines 2015 day 7: 69 lines 2015 day 8: 25 lines 2015 day 9: 48 lines 2015 day 10: 6 lines 2015 day 11: 27 lines 2015 day 12: 46 lines 2015 day 13: 51 lines 2015 day 14: 51 lines 2015 day 15: 64 lines 2015 day 16: 68 lines 2015 day 17: 28 lines 2015 day 18: 56 lines 2015 day 19: 61 lines 2015 day 20: 24 lines 2015 day 21: 66 lines 2015 day 22: 129 lines 2015 day 23: 45 lines 2015 day 24: 49 lines 2015 day 25: 8 lines 2016 day 1: 40 lines 2016 day 2: 51 lines 2016 day 3: 14 lines 2016 day 4: 51 lines 2016 day 5: 32 lines 2016 day 6: 22 lines 2016 day 7: 66 lines 2016 day 8: 85 lines 2016 day 9: 51 lines 2016 day 10: 85 lines 2016 day 11: 136 lines 2016 day 12: 119 lines 2016 day 13: 44 lines 2016 day 14: 35 lines 2016 day 15: 44 lines 2016 day 16: 25 lines 2016 day 17: 38 lines 2016 day 18: 50 lines 2016 day 19: 42 lines 2016 day 20: 24 lines 2016 day 21: 130 lines 2016 day 22: 130 lines 2016 day 23: 15 lines 2016 day 24: 74 lines 2016 day 25: 25 lines 2017 day 1: 18 lines 2017 day 2: 26 lines 2017 day 3: 47 lines 2017 day 4: 22 lines 2017 day 5: 16 lines 2017 day 6: 30 lines 2017 day 7: 73 lines 2017 day 8: 42 lines 2017 day 9: 35 lines 2017 day 10: 31 lines 2017 day 11: 26 lines 2017 day 12: 41 lines 2017 day 13: 21 lines 2017 day 14: 59 lines 2017 day 15: 28 lines 2017 day 16: 100 lines 2017 day 17: 24 lines 2017 day 18: 109 lines 2017 day 19: 51 lines 2017 day 20: 65 lines 2017 day 21: 47 lines 2017 day 22: 80 lines 2017 day 23: 34 lines 2017 day 24: 37 lines 2017 day 25: 89 lines 2018 day 1: 24 lines 2018 day 2: 22 lines 2018 day 3: 42 lines 2018 day 4: 94 lines 2018 day 5: 24 lines 2018 day 6: 61 lines 2018 day 7: 83 lines 2018 day 8: 25 lines 2018 day 9: 75 lines 2018 day 10: 74 lines 2018 day 11: 41 lines 2018 day 12: 52 lines 2018 day 13: 101 lines 2018 day 14: 31 lines 2018 day 15: 188 lines 2018 day 16: 197 lines 2018 day 17: 137 lines 2018 day 18: 42 lines 2018 day 19: 90 lines 2018 day 20: 149 lines 2018 day 21: 48 lines 2018 day 22: 91 lines 2018 day 23: 118 lines 2018 day 24: 222 lines 2018 day 25: 47 lines 2019 day 1: 16 lines 2019 day 2: 31 lines 2019 day 3: 39 lines 2019 day 4: 32 lines 2019 day 5: 14 lines 2019 day 6: 50 lines 2019 day 7: 68 lines 2019 day 8: 29 lines 2019 day 9: 14 lines 2019 day 10: 87 lines 2019 day 11: 73 lines 2019 day 12: 99 lines 2019 day 13: 193 lines 2019 day 14: 53 lines 2019 day 15: 151 lines 2019 day 16: 41 lines 2019 day 17: 84 lines 2019 day 18: 298 lines 2019 day 19: 43 lines 2019 day 20: 96 lines 2019 day 21: 43 lines 2019 day 22: 62 lines 2019 day 23: 100 lines 2019 day 24: 90 lines 2019 day 25: 89 lines 2020 day 1: 15 lines 2020 day 2: 31 lines 2020 day 3: 41 lines 2020 day 4: 104 lines 2020 day 5: 32 lines 2020 day 6: 13 lines 2020 day 7: 113 lines 2020 day 8: 104 lines 2020 day 9: 40 lines 2020 day 10: 25 lines 2020 day 11: 96 lines 2020 day 12: 102 lines 2020 day 13: 38 lines 2020 day 14: 119 lines 2020 day 15: 32 lines 2020 day 16: 97 lines 2020 day 17: 69 lines 2020 day 18: 40 lines 2020 day 19: 71 lines 2020 day 20: 192 lines 2020 day 21: 65 lines 2020 day 22: 41 lines 2020 day 23: 56 lines 2020 day 24: 86 lines 2020 day 25: 16 lines 2021 day 1: 22 lines 2021 day 2: 36 lines 2021 day 3: 29 lines 2021 day 4: 62 lines 2021 day 5: 17 lines 2021 day 6: 16 lines 2021 day 7: 12 lines 2021 day 8: 37 lines 2021 day 9: 31 lines 2021 day 10: 30 lines 2021 day 11: 28 lines 2021 day 12: 46 lines 2021 day 13: 17 lines 2021 day 14: 49 lines 2021 day 15: 35 lines 2021 day 16: 82 lines 2021 day 17: 38 lines 2021 day 18: 98 lines 2021 day 19: 50 lines 2021 day 20: 38 lines 2021 day 21: 40 lines 2021 day 22: 57 lines 2021 day 23: 150 lines 2021 day 24: 40 lines 2021 day 25: 27 lines 2022 day 1: 11 lines 2022 day 2: 36 lines 2022 day 3: 41 lines 2022 day 4: 17 lines 2022 day 5: 33 lines 2022 day 6: 15 lines 2022 day 7: 62 lines 2022 day 8: 62 lines 2022 day 9: 31 lines 2022 day 10: 50 lines 2022 day 11: 64 lines 2022 day 12: 29 lines 2022 day 13: 42 lines 2022 day 14: 39 lines 2022 day 15: 44 lines 2022 day 16: 77 lines 2022 day 17: 112 lines 2022 day 18: 64 lines 2022 day 19: 83 lines 2022 day 20: 62 lines 2022 day 21: 67 lines 2022 day 22: 84 lines 2022 day 23: 53 lines 2022 day 24: 91 lines 2022 day 25: 35 lines 2023 day 1: 21 lines 2023 day 2: 29 lines 2023 day 3: 48 lines 2023 day 4: 33 lines 2023 day 5: 46 lines 2023 day 6: 15 lines 2023 day 7: 94 lines 2023 day 8: 44 lines 2023 day 9: 7 lines 2023 day 10: 64 lines 2023 day 11: 11 lines 2023 day 12: 19 lines 2023 day 13: 20 lines 2023 day 14: 13 lines 2023 day 15: 14 lines 2023 day 16: 22 lines 2023 day 17: 22 lines 2023 day 18: 31 lines 2023 day 19: 54 lines 2023 day 20: 78 lines 2023 day 21: 32 lines 2023 day 22: 72 lines 2023 day 23: 64 lines 2023 day 24: 69 lines 2023 day 25: 19 lines 2024 day 1: 7 lines 2024 day 2: 15 lines 2024 day 3: 16 lines 2024 day 4: 21 lines 2024 day 5: 18 lines 2024 day 6: 16 lines 2024 day 7: 13 lines 2024 day 8: 11 lines 2024 day 9: 36 lines 2024 day 10: 16 lines 2024 day 11: 20 lines 2024 day 12: 23 lines 2024 day 13: 28 lines 2024 day 14: 42 lines 2024 day 15: 64 lines 2024 day 16: 50 lines 2024 day 17: 13 lines 2024 day 18: 29 lines 2024 day 19: 4 lines 2024 day 20: 23 lines 2024 day 21: 38 lines 2024 day 22: 35 lines 2024 day 23: 38 lines 2024 day 24: 156 lines 2024 day 25: 8 lines 2025 day 1: 5 lines 2025 day 2: 16 lines 2025 day 3: 20 lines 2025 day 4: 22 lines 2025 day 5: 4 lines 2025 day 6: 4 lines 2025 day 7: 15 lines 2025 day 8: 15 lines 2025 day 9: 4 lines 2025 day 10: 39 lines 2025 day 11: 7 lines 2025 day 12: 15 lines 0 50 100 150 200 250 300 lines 46 2015 44 2016 37 2017 74 2018 62 2019 56 2020 37 2021 50 2022 31 2023 21 2024 15 2025 plain Haskell Relude + helpers adlude quaalude median
Shorter every era. Lines of code per solution, blank lines and comments excluded.

About this page

Each critique was drafted by a language model (Claude Opus 5.5) from the solution's code and the types of any quaalude names it uses. A second model (GPT-5.4) then checked every claim against the code: 194 critiques were revised at least once, 170 passed the check, and for the other 92 the drafting model ruled on each remaining objection from the code (accepting 43, rejecting 162 as mistaken or pedantic). A sample was checked by hand. They describe the code, not the answers, and are deliberately short.

Puzzle text and inputs are not reproduced here: they belong to Advent of Code, whose author asks that they are not redistributed. Each day links to its puzzle. The page is generated from the repository by scripts/site.