Rickard's Projects

This site hosts my projects.

Projects

Recent events

2025-12-15 22:23 Rickard pushed to blog

commit 23be08c456f904d2b50f77e1a245dc63e77187bc
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 15 22:23:09 2025 +0100

    New post maze math puzzles

diff --git a/posts/2025/12/15/maze-math-puzzles/post.md b/posts/2025/12/15/maze-math-puzzles/post.md
new file mode 100644
index 0000000..1b4725f
--- /dev/null
+++ b/posts/2025/12/15/maze-math-puzzles/post.md
@@ -0,0 +1,233 @@
+---
+date: 2025-12-15 22:18:00
+title: Maze Math Puzzles
+tags: aoc
+---
+
+<style type="text/css">
+pre { padding: 10px; }
+pre.highlight                    { background: #002b36; }
+pre.highlight                    { color: #93a1a1; }
+pre.highlight span.Meta          { color: #d33682; }
+pre.highlight span.Reserved      { color: #859900; }
+pre.highlight span.String        { color: #2aa198; }
+pre.highlight span.CharString    { color: #ffffff; }
+pre.highlight span.Escape        { color: #dc322f; }
+pre.highlight span.RuleName      { color: #268bd2; }
+pre.highlight span.VariableName  { color: #b58900; }
+</style>
+
+Inspired by [](post:2025/12/13/advent-of-code-2025/post.md), I wanted to make
+some kind of similar puzzle for my son. He usually takes some interest in me
+solving the problems. He even helped me program some solutions last year. But
+it mostly meant I told him what keys to press. Programming is a little hard.
+But he likes math.
+
+So I came up with an idea to generate maze math problems.
+
+Your task is to walk from start to end in a maze. You also carry a backpack
+with a number in it. That number is initially 1. When you cross another number
+on your way to the end, you add the number that you have in your backpack with
+the number you just encountered and put the result back in your backpack. When
+you cross an operator, it changes what operation you perform the next time you
+cross a number. The puzzle answer is the number that you have in your backpack
+when you reach the end.
+
+Here is the first puzzle that I generated that I had my son solve:
+
+<pre class="highlight">#########################################
+# <span class="Reserved">S</span>     #                               #
+#####   #   #############################
+#       #                               #
+#   #####   #########################   #
+#   #       #     <span class="RuleName">4</span>                     #
+#   #########   #####################   #
+#         <span class="VariableName">*</span>   <span class="RuleName">2</span> # <span class="VariableName">*</span>                 # <span class="VariableName">+</span> #
+#################   #########   #   #   #
+#     <span class="RuleName">3</span>             #           #   #   #
+#########   #########   #########   #   #
+# <span class="RuleName">4</span>     # <span class="VariableName">*</span>     #       #   #     <span class="VariableName">+</span> #   #
+#   #   #########   #####   #   #####   #
+#   #               #         <span class="RuleName">4</span> # <span class="RuleName">3</span>     #
+#   #############################   #####
+#     <span class="RuleName">2</span>                     #       # <span class="RuleName">2</span> #
+#########################   #   #####   #
+#     <span class="RuleName">3</span>               <span class="VariableName">+</span>     #     <span class="Escape">E</span>     #
+#   #################################   #
+#                                       #
+#########################################
+</pre>
+
+I had to explain the rules a few times before he got it. But then he was able
+to solve it. It was both a little challenging to remember the number in the
+backpack and to remember what operation to perform. The mazes don't seem to be
+too hard to solve right now. Perhaps I have done something wrong in the
+generation code? There are often few choices that you can make.
+
+Can you figure out the answer?
+
+The program that generates the mazes also helpfully shows the answer and the
+path from start to end:
+
+<pre class="highlight">Answer = <span class="RuleName">1</span><span class="RuleName">1</span>
+#########################################
+# <span class="Reserved">S</span>   <span class="Meta">.</span> #                               #
+#####   #   #############################
+# <span class="Meta">.</span>   <span class="Meta">.</span> #                               #
+#   #####   #########################   #
+# <span class="Meta">.</span> #       # <span class="Meta">.</span>   <span class="RuleName">4</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #
+#   #########   #####################   #
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="VariableName">*</span>   <span class="RuleName">2</span> # <span class="VariableName">*</span>                 # <span class="VariableName">+</span> #
+#################   #########   #   #   #
+#     <span class="RuleName">3</span>             #           #   # <span class="Meta">.</span> #
+#########   #########   #########   #   #
+# <span class="RuleName">4</span>     # <span class="VariableName">*</span>     #       #   #     <span class="VariableName">+</span> # <span class="Meta">.</span> #
+#   #   #########   #####   #   #####   #
+#   #               #         <span class="RuleName">4</span> # <span class="RuleName">3</span>   <span class="Meta">.</span> #
+#   #############################   #####
+#     <span class="RuleName">2</span>                     # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="RuleName">2</span> #
+#########################   #   #####   #
+#     <span class="RuleName">3</span>               <span class="VariableName">+</span>     # <span class="Meta">.</span>   <span class="Escape">E</span>     #
+#   #################################   #
+#                                       #
+#########################################
+</pre>
+
+Right now only numbers 1, 2, 3, and 4 are used and operators `+` and `*`. We
+can easily make the problems harder by adding bigger numbers and more
+operators.
+
+We can also get harder problems by generating mazes a few times at random. Here
+is one for example:
+
+<pre class="highlight">#########################################
+# <span class="Reserved">S</span>       <span class="RuleName">2</span> #                           #
+#########   #   #########   #############
+#       #   #   #       #     <span class="RuleName">3</span>         #
+#   #   #   #####   #   #############   #
+#   #   #   #       #         <span class="VariableName">+</span>   <span class="VariableName">*</span> # <span class="RuleName">4</span> #
+#   #   #   #   #################   #   #
+#   #   #       #               # <span class="RuleName">3</span> #   #
+#   #################   #####   #   #   #
+#         <span class="RuleName">2</span>         #   #       #       #
+#############   #   #####   #   #####   #
+#             <span class="RuleName">3</span> # <span class="VariableName">+</span>   <span class="RuleName">4</span>     #   #       #
+#   #############################   #####
+#                               #       #
+#############################   #####   #
+#                 <span class="VariableName">*</span>         #   #     <span class="RuleName">4</span> #
+#   #####################   #   #   #####
+#   # <span class="VariableName">*</span>                       <span class="VariableName">+</span> # <span class="Escape">E</span> #   #
+#   #############################   #   #
+#                                 <span class="RuleName">2</span>     #
+#########################################
+Answer = <span class="RuleName">3</span><span class="RuleName">6</span>
+#########################################
+# <span class="Reserved">S</span>   <span class="Meta">.</span>   <span class="RuleName">2</span> #                           #
+#########   #   #########   #############
+#       # <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span> #     <span class="RuleName">3</span>         #
+#   #   #   #####   #   #############   #
+#   #   # <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="VariableName">+</span>   <span class="VariableName">*</span> # <span class="RuleName">4</span> #
+#   #   #   #   #################   #   #
+#   #   # <span class="Meta">.</span>   <span class="Meta">.</span> #               # <span class="RuleName">3</span> #   #
+#   #################   #####   #   #   #
+#         <span class="RuleName">2</span>         #   #       # <span class="Meta">.</span>   <span class="Meta">.</span> #
+#############   #   #####   #   #####   #
+#             <span class="RuleName">3</span> # <span class="VariableName">+</span>   <span class="RuleName">4</span>     #   # <span class="Meta">.</span>   <span class="Meta">.</span> #
+#   #############################   #####
+#                               # <span class="Meta">.</span>   <span class="Meta">.</span> #
+#############################   #####   #
+#                 <span class="VariableName">*</span>         #   # <span class="Meta">.</span>   <span class="RuleName">4</span> #
+#   #####################   #   #   #####
+#   # <span class="VariableName">*</span>                       <span class="VariableName">+</span> # <span class="Escape">E</span> #   #
+#   #############################   #   #
+#                                 <span class="RuleName">2</span>     #
+#########################################
+</pre>
+
+And of course we can play around with larger size:
+
+<pre class="highlight">#################################################################################
+# <span class="Reserved">S</span>       <span class="VariableName">*</span>     #                       #           #                       #   #
+#############   #   #################   #   #####   #   #################   #   #
+#   #           #           #               #           #       #           # <span class="VariableName">+</span> #
+#   #   #################   #   #############################   #   #########   #
+#       #                   #   # <span class="RuleName">4</span>                         #   #   #           #
+#   #############   #   #########   #####################   #   #   #########   #
+# <span class="RuleName">3</span>         #       #   #                   #               #       #         <span class="RuleName">4</span> #
+#########   #   #########   #################   #############   #####   #########
+#       #   #                   #               #           #   #   #     <span class="RuleName">4</span>     #
+#####   #   #####################   #############   #########   #   #   #####   #
+#       #             <span class="VariableName">*</span>             #           #   #         <span class="RuleName">3</span> #       #       #
+#   #   #################################   #   #   #   #################   #####
+#   #       #                               #       #           #       #       #
+#   #####   #####################   #########################   #   #   #####   #
+#   #       #           #       #       #                   #   #   #           #
+#   #   #####   #####   #   #   #####   #   #####   #########   #   #############
+#   #           #   #       #     <span class="Escape">E</span> #       #       # <span class="VariableName">*</span>         #               #
+#   #############   #############   #########   #####   #####################   #
+#           #               #       #       # <span class="RuleName">2</span> #       #                       #
+#########   #   #############   #####   #   #   #   #########   #################
+#           #         <span class="VariableName">+</span>                 # <span class="RuleName">3</span>     #   #       #             <span class="VariableName">*</span>     #
+#   #####   #################################   #   #   #   #   #############   #
+#   #       #                               #   #       #   #   #           #   #
+#   #########   #########################   #############   #####   #####   #   #
+#     <span class="VariableName">*</span>         #                           #           #           #   #       #
+#   #############   #########################   #####   #############   #####   #
+#   #               #                   #       #                 <span class="RuleName">2</span>         #   #
+#####   #####   #####   #############   #   #####   #########   #############   #
+#     <span class="RuleName">3</span> #       #       #           #       #       #         <span class="RuleName">4</span> #               #
+#   #############   #####   #####   #########   #####   #########   #############
+#             <span class="RuleName">4</span>     # <span class="RuleName">3</span>     #   #             <span class="RuleName">2</span> #   # <span class="VariableName">+</span>     #       #           #
+#####################   #####   #################   #####   #   #####   #####   #
+#                       #               #         <span class="RuleName">2</span>         #           #       #
+#   #################################   #   #############################   #####
+# <span class="RuleName">2</span>                       <span class="VariableName">+</span> #           #                           #       #   #
+#########################   #   #################################   #   #####   #
+#                           #                                       #   #       #
+#   #################################################################   #####   #
+#                                                                             <span class="VariableName">+</span> #
+#################################################################################
+Answer = <span class="RuleName">5</span><span class="RuleName">0</span>
+#################################################################################
+# <span class="Reserved">S</span>   <span class="Meta">.</span>   <span class="VariableName">*</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   #
+#############   #   #################   #   #####   #   #################   #   #
+#   # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #         <span class="Meta">.</span>   <span class="Meta">.</span> #     <span class="Meta">.</span>   <span class="Meta">.</span> #       # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="VariableName">+</span> #
+#   #   #################   #   #############################   #   #########   #
+# <span class="Meta">.</span>   <span class="Meta">.</span> #         <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   # <span class="RuleName">4</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   # <span class="Meta">.</span> #           #
+#   #############   #   #########   #####################   #   #   #########   #
+# <span class="RuleName">3</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>         # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #         <span class="RuleName">4</span> #
+#########   #   #########   #################   #############   #####   #########
+#       # <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>     # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #           # <span class="Meta">.</span> #   #     <span class="RuleName">4</span>     #
+#####   #   #####################   #############   #########   #   #   #####   #
+# <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="VariableName">*</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #           #   # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="RuleName">3</span> #       #       #
+#   #   #################################   #   #   #   #################   #####
+# <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #                               #       # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #       #       #
+#   #####   #####################   #########################   #   #   #####   #
+# <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #       #                   # <span class="Meta">.</span> #   #           #
+#   #   #####   #####   #   #   #####   #   #####   #########   #   #############
+# <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Escape">E</span> #       #       # <span class="VariableName">*</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #               #
+#   #############   #############   #########   #####   #####################   #
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #               #       #       # <span class="RuleName">2</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #                       #
+#########   #   #############   #####   #   #   #   #########   #################
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #         <span class="VariableName">+</span>                 # <span class="RuleName">3</span>     # <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #             <span class="VariableName">*</span>     #
+#   #####   #################################   #   #   #   #   #############   #
+# <span class="Meta">.</span> #       # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   #
+#   #########   #########################   #############   #####   #####   #   #
+# <span class="Meta">.</span>   <span class="VariableName">*</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span> #
+#   #############   #########################   #####   #############   #####   #
+#   # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>           <span class="RuleName">2</span>         # <span class="Meta">.</span> #
+#####   #####   #####   #############   #   #####   #########   #############   #
+# <span class="Meta">.</span>   <span class="RuleName">3</span> #       # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #         <span class="RuleName">4</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #
+#   #############   #####   #####   #########   #####   #########   #############
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="RuleName">4</span>   <span class="Meta">.</span> # <span class="RuleName">3</span>   <span class="Meta">.</span> #   # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="RuleName">2</span> #   # <span class="VariableName">+</span>     # <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #
+#####################   #####   #################   #####   #   #####   #####   #
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #               #         <span class="RuleName">2</span>         # <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> # <span class="Meta">.</span>   <span class="Meta">.</span> #
+#   #################################   #   #############################   #####
+# <span class="RuleName">2</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="VariableName">+</span> #           #                           # <span class="Meta">.</span>   <span class="Meta">.</span> #   #
+#########################   #   #################################   #   #####   #
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span> #                                       # <span class="Meta">.</span> #       #
+#   #################################################################   #####   #
+# <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>   <span class="Meta">.</span>       <span class="VariableName">+</span> #
+#################################################################################
+</pre>

commit dde5983d88ac9102f18f83b3a2c24ebc57f8b2f8
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 15 22:05:08 2025 +0100

    Fix bug in sorting code

diff --git a/blog.py b/blog.py
index b10f4c0..61634cf 100755
--- a/blog.py
+++ b/blog.py
@@ -324,7 +324,7 @@ class Posts:
         ul = Tag("ul")
         for post in sorted(
             self.by_id.values(),
-            key=lambda post: post.date,
+            key=lambda post: post.date.date,
             reverse=True
         ):
             li = Tag("li")

2025-12-15 07:27 Rickard pushed to rlworkbench

fatal: Invalid revision range 08b36fc69880c7b7e53b09492fb04a980bb6d929..ccd1cf99946300ef6fbf2e7db0c1beda98ccd654

2025-12-15 07:13 Rickard pushed to rlworkbench

fatal: Invalid revision range 13c31b3fd4b76279834bca34084fb2ba724a1289..08b36fc69880c7b7e53b09492fb04a980bb6d929

2025-12-14 14:21 Rickard pushed to blog

commit fedefd512f79347a931b2f075a36f8d5df2b9fd8
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sun Dec 14 14:21:14 2025 +0100

    Add aoc tag

diff --git a/posts/2025/12/13/advent-of-code-2025/post.md b/posts/2025/12/13/advent-of-code-2025/post.md
index 4994d11..604e5b9 100644
--- a/posts/2025/12/13/advent-of-code-2025/post.md
+++ b/posts/2025/12/13/advent-of-code-2025/post.md
@@ -1,7 +1,7 @@
 ---
 date: 2025-12-14 14:20:00
 title: Advent of Code 2025
-tags: rlworkbench,c
+tags: rlworkbench,c,aoc
 ---
 
 <style type="text/css">

2025-12-14 14:20 Rickard pushed to blog

commit 9ecacb38906777388e05c6deeccdb477602c0288
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sun Dec 14 14:20:50 2025 +0100

    Advent of Code 2025

diff --git a/posts/2025/12/13/advent-of-code-2025/aoc20251-parser-only.meta b/posts/2025/12/13/advent-of-code-2025/aoc20251-parser-only.meta
new file mode 100644
index 0000000..0669e1a
--- /dev/null
+++ b/posts/2025/12/13/advent-of-code-2025/aoc20251-parser-only.meta
@@ -0,0 +1,14 @@
+main = instruction* !.;
+
+instruction = 
+    | left
+    | right
+    ;
+
+left[Reserved] = 'L' number '\n';
+
+right[RuleName] = 'R' number '\n';
+
+number = digit digit*;
+
+digit = '0'-'9';
diff --git a/posts/2025/12/13/advent-of-code-2025/aoc20251.meta b/posts/2025/12/13/advent-of-code-2025/aoc20251.meta
new file mode 100644
index 0000000..f843124
--- /dev/null
+++ b/posts/2025/12/13/advent-of-code-2025/aoc20251.meta
@@ -0,0 +1,54 @@
+main = instruction*:xs !. -> {
+    $dialSize
+    >dialSize { "100" }
+    "#include <stdio.h>\n"
+    "typedef struct {\n" >
+        "unsigned int positive_offset;\n"
+        "unsigned int partial;\n"
+        "unsigned int complete;\n"
+    < "} Turn;\n"
+    "static Turn turns[] = {\n" >
+        xs
+    < "};\n"
+    "static unsigned int number_of_turns = " xs.count ";\n"
+    "int main(void) {\n" >
+        "unsigned int dial_position = 50;\n"
+        "unsigned int times_ended_at_zero = 0;\n"
+        "unsigned int times_at_zero = 0;\n"
+        "unsigned int turn_index;\n"
+        "unsigned int partial_counter;\n"
+        "for(turn_index=0; turn_index<number_of_turns; turn_index++) {\n" >
+            "for(partial_counter=0; partial_counter<turns[turn_index].partial; partial_counter++) {\n" >
+                "dial_position += turns[turn_index].positive_offset;\n"
+                "dial_position %= " <dialSize ";\n"
+                "if (dial_position == 0) {\n" >
+                    "times_at_zero += 1;\n"
+                < "}\n"
+            < "}\n"
+            "if (dial_position == 0) {\n" >
+                "times_ended_at_zero += 1;\n"
+            < "}\n"
+            "times_at_zero += turns[turn_index].complete;\n"
+        < "}\n"
+        "printf(\"Part 1: %d\\n\", times_ended_at_zero);\n"
+        "printf(\"Part 2: %d\\n\", times_at_zero);\n"
+        "return 0;\n"
+    < "}\n"
+};
+
+instruction = 
+    | left:x -> { x }
+    | right:x -> { x }
+    ;
+
+left[Reserved] = 'L' number:x '\n' -> {
+    "{" <dialSize "-1, " x "%" <dialSize ", " x "/" <dialSize "},\n"
+};
+
+right[RuleName] = 'R' number:x '\n' -> {
+    "{1, " x "%" <dialSize ", " x "/" <dialSize "},\n"
+};
+
+number = digit digit*;
+
+digit = '0'-'9';
diff --git a/posts/2025/12/13/advent-of-code-2025/example.aoc20251 b/posts/2025/12/13/advent-of-code-2025/example.aoc20251
new file mode 100644
index 0000000..53287c7
--- /dev/null
+++ b/posts/2025/12/13/advent-of-code-2025/example.aoc20251
@@ -0,0 +1,10 @@
+L68
+L30
+R48
+L5
+R60
+L55
+L1
+L99
+R14
+L82
diff --git a/posts/2025/12/13/advent-of-code-2025/example_aoc20251.c b/posts/2025/12/13/advent-of-code-2025/example_aoc20251.c
new file mode 100644
index 0000000..f426d74
--- /dev/null
+++ b/posts/2025/12/13/advent-of-code-2025/example_aoc20251.c
@@ -0,0 +1,42 @@
+#include <stdio.h>
+typedef struct {
+    unsigned int positive_offset;
+    unsigned int partial;
+    unsigned int complete;
+} Turn;
+static Turn turns[] = {
+    {100-1, 68%100, 68/100},
+    {100-1, 30%100, 30/100},
+    {1, 48%100, 48/100},
+    {100-1, 5%100, 5/100},
+    {1, 60%100, 60/100},
+    {100-1, 55%100, 55/100},
+    {100-1, 1%100, 1/100},
+    {100-1, 99%100, 99/100},
+    {1, 14%100, 14/100},
+    {100-1, 82%100, 82/100},
+};
+static unsigned int number_of_turns = 10;
+int main(void) {
+    unsigned int dial_position = 50;
+    unsigned int times_ended_at_zero = 0;
+    unsigned int times_at_zero = 0;
+    unsigned int turn_index;
+    unsigned int partial_counter;
+    for(turn_index=0; turn_index<number_of_turns; turn_index++) {
+        for(partial_counter=0; partial_counter<turns[turn_index].partial; partial_counter++) {
+            dial_position += turns[turn_index].positive_offset;
+            dial_position %= 100;
+            if (dial_position == 0) {
+                times_at_zero += 1;
+            }
+        }
+        if (dial_position == 0) {
+            times_ended_at_zero += 1;
+        }
+        times_at_zero += turns[turn_index].complete;
+    }
+    printf("Part 1: %d\n", times_ended_at_zero);
+    printf("Part 2: %d\n", times_at_zero);
+    return 0;
+}
diff --git a/posts/2025/12/13/advent-of-code-2025/interesting.c b/posts/2025/12/13/advent-of-code-2025/interesting.c
new file mode 100644
index 0000000..51b48c5
--- /dev/null
+++ b/posts/2025/12/13/advent-of-code-2025/interesting.c
@@ -0,0 +1,13 @@
+static Turn turns[] = {
+    {100-1, 68%100, 68/100},
+    {100-1, 30%100, 30/100},
+    {1, 48%100, 48/100},
+    {100-1, 5%100, 5/100},
+    {1, 60%100, 60/100},
+    {100-1, 55%100, 55/100},
+    {100-1, 1%100, 1/100},
+    {100-1, 99%100, 99/100},
+    {1, 14%100, 14/100},
+    {100-1, 82%100, 82/100},
+};
+static unsigned int number_of_turns = 10;
diff --git a/posts/2025/12/13/advent-of-code-2025/post.md b/posts/2025/12/13/advent-of-code-2025/post.md
new file mode 100644
index 0000000..4994d11
--- /dev/null
+++ b/posts/2025/12/13/advent-of-code-2025/post.md
@@ -0,0 +1,666 @@
+---
+date: 2025-12-14 14:20:00
+title: Advent of Code 2025
+tags: rlworkbench,c
+---
+
+<style type="text/css">
+pre { padding: 10px; }
+pre.highlight                    { background: #002b36; }
+pre.highlight                    { color: #93a1a1; }
+pre.highlight span.Meta          { color: #d33682; }
+pre.highlight span.Reserved      { color: #859900; }
+pre.highlight span.String        { color: #2aa198; }
+pre.highlight span.CharString    { color: #ffffff; }
+pre.highlight span.Escape        { color: #dc322f; }
+pre.highlight span.RuleName      { color: #268bd2; }
+pre.highlight span.VariableName  { color: #b58900; }
+</style>
+
+**Warning: This blog post contains spoilers. If you don't want any insights
+into this years' puzzles, stop reading now.**
+
+I couldn't resist participating in [Advent of Code](https://adventofcode.com)
+this year either.
+
+Usually I challenge myself by solving the puzzles in some new kind of way.
+This year I decided to take a meta approach. What does that mean?
+
+In my [last
+newsletter](https://buttondown.com/rickardlindberg/archive/november-2025-can-rlworkbench-replace-vim/),
+I wrote about my new project, rlworkbench, where I try to build a [language
+workbench](https://en.wikipedia.org/wiki/Language_workbench). What is that?
+What am I trying to build?
+
+The way I think about it is that rlworkbench should be a text editor that is
+aware of the language of the text that is being edited. That awareness can give
+you syntax highlighting for example. But it can also give you more if it knows
+more about the language. For example, there might be an editor operation to
+expand the selection. If the cursor is inside a function, expanding the
+selection might select the whole function. Because the editor is aware of the
+language, it knows where the function starts and ends. Furthermore, defining
+the languages that rlworkbench knows about should be easy. And the norm should
+be to create many small domain specific languages. And when you define a
+language, it not only gives you editor support, but you can also define how
+that language should be compiled or translated.
+
+How does that relate to Advent of Code?
+
+Think of every day's puzzle input as its own language. The input is the
+program. Your job is to write a parser and code generator for that language.
+The parser provides editor support and the code generator compiles the puzzle
+input into something that can be executed. Because rlworkbench is written
+in C, and because I want to practice writing more C, I chose to make all code
+generators output C code.
+
+So the general shape of my solutions this year looked something like this:
+
+1. Write a parser for day X in the meta language of rlworkbench
+2. Write a code generator that transforms the input of day X into a C program
+3. Compile and run that C program
+4. Watch it print solutions for part 1 and part 2
+
+Since you usually don't edit the puzzle input, it is a bit contrived to see it
+as a language. But, hey, I wanted to experiment.
+
+Let's walk through day 1 in a bit of detail to show my process this year. Then
+I will continue with some highlights from each day.
+
+## Day 1
+
+The example input for [day 1](https://adventofcode.com/2025/day/1) looks like
+this:
+
+    L68
+    L30
+    R48
+    L5
+    R60
+    L55
+    L1
+    L99
+    R14
+    L82
+
+It is a sequence of instructions for how to rotate a dial.
+
+Here is a parser for this language, written in the meta language of
+rlworkbench:
+
+<pre class="highlight"><span class="RuleName">m</span><span class="RuleName">a</span><span class="RuleName">i</span><span class="RuleName">n</span> = <span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">s</span><span class="RuleName">t</span><span class="RuleName">r</span><span class="RuleName">u</span><span class="RuleName">c</span><span class="RuleName">t</span><span class="RuleName">i</span><span class="RuleName">o</span><span class="RuleName">n</span><span class="Reserved">*</span> <span class="Reserved">!</span><span class="Reserved">.</span>;
+
+<span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">s</span><span class="RuleName">t</span><span class="RuleName">r</span><span class="RuleName">u</span><span class="RuleName">c</span><span class="RuleName">t</span><span class="RuleName">i</span><span class="RuleName">o</span><span class="RuleName">n</span> =
+    <span class="Reserved">|</span> <span class="RuleName">l</span><span class="RuleName">e</span><span class="RuleName">f</span><span class="RuleName">t</span>
+    <span class="Reserved">|</span> <span class="RuleName">r</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span>
+    ;
+
+<span class="RuleName">l</span><span class="RuleName">e</span><span class="RuleName">f</span><span class="RuleName">t</span>[<span class="Meta">R</span><span class="Meta">e</span><span class="Meta">s</span><span class="Meta">e</span><span class="Meta">r</span><span class="Meta">v</span><span class="Meta">e</span><span class="Meta">d</span>] = <span class="CharString">'</span><span class="CharString">L</span><span class="CharString">'</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="CharString">'</span><span class="Escape">\</span><span class="Escape">n</span><span class="CharString">'</span>;
+
+<span class="RuleName">r</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span>[<span class="Meta">R</span><span class="Meta">u</span><span class="Meta">l</span><span class="Meta">e</span><span class="Meta">N</span><span class="Meta">a</span><span class="Meta">m</span><span class="Meta">e</span>] = <span class="CharString">'</span><span class="CharString">R</span><span class="CharString">'</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="CharString">'</span><span class="Escape">\</span><span class="Escape">n</span><span class="CharString">'</span>;
+
+<span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> = <span class="RuleName">d</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">i</span><span class="RuleName">t</span> <span class="RuleName">d</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">*</span>;
+
+<span class="RuleName">d</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">i</span><span class="RuleName">t</span> = <span class="CharString">'</span><span class="CharString">0</span><span class="CharString">'</span>-<span class="CharString">'</span><span class="CharString">9</span><span class="CharString">'</span>;
+</pre>
+
+The meta language can describe other languages. Hence the word meta. (It is
+highly influenced by [META II](https://en.wikipedia.org/wiki/META_II).)
+
+The parsing begins at `main`. Here we say that the input is a sequence of
+`instruction` followed by the end of file. The end of file is detected by
+matching "not anything".
+
+Next we say that an `instruction` can either be `left` or `right` (checked in
+that order). They are matched by checking for the character `L`/`R` followed by
+a `number` and a newline. The `Reserved` and `RuleName` are names of highlight
+groups that should be used for the match.
+
+Then finally a `number` is one ore more `digit`. And a `digit` is any
+character in the range 0-9.
+
+Now that we have a parser for this language, we can open the input file in
+rlworkbench and it will highlight it like this:
+
+<pre class="highlight"><span class="Reserved">L</span><span class="Reserved">6</span><span class="Reserved">8</span><span class="Reserved">
+</span><span class="Reserved">L</span><span class="Reserved">3</span><span class="Reserved">0</span><span class="Reserved">
+</span><span class="RuleName">R</span><span class="RuleName">4</span><span class="RuleName">8</span><span class="RuleName">
+</span><span class="Reserved">L</span><span class="Reserved">5</span><span class="Reserved">
+</span><span class="RuleName">R</span><span class="RuleName">6</span><span class="RuleName">0</span><span class="RuleName">
+</span><span class="Reserved">L</span><span class="Reserved">5</span><span class="Reserved">5</span><span class="Reserved">
+</span><span class="Reserved">L</span><span class="Reserved">1</span><span class="Reserved">
+</span><span class="Reserved">L</span><span class="Reserved">9</span><span class="Reserved">9</span><span class="Reserved">
+</span><span class="RuleName">R</span><span class="RuleName">1</span><span class="RuleName">4</span><span class="RuleName">
+</span><span class="Reserved">L</span><span class="Reserved">8</span><span class="Reserved">2</span><span class="Reserved">
+</span></pre>
+
+Pretty cool. The highlighting can help you gain insight into the data. For
+example, you could quite quickly see the distribution of left and right turns.
+
+How can we make this run? Let's augment the parser with code generation
+instructions:
+
+<pre class="highlight"><span class="RuleName">m</span><span class="RuleName">a</span><span class="RuleName">i</span><span class="RuleName">n</span> = <span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">s</span><span class="RuleName">t</span><span class="RuleName">r</span><span class="RuleName">u</span><span class="RuleName">c</span><span class="RuleName">t</span><span class="RuleName">i</span><span class="RuleName">o</span><span class="RuleName">n</span><span class="Reserved">*</span><span class="Reserved">:</span><span class="VariableName">x</span><span class="VariableName">s</span> <span class="Reserved">!</span><span class="Reserved">.</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> {
+    $dialSize
+    &gt;dialSize { <span class="String">&quot;</span><span class="String">1</span><span class="String">0</span><span class="String">0</span><span class="String">&quot;</span> }
+    <span class="String">&quot;</span><span class="String">#</span><span class="String">i</span><span class="String">n</span><span class="String">c</span><span class="String">l</span><span class="String">u</span><span class="String">d</span><span class="String">e</span><span class="String"> </span><span class="String">&lt;</span><span class="String">s</span><span class="String">t</span><span class="String">d</span><span class="String">i</span><span class="String">o</span><span class="String">.</span><span class="String">h</span><span class="String">&gt;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    <span class="String">&quot;</span><span class="String">t</span><span class="String">y</span><span class="String">p</span><span class="String">e</span><span class="String">d</span><span class="String">e</span><span class="String">f</span><span class="String"> </span><span class="String">s</span><span class="String">t</span><span class="String">r</span><span class="String">u</span><span class="String">c</span><span class="String">t</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">v</span><span class="String">e</span><span class="String">_</span><span class="String">o</span><span class="String">f</span><span class="String">f</span><span class="String">s</span><span class="String">e</span><span class="String">t</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">p</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">c</span><span class="String">o</span><span class="String">m</span><span class="String">p</span><span class="String">l</span><span class="String">e</span><span class="String">t</span><span class="String">e</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    &lt; <span class="String">&quot;</span><span class="String">}</span><span class="String"> </span><span class="String">T</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    <span class="String">&quot;</span><span class="String">s</span><span class="String">t</span><span class="String">a</span><span class="String">t</span><span class="String">i</span><span class="String">c</span><span class="String"> </span><span class="String">T</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String"> </span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">s</span><span class="String">[</span><span class="String">]</span><span class="String"> </span><span class="String">=</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+        <span class="VariableName">x</span><span class="VariableName">s</span>
+    &lt; <span class="String">&quot;</span><span class="String">}</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    <span class="String">&quot;</span><span class="String">s</span><span class="String">t</span><span class="String">a</span><span class="String">t</span><span class="String">i</span><span class="String">c</span><span class="String"> </span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">n</span><span class="String">u</span><span class="String">m</span><span class="String">b</span><span class="String">e</span><span class="String">r</span><span class="String">_</span><span class="String">o</span><span class="String">f</span><span class="String">_</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">s</span><span class="String"> </span><span class="String">=</span><span class="String"> </span><span class="String">&quot;</span> <span class="VariableName">x</span><span class="VariableName">s</span>.count <span class="String">&quot;</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    <span class="String">&quot;</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">m</span><span class="String">a</span><span class="String">i</span><span class="String">n</span><span class="String">(</span><span class="String">v</span><span class="String">o</span><span class="String">i</span><span class="String">d</span><span class="String">)</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">d</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">o</span><span class="String">n</span><span class="String"> </span><span class="String">=</span><span class="String"> </span><span class="String">5</span><span class="String">0</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">e</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">d</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String"> </span><span class="String">=</span><span class="String"> </span><span class="String">0</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String"> </span><span class="String">=</span><span class="String"> </span><span class="String">0</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">u</span><span class="String">n</span><span class="String">s</span><span class="String">i</span><span class="String">g</span><span class="String">n</span><span class="String">e</span><span class="String">d</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">p</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">c</span><span class="String">o</span><span class="String">u</span><span class="String">n</span><span class="String">t</span><span class="String">e</span><span class="String">r</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">f</span><span class="String">o</span><span class="String">r</span><span class="String">(</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">=</span><span class="String">0</span><span class="String">;</span><span class="String"> </span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">&lt;</span><span class="String">n</span><span class="String">u</span><span class="String">m</span><span class="String">b</span><span class="String">e</span><span class="String">r</span><span class="String">_</span><span class="String">o</span><span class="String">f</span><span class="String">_</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">s</span><span class="String">;</span><span class="String"> </span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">+</span><span class="String">+</span><span class="String">)</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+            <span class="String">&quot;</span><span class="String">f</span><span class="String">o</span><span class="String">r</span><span class="String">(</span><span class="String">p</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">c</span><span class="String">o</span><span class="String">u</span><span class="String">n</span><span class="String">t</span><span class="String">e</span><span class="String">r</span><span class="String">=</span><span class="String">0</span><span class="String">;</span><span class="String"> </span><span class="String">p</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">c</span><span class="String">o</span><span class="String">u</span><span class="String">n</span><span class="String">t</span><span class="String">e</span><span class="String">r</span><span class="String">&lt;</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">s</span><span class="String">[</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">]</span><span class="String">.</span><span class="String">p</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">;</span><span class="String"> </span><span class="String">p</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">c</span><span class="String">o</span><span class="String">u</span><span class="String">n</span><span class="String">t</span><span class="String">e</span><span class="String">r</span><span class="String">+</span><span class="String">+</span><span class="String">)</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+                <span class="String">&quot;</span><span class="String">d</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">o</span><span class="String">n</span><span class="String"> </span><span class="String">+</span><span class="String">=</span><span class="String"> </span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">s</span><span class="String">[</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">]</span><span class="String">.</span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">v</span><span class="String">e</span><span class="String">_</span><span class="String">o</span><span class="String">f</span><span class="String">f</span><span class="String">s</span><span class="String">e</span><span class="String">t</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+                <span class="String">&quot;</span><span class="String">d</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">o</span><span class="String">n</span><span class="String"> </span><span class="String">%</span><span class="String">=</span><span class="String"> </span><span class="String">&quot;</span> &lt;dialSize <span class="String">&quot;</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+                <span class="String">&quot;</span><span class="String">i</span><span class="String">f</span><span class="String"> </span><span class="String">(</span><span class="String">d</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">o</span><span class="String">n</span><span class="String"> </span><span class="String">=</span><span class="String">=</span><span class="String"> </span><span class="String">0</span><span class="String">)</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+                    <span class="String">&quot;</span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String"> </span><span class="String">+</span><span class="String">=</span><span class="String"> </span><span class="String">1</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+                &lt; <span class="String">&quot;</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+            &lt; <span class="String">&quot;</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+            <span class="String">&quot;</span><span class="String">i</span><span class="String">f</span><span class="String"> </span><span class="String">(</span><span class="String">d</span><span class="String">i</span><span class="String">a</span><span class="String">l</span><span class="String">_</span><span class="String">p</span><span class="String">o</span><span class="String">s</span><span class="String">i</span><span class="String">t</span><span class="String">i</span><span class="String">o</span><span class="String">n</span><span class="String"> </span><span class="String">=</span><span class="String">=</span><span class="String"> </span><span class="String">0</span><span class="String">)</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+                <span class="String">&quot;</span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">e</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">d</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String"> </span><span class="String">+</span><span class="String">=</span><span class="String"> </span><span class="String">1</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+            &lt; <span class="String">&quot;</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+            <span class="String">&quot;</span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String"> </span><span class="String">+</span><span class="String">=</span><span class="String"> </span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">s</span><span class="String">[</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String">_</span><span class="String">i</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">x</span><span class="String">]</span><span class="String">.</span><span class="String">c</span><span class="String">o</span><span class="String">m</span><span class="String">p</span><span class="String">l</span><span class="String">e</span><span class="String">t</span><span class="String">e</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        &lt; <span class="String">&quot;</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">p</span><span class="String">r</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String">f</span><span class="String">(</span><span class="Escape">\</span><span class="Escape">&quot;</span><span class="String">P</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String"> </span><span class="String">1</span><span class="String">:</span><span class="String"> </span><span class="String">%</span><span class="String">d</span><span class="Escape">\</span><span class="Escape">\</span><span class="String">n</span><span class="Escape">\</span><span class="Escape">&quot;</span><span class="String">,</span><span class="String"> </span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">e</span><span class="String">n</span><span class="String">d</span><span class="String">e</span><span class="String">d</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String">)</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">p</span><span class="String">r</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String">f</span><span class="String">(</span><span class="Escape">\</span><span class="Escape">&quot;</span><span class="String">P</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String"> </span><span class="String">2</span><span class="String">:</span><span class="String"> </span><span class="String">%</span><span class="String">d</span><span class="Escape">\</span><span class="Escape">\</span><span class="String">n</span><span class="Escape">\</span><span class="Escape">&quot;</span><span class="String">,</span><span class="String"> </span><span class="String">t</span><span class="String">i</span><span class="String">m</span><span class="String">e</span><span class="String">s</span><span class="String">_</span><span class="String">a</span><span class="String">t</span><span class="String">_</span><span class="String">z</span><span class="String">e</span><span class="String">r</span><span class="String">o</span><span class="String">)</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">r</span><span class="String">e</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String"> </span><span class="String">0</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    &lt; <span class="String">&quot;</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+};
+
+<span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">s</span><span class="RuleName">t</span><span class="RuleName">r</span><span class="RuleName">u</span><span class="RuleName">c</span><span class="RuleName">t</span><span class="RuleName">i</span><span class="RuleName">o</span><span class="RuleName">n</span> =
+    <span class="Reserved">|</span> <span class="RuleName">l</span><span class="RuleName">e</span><span class="RuleName">f</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">r</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    ;
+
+<span class="RuleName">l</span><span class="RuleName">e</span><span class="RuleName">f</span><span class="RuleName">t</span>[<span class="Meta">R</span><span class="Meta">e</span><span class="Meta">s</span><span class="Meta">e</span><span class="Meta">r</span><span class="Meta">v</span><span class="Meta">e</span><span class="Meta">d</span>] = <span class="CharString">'</span><span class="CharString">L</span><span class="CharString">'</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="CharString">'</span><span class="Escape">\</span><span class="Escape">n</span><span class="CharString">'</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> {
+    <span class="String">&quot;</span><span class="String">{</span><span class="String">&quot;</span> &lt;dialSize <span class="String">&quot;</span><span class="String">-</span><span class="String">1</span><span class="String">,</span><span class="String"> </span><span class="String">&quot;</span> <span class="VariableName">x</span> <span class="String">&quot;</span><span class="String">%</span><span class="String">&quot;</span> &lt;dialSize <span class="String">&quot;</span><span class="String">,</span><span class="String"> </span><span class="String">&quot;</span> <span class="VariableName">x</span> <span class="String">&quot;</span><span class="String">/</span><span class="String">&quot;</span> &lt;dialSize <span class="String">&quot;</span><span class="String">}</span><span class="String">,</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+};
+
+<span class="RuleName">r</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span>[<span class="Meta">R</span><span class="Meta">u</span><span class="Meta">l</span><span class="Meta">e</span><span class="Meta">N</span><span class="Meta">a</span><span class="Meta">m</span><span class="Meta">e</span>] = <span class="CharString">'</span><span class="CharString">R</span><span class="CharString">'</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="CharString">'</span><span class="Escape">\</span><span class="Escape">n</span><span class="CharString">'</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> {
+    <span class="String">&quot;</span><span class="String">{</span><span class="String">1</span><span class="String">,</span><span class="String"> </span><span class="String">&quot;</span> <span class="VariableName">x</span> <span class="String">&quot;</span><span class="String">%</span><span class="String">&quot;</span> &lt;dialSize <span class="String">&quot;</span><span class="String">,</span><span class="String"> </span><span class="String">&quot;</span> <span class="VariableName">x</span> <span class="String">&quot;</span><span class="String">/</span><span class="String">&quot;</span> &lt;dialSize <span class="String">&quot;</span><span class="String">}</span><span class="String">,</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+};
+
+<span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> = <span class="RuleName">d</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">i</span><span class="RuleName">t</span> <span class="RuleName">d</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">*</span>;
+
+<span class="RuleName">d</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">i</span><span class="RuleName">t</span> = <span class="CharString">'</span><span class="CharString">0</span><span class="CharString">'</span>-<span class="CharString">'</span><span class="CharString">9</span><span class="CharString">'</span>;
+</pre>
+
+In the meta language, we can add semantic actions to rules with the ` -> { ...
+}` syntax. It specifies what should be generated when this rule is matched. We
+can bind sub matches to variables using the `<expression>:<name>` syntax.
+
+When we generate code for the example, we get this C program:
+
+<pre class="highlight"><span class="CharString">#</span><span class="CharString">i</span><span class="CharString">n</span><span class="CharString">c</span><span class="CharString">l</span><span class="CharString">u</span><span class="CharString">d</span><span class="CharString">e</span><span class="CharString"> </span><span class="CharString">&lt;</span><span class="CharString">s</span><span class="CharString">t</span><span class="CharString">d</span><span class="CharString">i</span><span class="CharString">o</span><span class="CharString">.</span><span class="CharString">h</span><span class="CharString">&gt;</span><span class="CharString">
+</span><span class="VariableName">t</span><span class="VariableName">y</span><span class="VariableName">p</span><span class="VariableName">e</span><span class="VariableName">d</span><span class="VariableName">e</span><span class="VariableName">f</span> <span class="VariableName">s</span><span class="VariableName">t</span><span class="VariableName">r</span><span class="VariableName">u</span><span class="VariableName">c</span><span class="VariableName">t</span> {
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> positive_offset;
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> partial;
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> complete;
+} Turn;
+<span class="VariableName">s</span><span class="VariableName">t</span><span class="VariableName">a</span><span class="VariableName">t</span><span class="VariableName">i</span><span class="VariableName">c</span> Turn turns[] = {
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">6</span><span class="String">8</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">6</span><span class="String">8</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">3</span><span class="String">0</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">3</span><span class="String">0</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span>, <span class="String">4</span><span class="String">8</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">4</span><span class="String">8</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">5</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">5</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span>, <span class="String">6</span><span class="String">0</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">6</span><span class="String">0</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">5</span><span class="String">5</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">5</span><span class="String">5</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">1</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">1</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">9</span><span class="String">9</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">9</span><span class="String">9</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span>, <span class="String">1</span><span class="String">4</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">1</span><span class="String">4</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">8</span><span class="String">2</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">8</span><span class="String">2</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+};
+<span class="VariableName">s</span><span class="VariableName">t</span><span class="VariableName">a</span><span class="VariableName">t</span><span class="VariableName">i</span><span class="VariableName">c</span> <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> number_of_turns = <span class="String">1</span><span class="String">0</span>;
+<span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> main(<span class="VariableName">v</span><span class="VariableName">o</span><span class="VariableName">i</span><span class="VariableName">d</span>) {
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> dial_position = <span class="String">5</span><span class="String">0</span>;
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> times_ended_at_zero = <span class="String">0</span>;
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> times_at_zero = <span class="String">0</span>;
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> turn_index;
+    <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> partial_counter;
+    <span class="Reserved">f</span><span class="Reserved">o</span><span class="Reserved">r</span>(turn_index=<span class="String">0</span>; turn_index&lt;number_of_turns; turn_index++) {
+        <span class="Reserved">f</span><span class="Reserved">o</span><span class="Reserved">r</span>(partial_counter=<span class="String">0</span>; partial_counter&lt;turns[turn_index].partial; partial_counter++) {
+            dial_position += turns[turn_index].positive_offset;
+            dial_position %= <span class="String">1</span><span class="String">0</span><span class="String">0</span>;
+            <span class="Reserved">i</span><span class="Reserved">f</span> (dial_position == <span class="String">0</span>) {
+                times_at_zero += <span class="String">1</span>;
+            }
+        }
+        <span class="Reserved">i</span><span class="Reserved">f</span> (dial_position == <span class="String">0</span>) {
+            times_ended_at_zero += <span class="String">1</span>;
+        }
+        times_at_zero += turns[turn_index].complete;
+    }
+    printf(<span class="String">&quot;</span><span class="String">P</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String"> </span><span class="String">1</span><span class="String">:</span><span class="String"> </span><span class="String">%</span><span class="String">d</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>, times_ended_at_zero);
+    printf(<span class="String">&quot;</span><span class="String">P</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String"> </span><span class="String">2</span><span class="String">:</span><span class="String"> </span><span class="String">%</span><span class="String">d</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>, times_at_zero);
+    <span class="Reserved">r</span><span class="Reserved">e</span><span class="Reserved">t</span><span class="Reserved">u</span><span class="Reserved">r</span><span class="Reserved">n</span> <span class="String">0</span>;
+}
+</pre>
+
+So the majority of the code generation is outputting static C code. The most
+"dynamic" part is this:
+
+<pre class="highlight"><span class="VariableName">s</span><span class="VariableName">t</span><span class="VariableName">a</span><span class="VariableName">t</span><span class="VariableName">i</span><span class="VariableName">c</span> Turn turns[] = {
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">6</span><span class="String">8</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">6</span><span class="String">8</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">3</span><span class="String">0</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">3</span><span class="String">0</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span>, <span class="String">4</span><span class="String">8</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">4</span><span class="String">8</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">5</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">5</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span>, <span class="String">6</span><span class="String">0</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">6</span><span class="String">0</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">5</span><span class="String">5</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">5</span><span class="String">5</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">1</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">1</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">9</span><span class="String">9</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">9</span><span class="String">9</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span>, <span class="String">1</span><span class="String">4</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">1</span><span class="String">4</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+    {<span class="String">1</span><span class="String">0</span><span class="String">0</span>-<span class="String">1</span>, <span class="String">8</span><span class="String">2</span>%<span class="String">1</span><span class="String">0</span><span class="String">0</span>, <span class="String">8</span><span class="String">2</span>/<span class="String">1</span><span class="String">0</span><span class="String">0</span>},
+};
+<span class="VariableName">s</span><span class="VariableName">t</span><span class="VariableName">a</span><span class="VariableName">t</span><span class="VariableName">i</span><span class="VariableName">c</span> <span class="VariableName">u</span><span class="VariableName">n</span><span class="VariableName">s</span><span class="VariableName">i</span><span class="VariableName">g</span><span class="VariableName">n</span><span class="VariableName">e</span><span class="VariableName">d</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> number_of_turns = <span class="String">1</span><span class="String">0</span>;
+</pre>
+
+The code generator transforms the input into a data structure in C that is easy
+to work with.  We could have generated just this part and then written the rest
+of the C code outside the meta language. It wouldn't exactly work in this case
+because the `dialSize` is used as a variable in the meta language. But we could
+have generated a constant in C with this value. But for the purposes of this
+year's Advent of Code puzzles, I chose to write all C code in the meta
+language. The meta language is implemented in itself and it generates more
+complicated C code than this example. So writing C code in the meta language
+code generation part is an actual use case and if it's not easy to do, we
+should make it easier.  After all, we are in complete control of how the meta
+language works.
+
+I actually struggled to solve day 1. Not because of the new approach with meta
+and not because of C which is a new language for me. The main struggle I had
+was that I didn't want to do the inner loop at first. I thought it would be too
+wasteful. And then I couldn't get all arithmetic right. I actually looked up
+other solutions for part 2. Then I decided to just implement the inner loop and
+it worked fine.
+
+From today's puzzle, I also learned that the `%` operator works differently in
+C and Python.
+
+In C:
+
+     7 % 5 => 2
+    -7 % 5 => -2
+
+In Python:
+
+     7 % 5 => 2
+    -7 % 5 => 3
+
+Furthermore I learned that the behavior in C89 could differ between
+implementations if negative operators are used. That's why I wanted to use
+unsigned numbers in my implementation. Because those I could reason about.
+
+## Day 2
+
+I got to practice string manipulation code in C. Like this for example. Nice!
+
+<pre class="highlight"><span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> eq(<span class="VariableName">c</span><span class="VariableName">h</span><span class="VariableName">a</span><span class="VariableName">r</span>* one, <span class="VariableName">c</span><span class="VariableName">h</span><span class="VariableName">a</span><span class="VariableName">r</span>* two, size_t len) {
+    <span class="Reserved">w</span><span class="Reserved">h</span><span class="Reserved">i</span><span class="Reserved">l</span><span class="Reserved">e</span> (len &gt; <span class="String">0</span>) {
+        <span class="Reserved">i</span><span class="Reserved">f</span> (*one != *two) {
+            <span class="Reserved">r</span><span class="Reserved">e</span><span class="Reserved">t</span><span class="Reserved">u</span><span class="Reserved">r</span><span class="Reserved">n</span> <span class="String">0</span>;
+        };
+        one++;
+        two++;
+        len--;
+    }
+    <span class="Reserved">r</span><span class="Reserved">e</span><span class="Reserved">t</span><span class="Reserved">u</span><span class="Reserved">r</span><span class="Reserved">n</span> <span class="String">1</span>;
+}
+</pre>
+
+## Day 3
+
+This was probably one of the more fun days for me because I was able to solve
+the puzzle almost entirely in the meta language. Here is the solution for part
+1:
+
+<pre class="highlight"><span class="RuleName">m</span><span class="RuleName">a</span><span class="RuleName">i</span><span class="RuleName">n</span> = <span class="RuleName">b</span><span class="RuleName">a</span><span class="RuleName">n</span><span class="RuleName">k</span><span class="RuleName">2</span><span class="Reserved">*</span><span class="Reserved">:</span><span class="VariableName">x</span><span class="VariableName">s</span> <span class="Reserved">!</span><span class="Reserved">.</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> {
+    <span class="String">&quot;</span><span class="String">#</span><span class="String">i</span><span class="String">n</span><span class="String">c</span><span class="String">l</span><span class="String">u</span><span class="String">d</span><span class="String">e</span><span class="String"> </span><span class="String">&lt;</span><span class="String">s</span><span class="String">t</span><span class="String">d</span><span class="String">i</span><span class="String">o</span><span class="String">.</span><span class="String">h</span><span class="String">&gt;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    <span class="String">&quot;</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">m</span><span class="String">a</span><span class="String">i</span><span class="String">n</span><span class="String">(</span><span class="String">v</span><span class="String">o</span><span class="String">i</span><span class="String">d</span><span class="String">)</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+        <span class="String">&quot;</span><span class="String">p</span><span class="String">r</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String">f</span><span class="String">(</span><span class="Escape">\</span><span class="Escape">&quot;</span><span class="String">P</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String"> </span><span class="String">1</span><span class="String">:</span><span class="String"> </span><span class="String">%</span><span class="String">l</span><span class="String">d</span><span class="Escape">\</span><span class="Escape">\</span><span class="String">n</span><span class="Escape">\</span><span class="Escape">&quot;</span><span class="String">,</span><span class="String"> </span><span class="String">(</span><span class="String">l</span><span class="String">o</span><span class="String">n</span><span class="String">g</span><span class="String"> </span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String">)</span><span class="String">(</span><span class="String">0</span><span class="String">&quot;</span> <span class="VariableName">x</span><span class="VariableName">s</span> <span class="String">&quot;</span><span class="String">)</span><span class="String">)</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+        <span class="String">&quot;</span><span class="String">r</span><span class="String">e</span><span class="String">t</span><span class="String">u</span><span class="String">r</span><span class="String">n</span><span class="String"> </span><span class="String">0</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    &lt; <span class="String">&quot;</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+};
+
+<span class="RuleName">b</span><span class="RuleName">a</span><span class="RuleName">n</span><span class="RuleName">k</span><span class="RuleName">2</span> = <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">2</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span><span class="Reserved">*</span> <span class="CharString">'</span><span class="Escape">\</span><span class="Escape">n</span><span class="CharString">'</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="String">&quot;</span><span class="String"> </span><span class="String">+</span><span class="String"> </span><span class="String">&quot;</span> <span class="VariableName">x</span> };
+
+<span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">2</span> =
+    <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">e</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">s</span><span class="RuleName">e</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="RuleName">n</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">s</span><span class="RuleName">i</span><span class="RuleName">x</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">f</span><span class="RuleName">i</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">f</span><span class="RuleName">o</span><span class="RuleName">u</span><span class="RuleName">r</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">t</span><span class="RuleName">h</span><span class="RuleName">r</span><span class="RuleName">e</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">t</span><span class="RuleName">w</span><span class="RuleName">o</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    <span class="Reserved">|</span> <span class="RuleName">o</span><span class="RuleName">n</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span><span class="Reserved">:</span><span class="VariableName">y</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> <span class="VariableName">y</span> }
+    ;
+
+<span class="RuleName">j</span><span class="RuleName">o</span><span class="RuleName">l</span><span class="RuleName">t</span><span class="RuleName">a</span><span class="RuleName">g</span><span class="RuleName">e</span><span class="RuleName">1</span> =
+    <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">e</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">s</span><span class="RuleName">e</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="RuleName">n</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">s</span><span class="RuleName">i</span><span class="RuleName">x</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">f</span><span class="RuleName">i</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">f</span><span class="RuleName">o</span><span class="RuleName">u</span><span class="RuleName">r</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">t</span><span class="RuleName">h</span><span class="RuleName">r</span><span class="RuleName">e</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">t</span><span class="RuleName">w</span><span class="RuleName">o</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    <span class="Reserved">|</span> <span class="RuleName">o</span><span class="RuleName">n</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> }
+    ;
+
+<span class="RuleName">n</span><span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">e</span>  = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">9</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">n</span><span class="RuleName">i</span><span class="RuleName">n</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">e</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span> = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">8</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">e</span><span class="RuleName">i</span><span class="RuleName">g</span><span class="RuleName">h</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">s</span><span class="RuleName">e</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="RuleName">n</span> = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">7</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">s</span><span class="RuleName">e</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="RuleName">n</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">s</span><span class="RuleName">i</span><span class="RuleName">x</span>   = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">6</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">s</span><span class="RuleName">i</span><span class="RuleName">x</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">f</span><span class="RuleName">i</span><span class="RuleName">v</span><span class="RuleName">e</span>  = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">5</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">f</span><span class="RuleName">i</span><span class="RuleName">v</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">f</span><span class="RuleName">o</span><span class="RuleName">u</span><span class="RuleName">r</span>  = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">4</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">f</span><span class="RuleName">o</span><span class="RuleName">u</span><span class="RuleName">r</span><span class="Reserved">:</span><span class="VariableName">x</span>  <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">t</span><span class="RuleName">h</span><span class="RuleName">r</span><span class="RuleName">e</span><span class="RuleName">e</span> = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">3</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">t</span><span class="RuleName">h</span><span class="RuleName">r</span><span class="RuleName">e</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">t</span><span class="RuleName">w</span><span class="RuleName">o</span>   = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">2</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">t</span><span class="RuleName">w</span><span class="RuleName">o</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+<span class="RuleName">o</span><span class="RuleName">n</span><span class="RuleName">e</span>   = <span class="Reserved">&amp;</span><span class="CharString">'</span><span class="CharString">1</span><span class="CharString">'</span> <span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span><span class="Reserved">:</span><span class="VariableName">x</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> } <span class="Reserved">|</span> <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> <span class="RuleName">o</span><span class="RuleName">n</span><span class="RuleName">e</span><span class="Reserved">:</span><span class="VariableName">x</span>   <span class="Reserved">-</span><span class="Reserved">&gt;</span> { <span class="VariableName">x</span> };
+
+<span class="RuleName">h</span><span class="RuleName">i</span><span class="RuleName">t</span>[<span class="Meta">E</span><span class="Meta">s</span><span class="Meta">c</span><span class="Meta">a</span><span class="Meta">p</span><span class="Meta">e</span>] = <span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span>;
+
+<span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> = <span class="CharString">'</span><span class="CharString">1</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">2</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">3</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">4</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">5</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">6</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">7</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">8</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">9</span><span class="CharString">'</span>;
+</pre>
+
+And the cool thing is, that this also highlights the answer for each line:
+
+<pre class="highlight"><span class="Escape">9</span><span class="Escape">8</span>7654321111111
+<span class="Escape">8</span>1111111111111<span class="Escape">9</span>
+2342342342342<span class="Escape">7</span><span class="Escape">8</span>
+818181<span class="Escape">9</span>1111<span class="Escape">2</span>111
+</pre>
+
+The generated C code just performs the addition:
+
+<pre class="highlight"><span class="CharString">#</span><span class="CharString">i</span><span class="CharString">n</span><span class="CharString">c</span><span class="CharString">l</span><span class="CharString">u</span><span class="CharString">d</span><span class="CharString">e</span><span class="CharString"> </span><span class="CharString">&lt;</span><span class="CharString">s</span><span class="CharString">t</span><span class="CharString">d</span><span class="CharString">i</span><span class="CharString">o</span><span class="CharString">.</span><span class="CharString">h</span><span class="CharString">&gt;</span><span class="CharString">
+</span><span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> main(<span class="VariableName">v</span><span class="VariableName">o</span><span class="VariableName">i</span><span class="VariableName">d</span>) {
+    printf(<span class="String">&quot;</span><span class="String">P</span><span class="String">a</span><span class="String">r</span><span class="String">t</span><span class="String"> </span><span class="String">1</span><span class="String">:</span><span class="String"> </span><span class="String">%</span><span class="String">l</span><span class="String">d</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>, (<span class="VariableName">l</span><span class="VariableName">o</span><span class="VariableName">n</span><span class="VariableName">g</span> <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span>)(<span class="String">0</span> + <span class="String">9</span><span class="String">8</span> + <span class="String">8</span><span class="String">9</span> + <span class="String">7</span><span class="String">8</span> + <span class="String">9</span><span class="String">2</span>));
+    <span class="Reserved">r</span><span class="Reserved">e</span><span class="Reserved">t</span><span class="Reserved">u</span><span class="Reserved">r</span><span class="Reserved">n</span> <span class="String">0</span>;
+}
+</pre>
+
+I was able to solve part 2 in the same way, but it required me to create
+`joltage12` to `joltage1` because you can not parameterize the recursion depth
+in meta. But here is what it looks like when run on the example:
+
+<pre class="highlight"><span class="Escape">9</span><span class="Escape">8</span><span class="Escape">7</span><span class="Escape">6</span><span class="Escape">5</span><span class="Escape">4</span><span class="Escape">3</span><span class="Escape">2</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span>111
+<span class="Escape">8</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span>111<span class="Escape">9</span>
+23<span class="Escape">4</span>2<span class="Escape">3</span><span class="Escape">4</span><span class="Escape">2</span><span class="Escape">3</span><span class="Escape">4</span><span class="Escape">2</span><span class="Escape">3</span><span class="Escape">4</span><span class="Escape">2</span><span class="Escape">7</span><span class="Escape">8</span>
+<span class="Escape">8</span>1<span class="Escape">8</span>1<span class="Escape">8</span>1<span class="Escape">9</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">2</span><span class="Escape">1</span><span class="Escape">1</span><span class="Escape">1</span>
+</pre>
+
+Also note how numbers are parsed:
+
+<pre class="highlight"><span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> = <span class="CharString">'</span><span class="CharString">1</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">2</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">3</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">4</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">5</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">6</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">7</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">8</span><span class="CharString">'</span><span class="Reserved">|</span><span class="CharString">'</span><span class="CharString">9</span><span class="CharString">'</span>;
+</pre>
+
+This was the only way to do it in the meta language before. But I added support
+for character ranges. So the preferred way to write this now is this:
+
+<pre class="highlight"><span class="RuleName">n</span><span class="RuleName">u</span><span class="RuleName">m</span><span class="RuleName">b</span><span class="RuleName">e</span><span class="RuleName">r</span> = <span class="CharString">'</span><span class="CharString">1</span><span class="CharString">'</span>-<span class="CharString">'</span><span class="CharString">9</span><span class="CharString">'</span>;
+</pre>
+
+It is faster and it reads better. So one idea I had with solving Advent of Code
+using rlworkbench was that I can improve it with feedback from real usage. Here
+is one example.
+
+## Day 4
+
+This day I got to practice parsing grids i meta and practice how to represent
+them in C for easy access. Here is part of the parsing code:
+
+<pre class="highlight"><span class="RuleName">g</span><span class="RuleName">r</span><span class="RuleName">i</span><span class="RuleName">d</span> = <span class="RuleName">r</span><span class="RuleName">o</span><span class="RuleName">w</span><span class="Reserved">*</span><span class="Reserved">:</span><span class="VariableName">x</span><span class="VariableName">s</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> {
+    $rowCount
+    $colCount
+    <span class="String">&quot;</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">p</span><span class="String">a</span><span class="String">p</span><span class="String">e</span><span class="String">r</span><span class="String">_</span><span class="String">r</span><span class="String">o</span><span class="String">l</span><span class="String">l</span><span class="String">s</span><span class="String">[</span><span class="String">&quot;</span> &lt;rowCount <span class="String">&quot;</span><span class="String">]</span><span class="String">[</span><span class="String">&quot;</span> &lt;colCount <span class="String">&quot;</span><span class="String">]</span><span class="String"> </span><span class="String">=</span><span class="String"> </span><span class="String">{</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span> &gt;
+        <span class="VariableName">x</span><span class="VariableName">s</span>
+    &lt; <span class="String">&quot;</span><span class="String">}</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    <span class="String">&quot;</span><span class="String">i</span><span class="String">n</span><span class="String">t</span><span class="String"> </span><span class="String">c</span><span class="String">a</span><span class="String">n</span><span class="String">_</span><span class="String">b</span><span class="String">e</span><span class="String">_</span><span class="String">r</span><span class="String">e</span><span class="String">m</span><span class="String">o</span><span class="String">v</span><span class="String">e</span><span class="String">d</span><span class="String">[</span><span class="String">&quot;</span> &lt;rowCount <span class="String">&quot;</span><span class="String">]</span><span class="String">[</span><span class="String">&quot;</span> &lt;colCount <span class="String">&quot;</span><span class="String">]</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+    &gt;rowCount { W[1] }
+    &gt;colCount { W[2] }
+};
+
+<span class="RuleName">r</span><span class="RuleName">o</span><span class="RuleName">w</span> = <span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">l</span><span class="RuleName">l</span><span class="Reserved">*</span><span class="Reserved">:</span><span class="VariableName">x</span><span class="VariableName">s</span> <span class="CharString">'</span><span class="Escape">\</span><span class="Escape">n</span><span class="CharString">'</span> <span class="Reserved">-</span><span class="Reserved">&gt;</span> {
+    #inc(W[1] 1)
+    #max(W[2] <span class="VariableName">x</span><span class="VariableName">s</span>.len)
+    <span class="String">&quot;</span><span class="String">{</span><span class="String">&quot;</span> <span class="VariableName">x</span><span class="VariableName">s</span> <span class="String">&quot;</span><span class="String">}</span><span class="String">,</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">&quot;</span>
+};
+</pre>
+
+And here is what it generates:
+
+<pre class="highlight"><span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> paper_rolls[<span class="String">1</span><span class="String">0</span>][<span class="String">1</span><span class="String">0</span>] = {
+    {<span class="String">0</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, },
+    {<span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, },
+    {<span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, },
+    {<span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, },
+    {<span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, },
+    {<span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, },
+    {<span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, },
+    {<span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, },
+    {<span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, },
+    {<span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">1</span>, <span class="String">0</span>, <span class="String">1</span>, <span class="String">0</span>, },
+};
+<span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> can_be_removed[<span class="String">1</span><span class="String">0</span>][<span class="String">1</span><span class="String">0</span>];
+</pre>
+
+I think the meta language would benefit from some better mechanism to keep
+track of rows and columns. The `W[x]` mechanism is a hacky way to somewhat work
+with counters. But it is not very nice. I though about adding implicit counters
+for the star-operator. Maybe this is an example to revisit later to try to
+improve meta.
+
+I also learned that local variables in C are not automatically initialized to
+0. I got some random behavior because of it. Yey C! Furthermore it seems that
+[the compiler can not always fully detect
+it](https://stackoverflow.com/questions/74672374/gcc-not-warning-of-uninitialized-local-variable).
+
+## Day 5
+
+This puzzle included some fun with ranges. Instead of thinking of every number
+in a range, compute with ranges instead. I think there was a similar puzzle
+last year. It was satisfying to figure out.
+
+## Day 6
+
+This puzzle was not a very good fit for meta. Or at least part 2 wasn't.
+Meta works well only if you can parse character by character. Not column wise.
+I ended up writing another meta program to rotate the input text. That is,
+turning this:
+
+    123 328  51 64
+     45 64  387 23
+      6 98  215 314
+    *   +   *   +
+
+Into this:
+
+    *  1
+      42
+     653
+
+    +963
+     842
+       8
+
+    *23
+     185
+     571
+
+    +326
+    134
+    4
+
+Which I could then parse for part 2. But the whole thing became very
+complicated.
+
+## Day 7
+
+In this puzzle I accidentally used an `integer` instead of a `long`. The
+program worked fine on the example but produced garbage for the real input.
+Luckily I found out why quite quickly. I'm used to bignums in Python which
+never overflow. So I gained some more C experience the hard way.
+
+## Day 8
+
+Brute force worked fine. Maybe thanks to the speed of C? Is there a more clever
+way?
+
+I watched [Advent of Code 2025 Day 8 Jonathan
+Paulson](https://www.youtube.com/watch?v=Gd4-LOBfA88) and learned that union
+find is probably an algorithm to look up for this.
+
+I also avoided doing sorting in C here. The problem was that I needed to get
+the three largest things in an array. I solved it by finding the largest through
+linear search, and then setting that value to 0. Then I could do that three
+time to get the three largest things at the expense of "removing" them from the
+array. This was fine for this solution. But investigating more elegant solutions
+to this in C is something that I might want to do. There is `qsort` in the
+standard library. But what if modifying the array is not desirable? Copy the
+whole array and then sort? Another thing I though about was to write a function
+that found the largest thing that is smaller than X. In each iteration I could
+pass the previous value. But I would have to do something special for the
+initial case.
+
+## Day 9
+
+I used the [Point in
+polygon](https://en.wikipedia.org/wiki/Point_in_polygon) that I learned about
+last year. It shows that you get better at Advent of Code when you do more
+advent of code. Surprise!
+
+I got the correct result for part 2, but took it took ~6 minutes. Can I
+improve?
+
+I searched YouTube and found that coordinate compression might be something to
+look into.
+
+## Day 10
+
+Today's puzzle was a little more complex to parse. So it was fun to use meta.
+
+The actual algorithm took a long time for me to code. Partly because I
+struggled with arrays in C. I learned that they are copied when copying structs
+(not treated as pointers). More resources on this that I found useful:
+
+* [Are Array Members Deeply Copied?](https://www.geeksforgeeks.org/c/are-array-members-deeply-copied/)
+* [Assign one struct to another in C](https://stackoverflow.com/questions/2302351/assign-one-struct-to-another-in-c)
+* [I'm getting "Invalid Initializer", what am I doing wrong?](https://stackoverflow.com/questions/11043313/im-getting-invalid-initializer-what-am-i-doing-wrong)
+
+I implemented a pop function by returning the first element and moving all
+elements in the array left:
+
+<pre class="highlight">LightsState pop_lights_state(LightsStates* fringe) {
+    LightsState state;
+    <span class="VariableName">i</span><span class="VariableName">n</span><span class="VariableName">t</span> i;
+    assert(fringe-&gt;used &gt; <span class="String">0</span>);
+    state = fringe-&gt;states[<span class="String">0</span>];
+    fringe-&gt;used--;
+    <span class="Reserved">f</span><span class="Reserved">o</span><span class="Reserved">r</span> (i=<span class="String">0</span>; i&lt;fringe-&gt;used; i++) {
+        fringe-&gt;states[i] = fringe-&gt;states[i+<span class="String">1</span>];
+    }
+    <span class="Reserved">r</span><span class="Reserved">e</span><span class="Reserved">t</span><span class="Reserved">u</span><span class="Reserved">r</span><span class="Reserved">n</span> state;
+}
+</pre>
+
+In Python these sort of functions are just available. So it was fun to practice
+implementing them with more primitive data types.
+
+I didn't manage to solve part 2 of today's puzzle. When my attempt just took
+forever, I assumed that you had to do something more clever. Most likely
+involving more math and solving some kind of equation. That was not for me. Not
+this year at least.
+
+## Day 11
+
+I had solved a similar problem in previous years. So I found the solution to
+this one quite straight forward. But once again I struggled to implement it in
+C.  Being at this lower level is so much less convenient. But some things are
+actually easier here. So this was good practice.
+
+## Day 12
+
+I was so excited about today.
+
+I started by writing a highlighter for boards:
+
+<pre class="highlight"><span class="RuleName">m</span><span class="RuleName">a</span><span class="RuleName">i</span><span class="RuleName">n</span> = <span class="RuleName">c</span><span class="RuleName">h</span><span class="RuleName">a</span><span class="RuleName">r</span><span class="Reserved">*</span> <span class="Reserved">!</span><span class="Reserved">.</span>;
+
+<span class="RuleName">c</span><span class="RuleName">h</span><span class="RuleName">a</span><span class="RuleName">r</span> =
+    <span class="Reserved">|</span> <span class="RuleName">h</span><span class="RuleName">a</span><span class="RuleName">s</span><span class="RuleName">h</span>
+    <span class="Reserved">|</span> <span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">O</span><span class="RuleName">n</span><span class="RuleName">e</span>
+    <span class="Reserved">|</span> <span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">T</span><span class="RuleName">w</span><span class="RuleName">o</span>
+    <span class="Reserved">|</span> <span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">T</span><span class="RuleName">h</span><span class="RuleName">r</span><span class="RuleName">e</span><span class="RuleName">e</span>
+    <span class="Reserved">|</span> <span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">F</span><span class="RuleName">o</span><span class="RuleName">u</span><span class="RuleName">r</span>
+    <span class="Reserved">|</span> <span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">F</span><span class="RuleName">i</span><span class="RuleName">v</span><span class="RuleName">e</span>
+    <span class="Reserved">|</span> <span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">S</span><span class="RuleName">i</span><span class="RuleName">x</span>
+    <span class="Reserved">|</span> <span class="Reserved">.</span>
+    ;
+
+<span class="RuleName">h</span><span class="RuleName">a</span><span class="RuleName">s</span><span class="RuleName">h</span>[<span class="Meta">M</span><span class="Meta">e</span><span class="Meta">t</span><span class="Meta">a</span>] = <span class="CharString">'</span><span class="CharString">#</span><span class="CharString">'</span>;
+
+<span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">O</span><span class="RuleName">n</span><span class="RuleName">e</span>[<span class="Meta">R</span><span class="Meta">e</span><span class="Meta">s</span><span class="Meta">e</span><span class="Meta">r</span><span class="Meta">v</span><span class="Meta">e</span><span class="Meta">d</span>]     = <span class="CharString">'</span><span class="CharString">A</span><span class="CharString">'</span> <span class="Reserved">|</span> <span class="CharString">'</span><span class="CharString">0</span><span class="CharString">'</span>;
+<span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">T</span><span class="RuleName">w</span><span class="RuleName">o</span>[<span class="Meta">S</span><span class="Meta">t</span><span class="Meta">r</span><span class="Meta">i</span><span class="Meta">n</span><span class="Meta">g</span>]       = <span class="CharString">'</span><span class="CharString">B</span><span class="CharString">'</span> <span class="Reserved">|</span> <span class="CharString">'</span><span class="CharString">1</span><span class="CharString">'</span>;
+<span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">T</span><span class="RuleName">h</span><span class="RuleName">r</span><span class="RuleName">e</span><span class="RuleName">e</span>[<span class="Meta">C</span><span class="Meta">h</span><span class="Meta">a</span><span class="Meta">r</span><span class="Meta">S</span><span class="Meta">t</span><span class="Meta">r</span><span class="Meta">i</span><span class="Meta">n</span><span class="Meta">g</span>] = <span class="CharString">'</span><span class="CharString">C</span><span class="CharString">'</span> <span class="Reserved">|</span> <span class="CharString">'</span><span class="CharString">2</span><span class="CharString">'</span>;
+<span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">F</span><span class="RuleName">o</span><span class="RuleName">u</span><span class="RuleName">r</span>[<span class="Meta">E</span><span class="Meta">s</span><span class="Meta">c</span><span class="Meta">a</span><span class="Meta">p</span><span class="Meta">e</span>]      = <span class="CharString">'</span><span class="CharString">D</span><span class="CharString">'</span> <span class="Reserved">|</span> <span class="CharString">'</span><span class="CharString">3</span><span class="CharString">'</span>;
+<span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">F</span><span class="RuleName">i</span><span class="RuleName">v</span><span class="RuleName">e</span>[<span class="Meta">R</span><span class="Meta">u</span><span class="Meta">l</span><span class="Meta">e</span><span class="Meta">N</span><span class="Meta">a</span><span class="Meta">m</span><span class="Meta">e</span>]    = <span class="CharString">'</span><span class="CharString">E</span><span class="CharString">'</span> <span class="Reserved">|</span> <span class="CharString">'</span><span class="CharString">4</span><span class="CharString">'</span>;
+<span class="RuleName">p</span><span class="RuleName">i</span><span class="RuleName">e</span><span class="RuleName">c</span><span class="RuleName">e</span><span class="RuleName">S</span><span class="RuleName">i</span><span class="RuleName">x</span>[<span class="Meta">V</span><span class="Meta">a</span><span class="Meta">r</span><span class="Meta">i</span><span class="Meta">a</span><span class="Meta">b</span><span class="Meta">l</span><span class="Meta">e</span><span class="Meta">N</span><span class="Meta">a</span><span class="Meta">m</span><span class="Meta">e</span>] = <span class="CharString">'</span><span class="CharString">F</span><span class="CharString">'</span> <span class="Reserved">|</span> <span class="CharString">'</span><span class="CharString">5</span><span class="CharString">'</span>;
+</pre>
+
+My idea was that I would be able to more easily debug how my algorithm placed
+blocks on the grid. And it kind of worked. After a lot of coding on the
+algorithm (which again was difficult for me in C) I had something that produced
+states like this:
+
+<pre class="highlight"><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span>..<span class="String">1</span><span class="CharString">2</span>..<span class="CharString">2</span>..<span class="CharString">2</span>..<span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="RuleName">4</span>.<span class="RuleName">4</span>..<span class="VariableName">5</span>....
+..<span class="Reserved">0</span>..<span class="Reserved">0</span>.<span class="String">1</span><span class="String">1</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span>.<span class="VariableName">5</span><span class="VariableName">5</span>....
+<span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="String">1</span><span class="String">1</span><span class="String">1</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="VariableName">5</span><span class="VariableName">5</span><span class="VariableName">5</span>....
+<span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span>.<span class="String">1</span><span class="String">1</span><span class="CharString">2</span>..<span class="CharString">2</span>..<span class="CharString">2</span>..<span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="RuleName">4</span>.<span class="RuleName">4</span>..<span class="VariableName">5</span>....
+..<span class="Reserved">0</span>..<span class="Reserved">0</span><span class="String">1</span><span class="String">1</span><span class="String">1</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span>.<span class="VariableName">5</span><span class="VariableName">5</span>....
+<span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span>.<span class="String">1</span><span class="String">1</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="VariableName">5</span><span class="VariableName">5</span><span class="VariableName">5</span>....
+<span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="Reserved">0</span><span class="String">1</span><span class="String">1</span><span class="String">1</span><span class="CharString">2</span>..<span class="CharString">2</span>..<span class="CharString">2</span>..<span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="Escape">3</span><span class="RuleName">4</span>.<span class="RuleName">4</span><span class="RuleName">4</span>.<span class="RuleName">4</span>..<span class="VariableName">5</span>....
+..<span class="Reserved">0</span>..<span class="Reserved">0</span>.<span class="String">1</span><span class="String">1</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="CharString">2</span><span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="Escape">3</span><span class="Escape">3</span>.<span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span><span class="RuleName">4</span>.<span class="VariableName">5</span><span class="VariableName">5</span>....
+</pre>
+
+So far, so good. But my search seemed to take forever. I wanted to introduce
+caching to see if it would help. But after ~5 hours of struggling with C, I
+couldn't do it. I actually switched to Python. Implemented roughly the same
+that I had in C and was able to add caching. I think at least. But it still
+took forever.
+
+That's when I decided to quit. This was it for me this year.
+
+I looked up solutions for day 12 on the Internet and found that searching (as I
+was attempting) was probably not the right way to go. Although, I found one
+solution that was similar to what I tried to do: [ShuvraneelMitra |
+Advent-of-Code-2025-CPP | Day
+12](https://github.com/ShuvraneelMitra/Advent-of-Code-2025-CPP/blob/main/Day%2012/Day12_P1.cpp).
+
+I don't have a good intuition for when a computation is going to take too long.
+I tried to do something clever in day 1 to avoid unnecessary work. And I tried
+to brute force day 12. So that's maybe something that I should practice more
+next year. Analyse the problem and think about if a solution would be feasible.
+And if not, think of other ways to attack the problem.
+
+## Summary
+
+This year was fun.
+
+I got to improve rlworkbench and meta with input from real world usage.
+
+I got to practice writing more C code and learned some things the hard way.
+
+I got ideas for algorithms to look up (maybe for next year) and new areas of C
+to explore.
+
+But now I'm done. I'm glad it is over. Now I can get back to all the things I
+neglected during the last 12 days.

2025-12-14 13:33 Rickard pushed to rlworkbench

fatal: Invalid revision range 14b7949fa8c6b23f0cbdfca293934d1d0c4b7b6c..13c31b3fd4b76279834bca34084fb2ba724a1289

2025-12-13 21:32 Rickard pushed to rlworkbench

fatal: Invalid revision range e7e50a6eeba626d5b721f5c796a5246171deba85..14b7949fa8c6b23f0cbdfca293934d1d0c4b7b6c

2025-12-13 18:16 Rickard pushed to rlworkbench

fatal: Invalid revision range c2d1c28a4355b38c63ee0f75ca5ce249fbbe2a81..e7e50a6eeba626d5b721f5c796a5246171deba85

2025-12-13 16:13 Rickard pushed to rlworkbench

fatal: Invalid revision range e0e0078a243ab6d81b95b2838e731dfb50c5fabb..c2d1c28a4355b38c63ee0f75ca5ce249fbbe2a81

2025-12-13 15:52 Rickard pushed to rlworkbench

fatal: Invalid revision range 57b81b367aa1ffdd6eff1667229fbad172b18f68..e0e0078a243ab6d81b95b2838e731dfb50c5fabb