A new solution in a different language every day (without repeating languages from 2018)!
- Day 1 (J): Part I, Part II
- Day 2 (AWK): Part I, Part II
- Day 3 (Fortran): Part I, Part II
- Day 4 (Pascal): Part I, Part II
- Day 5 (Octave): Part I, Part II
- Day 6 (Assembly for x86-64/Linux): Part I, Part II
- Day 7 (Miranda): Part I, Part II
- Day 8 (ABS): Part I, Part II
- Day 9 (Erlang): Part I, Part II
- Day 10 (Raku): Part I, Part II
- Day 11 (newLISP): Part I, Part II
- Day 12 (Pike): Part I, Part II
- Day 13 (Haskell): Part I, Part II
- Day 14 (Koka): Part I, Part II
- Day 15 (Gravity): Part I, Part II
- Day 16 (Lua): Part I, Part II
- Day 17 (Min): Part I, Part II
- Day 18 (Elixir): Part I, Part II
- Day 19 (V): Part I, Part II
- Day 20 (Scheme (R6RS)): Part I, Part II
- Day 21 (Vala): Part I, Part II
- Day 22 (Odin): Part I, Part II
- Day 23 (Lemon): Part I, Part II
- Day 24 (Algebra): Part I, Part II
- Day 25 (Dictu): Part I, there's no Part II.
If you liked this approach, you may also enjoy Rosa's solutions.