m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/src/blog/advent-of-code-2020.html.erb
blob: 24b2280bc90d772427332b3eeede454f28ceb6df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
title: Advent of Code 2020
date: December 25, 2020 17:35
---
<p> Merry Christmas to all!</p>

<p>
<a href='https://adventofcode.com/2020'>Advent of Code 2020</a> has come to an
end. At the time of this writing, around seven thousand people finished the
whole thing, out of the 150000 that had submitted a solution to the first day's
problem. And I'm one of them!
</p>

<p>
You can see my solutions <a href='<%= git 'aoc2020' %>'>here</a>.
I started out with C, moved on to Ruby, and near the end switched to Lua. I'm
going to need some Lua knowledge for the Redis section of the databases class
I'm taking right now, so AoC was a good time to get familiar with the language.
</p>

<h3>Thoughts on AoC 2020</h3>

<p>
I found most of the problems fairly simple, but it was fun to go through them
all anyways.
</p>

<h4>Most Tedious Award goes to...</h4>

<p>
<i>Day 20 Part 2</i>. My solution ended up being a good 340 lines of Lua split
between two scripts. This is the last problem I solved because I knew it would
require a lot of work to get working, so I procrastinated on it until the end.
</p>

<p>
In the end, the process of solving this was actually kind of fun, and getting
the final solution satisfying. I think it might have something to do with the
geometric/visual nature of the problem. There's just something nice about
rotating and flipping ASCII squares with code, and seeing them all line up
correctly in the end.
</p>

<h4>Most Cheesed Award goes to...</h4>
<p>
<i>Day 19 Part 2</i>. Rather than implementing a parser generator that could
handle this grammar by hand, I bodged together a
<a href='<%= git 'aoc2020', 'tree/19/b' %>'>
    Bison (aka Yacc) solution
</a>. It's not very pretty, especially the Bash script that just calls the
parser with each input word separately and counts how many times it didn't exit
with a syntax error. But it works! And I finally learned something about
Bison/Yacc and Flex/Lex, which I've had indirect exposure to before, but never
actually used.
</p>

<p>
I was quite pleased with my Part 1 solution though, where I implemented a simple
recursive parser generator.
</p>

<h5>Runner-up in the Most Cheesed category</h5>
<p>
<i>Day 13 Part 2</i>. I'll admit it, I just copied a Chinese Remainder Theorem
implementation from Rosetta Code. I'm sure the Python guys just used
<code>numpy</code>'s CRT, so treating it as a library function doesn't seem too
cheaty for me.
</p>

<h4>Most Fun Award goes to...</h4>
<p>
Probably a tie between the already mentioned <i>Day 20 Part 2</i> and <i>Day 19
Part 1</i>.  Day 20 had that cool geometric component and satisfaction of
putting a puzzle together, but I'm a sucker for recursive parsers implemented
with higher order functions.
</p>

<h3>Thoughts on Lua</h3>
<p>
Learning Lua was probably the most useful outcome of this year's AoC for me. I
feel pretty comfortable with the basic constructs of the language, and even
played around a bit with metatable-driven OOP. I don't know how closely I stuck
to general conventions, and didn't interact with any external libraries, but can
definitely read and write the language comfortably now.
</p>

<p>
My one sentence summary of feelings towards Lua is that Go is to Java what Lua
is to Python/Ruby/JavaScript. Its very small vocabulary means you learn the
language quickly and don't need to think much while writing it, but your
programs can end up more verbose than the equivalent Ruby/Python.
</p>