This site hosts my projects.
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")
fatal: Invalid revision range 08b36fc69880c7b7e53b09492fb04a980bb6d929..ccd1cf99946300ef6fbf2e7db0c1beda98ccd654
fatal: Invalid revision range 13c31b3fd4b76279834bca34084fb2ba724a1289..08b36fc69880c7b7e53b09492fb04a980bb6d929
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">
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">></span> {
+ $dialSize
+ >dialSize { <span class="String">"</span><span class="String">1</span><span class="String">0</span><span class="String">0</span><span class="String">"</span> }
+ <span class="String">"</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"><</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">></span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</span>
+ <span class="String">"</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">"</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">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">"</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">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">"</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">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">"</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">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</span>
+ <span class="String">"</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">"</span> >
+ <span class="VariableName">x</span><span class="VariableName">s</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">"</span>
+ <span class="String">"</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">"</span> <span class="VariableName">x</span><span class="VariableName">s</span>.count <span class="String">"</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</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">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">"</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">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">"</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">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">"</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">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">"</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">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">"</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">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">"</span>
+ <span class="String">"</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"><</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">"</span> >
+ <span class="String">"</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"><</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">"</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">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">"</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">"</span> <dialSize <span class="String">"</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</span>
+ <span class="String">"</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">"</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"> </span><span class="String">1</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</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">"</span>
+ < <span class="String">"</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</span>
+ <span class="String">"</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">"</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"> </span><span class="String">1</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</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">"</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"> </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">"</span>
+ < <span class="String">"</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</span>
+ <span class="String">"</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">"</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">"</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">"</span>
+ <span class="String">"</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">"</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">"</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">"</span>
+ <span class="String">"</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">"</span>
+ < <span class="String">"</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</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">></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">></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">></span> {
+ <span class="String">"</span><span class="String">{</span><span class="String">"</span> <dialSize <span class="String">"</span><span class="String">-</span><span class="String">1</span><span class="String">,</span><span class="String"> </span><span class="String">"</span> <span class="VariableName">x</span> <span class="String">"</span><span class="String">%</span><span class="String">"</span> <dialSize <span class="String">"</span><span class="String">,</span><span class="String"> </span><span class="String">"</span> <span class="VariableName">x</span> <span class="String">"</span><span class="String">/</span><span class="String">"</span> <dialSize <span class="String">"</span><span class="String">}</span><span class="String">,</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</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">></span> {
+ <span class="String">"</span><span class="String">{</span><span class="String">1</span><span class="String">,</span><span class="String"> </span><span class="String">"</span> <span class="VariableName">x</span> <span class="String">"</span><span class="String">%</span><span class="String">"</span> <dialSize <span class="String">"</span><span class="String">,</span><span class="String"> </span><span class="String">"</span> <span class="VariableName">x</span> <span class="String">"</span><span class="String">/</span><span class="String">"</span> <dialSize <span class="String">"</span><span class="String">}</span><span class="String">,</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</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"><</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">></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<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<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">"</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">"</span>, times_ended_at_zero);
+ printf(<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"> </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">"</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 > <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">></span> {
+ <span class="String">"</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"><</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">></span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</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">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">"</span> >
+ <span class="String">"</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">"</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">"</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">"</span> <span class="VariableName">x</span><span class="VariableName">s</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">"</span>
+ <span class="String">"</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">"</span>
+ < <span class="String">"</span><span class="String">}</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</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">></span> { <span class="String">"</span><span class="String"> </span><span class="String">+</span><span class="String"> </span><span class="String">"</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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">&</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">></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">></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">&</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">></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">></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">&</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">></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">></span> { <span class="VariableName">x</span> };
+<span class="RuleName">s</span><span class="RuleName">i</span><span class="RuleName">x</span> = <span class="Reserved">&</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">></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">></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">&</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">></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">></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">&</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">></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">></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">&</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">></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">></span> { <span class="VariableName">x</span> };
+<span class="RuleName">t</span><span class="RuleName">w</span><span class="RuleName">o</span> = <span class="Reserved">&</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">></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">></span> { <span class="VariableName">x</span> };
+<span class="RuleName">o</span><span class="RuleName">n</span><span class="RuleName">e</span> = <span class="Reserved">&</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">></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">></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"><</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">></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">"</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">"</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">></span> {
+ $rowCount
+ $colCount
+ <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">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">"</span> <rowCount <span class="String">"</span><span class="String">]</span><span class="String">[</span><span class="String">"</span> <colCount <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">"</span> >
+ <span class="VariableName">x</span><span class="VariableName">s</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">"</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">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">"</span> <rowCount <span class="String">"</span><span class="String">]</span><span class="String">[</span><span class="String">"</span> <colCount <span class="String">"</span><span class="String">]</span><span class="String">;</span><span class="Escape">\</span><span class="Escape">n</span><span class="String">"</span>
+ >rowCount { W[1] }
+ >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">></span> {
+ #inc(W[1] 1)
+ #max(W[2] <span class="VariableName">x</span><span class="VariableName">s</span>.len)
+ <span class="String">"</span><span class="String">{</span><span class="String">"</span> <span class="VariableName">x</span><span class="VariableName">s</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">"</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->used > <span class="String">0</span>);
+ state = fringe->states[<span class="String">0</span>];
+ fringe->used--;
+ <span class="Reserved">f</span><span class="Reserved">o</span><span class="Reserved">r</span> (i=<span class="String">0</span>; i<fringe->used; i++) {
+ fringe->states[i] = fringe->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.
fatal: Invalid revision range 14b7949fa8c6b23f0cbdfca293934d1d0c4b7b6c..13c31b3fd4b76279834bca34084fb2ba724a1289
fatal: Invalid revision range e7e50a6eeba626d5b721f5c796a5246171deba85..14b7949fa8c6b23f0cbdfca293934d1d0c4b7b6c
fatal: Invalid revision range c2d1c28a4355b38c63ee0f75ca5ce249fbbe2a81..e7e50a6eeba626d5b721f5c796a5246171deba85
fatal: Invalid revision range e0e0078a243ab6d81b95b2838e731dfb50c5fabb..c2d1c28a4355b38c63ee0f75ca5ce249fbbe2a81
fatal: Invalid revision range 57b81b367aa1ffdd6eff1667229fbad172b18f68..e0e0078a243ab6d81b95b2838e731dfb50c5fabb