aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xpatches/eowyn.sh8
-rwxr-xr-xpatches/frodo.sh60
-rwxr-xr-xpatches/gollum.sh2
-rw-r--r--patches/patches/001_hello.patch14
-rw-r--r--patches/patches/002_std.patch15
-rw-r--r--patches/patches/003_assignment.patch30
-rw-r--r--patches/patches/004_arrays.patch37
-rw-r--r--patches/patches/005_arrays2.patch25
-rw-r--r--patches/patches/006_strings.patch36
-rw-r--r--patches/patches/007_strings2.patch23
-rw-r--r--patches/patches/008_quiz.patch48
-rw-r--r--patches/patches/009_if.patch15
-rw-r--r--patches/patches/010_if2.patch15
-rw-r--r--patches/patches/011_while.patch15
-rw-r--r--patches/patches/012_while2.patch15
-rw-r--r--patches/patches/013_while3.patch19
-rw-r--r--patches/patches/014_while4.patch15
-rw-r--r--patches/patches/015_for.patch15
-rw-r--r--patches/patches/016_for2.patch15
-rw-r--r--patches/patches/017_quiz2.patch41
-rw-r--r--patches/patches/018_functions.patch14
-rw-r--r--patches/patches/019_functions2.patch15
-rw-r--r--patches/patches/020_quiz3.patch48
-rw-r--r--patches/patches/021_errors.patch28
-rw-r--r--patches/patches/022_errors2.patch15
-rw-r--r--patches/patches/023_errors3.patch27
-rw-r--r--patches/patches/024_errors4.patch27
-rw-r--r--patches/patches/025_errors5.patch15
-rw-r--r--patches/patches/026_hello2.patch13
-rw-r--r--patches/patches/027_defer.patch14
-rw-r--r--patches/patches/028_defer2.patch15
-rw-r--r--patches/patches/029_errdefer.patch15
-rw-r--r--patches/patches/030_switch.patch12
-rw-r--r--patches/patches/031_switch2.patch12
-rw-r--r--patches/patches/032_unreachable.patch12
-rw-r--r--patches/patches/033_iferror.patch12
-rw-r--r--patches/patches/034_quiz4.patch23
-rw-r--r--patches/patches/035_enums.patch15
-rw-r--r--patches/patches/036_enums2.patch38
-rw-r--r--patches/patches/037_structs.patch22
-rw-r--r--patches/patches/038_structs2.patch22
-rw-r--r--patches/patches/039_pointers.patch15
-rw-r--r--patches/patches/040_pointers2.patch15
-rw-r--r--patches/patches/041_pointers3.patch15
-rw-r--r--patches/patches/042_pointers4.patch13
-rw-r--r--patches/patches/043_pointers5.patch15
-rw-r--r--patches/patches/044_quiz5.patch21
-rw-r--r--patches/patches/045_optionals.patch15
-rw-r--r--patches/patches/046_optionals2.patch28
-rw-r--r--patches/patches/047_methods.patch15
-rw-r--r--patches/patches/048_methods2.patch15
-rw-r--r--patches/patches/049_quiz6.patch29
-rw-r--r--patches/patches/050_no_value.patch40
-rw-r--r--patches/patches/051_values.patch39
-rw-r--r--patches/patches/052_slices.patch32
-rw-r--r--patches/patches/053_slices2.patch49
-rw-r--r--patches/patches/054_manypointers.patch15
-rw-r--r--patches/patches/055_unions.patch19
-rw-r--r--patches/patches/056_unions2.patch30
-rw-r--r--patches/patches/057_unions3.patch15
-rw-r--r--patches/patches/058_quiz7.patch45
-rw-r--r--patches/patches/059_integers.patch23
-rw-r--r--patches/patches/060_floats.patch15
-rw-r--r--patches/patches/061_coercions.patch15
-rw-r--r--patches/patches/062_loop_expressions.patch15
-rw-r--r--patches/patches/063_labels.patch19
-rw-r--r--patches/patches/064_builtins.patch27
-rw-r--r--patches/patches/065_builtins2.patch59
-rw-r--r--patches/patches/066_comptime.patch19
-rw-r--r--patches/patches/067_comptime2.patch15
-rw-r--r--patches/patches/068_comptime3.patch28
-rw-r--r--patches/patches/069_comptime4.patch19
-rw-r--r--patches/patches/070_comptime5.patch19
-rw-r--r--patches/patches/071_comptime6.patch15
-rw-r--r--patches/patches/072_comptime7.patch15
-rw-r--r--patches/patches/073_comptime8.patch25
-rw-r--r--patches/patches/074_comptime9.patch15
-rw-r--r--patches/patches/075_quiz8.patch23
-rw-r--r--patches/patches/076_sentinels.patch28
-rw-r--r--patches/patches/077_sentinels2.patch15
-rw-r--r--patches/patches/078_sentinels3.patch15
-rw-r--r--patches/patches/079_quoted_identifiers.patch30
-rw-r--r--patches/patches/080_anonymous_structs.patch26
-rw-r--r--patches/patches/081_anonymous_structs2.patch15
-rw-r--r--patches/patches/082_anonymous_structs3.patch48
-rw-r--r--patches/patches/083_anonymous_lists.patch14
-rw-r--r--patches/patches/084_async.patch15
-rw-r--r--patches/patches/085_async2.patch12
-rw-r--r--patches/patches/086_async3.patch25
-rw-r--r--patches/patches/087_async4.patch31
-rw-r--r--patches/patches/088_async5.patch15
-rw-r--r--patches/patches/089_async6.patch19
-rw-r--r--patches/patches/090_async7.patch15
-rw-r--r--patches/patches/091_async8.patch42
-rw-r--r--patches/patches/092_interfaces.patch15
-rw-r--r--patches/patches/093_hello_c.patch15
-rw-r--r--patches/patches/094_c_math.patch15
-rw-r--r--patches/patches/095_for3.patch15
-rw-r--r--patches/patches/096_memory_allocation.patch15
-rw-r--r--patches/patches/097_bit_manipulation.patch15
-rw-r--r--patches/patches/098_bit_manipulation2.patch13
-rw-r--r--patches/patches/099_formatting.patch15
-rw-r--r--patches/patches/100_for4.patch15
-rw-r--r--patches/patches/101_for5.patch15
-rw-r--r--patches/patches/102_testing.patch26
-rw-r--r--patches/patches/103_tokenization.patch15
-rw-r--r--patches/patches/999_the_end.patch9
-rwxr-xr-xtest/patchbin1204512 -> 0 bytes
-rw-r--r--tools/update-patches.zig90
109 files changed, 1606 insertions, 770 deletions
diff --git a/patches/eowyn.sh b/patches/eowyn.sh
index 67a6b36..8cac450 100755
--- a/patches/eowyn.sh
+++ b/patches/eowyn.sh
@@ -22,7 +22,9 @@ then
fi
# Which version we have?
-echo "I am in version 23.4.25.1, let's try our magic power."
+echo "Zig version" $(zig version)
+echo "Eowyn version 23.10.5.1, let's try our magic power."
+echo ""
# Create directory of healing if it doesn't already exist.
mkdir -p patches/healed
@@ -39,7 +41,9 @@ do
# Apply the bandages to the wounds, grow new limbs, let
# new life spring into the broken bodies of the fallen.
echo Healing "$true_name"...
- ./test/patch --output="patches/healed/$true_name.zig" "$broken" "$patch_name"
+ cp "$broken" "patches/healed/$true_name.zig"
+ patch -i "$patch_name" "patches/healed/$true_name.zig"
+
else
echo Cannot heal "$true_name". No patch found.
fi
diff --git a/patches/frodo.sh b/patches/frodo.sh
new file mode 100755
index 0000000..a92642a
--- /dev/null
+++ b/patches/frodo.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# "How do you pick up the threads of an old life?
+# How do you go on, when in your heart you begin
+# to understand... there is no going back?
+# There are some things that time cannot mend.
+# Some hurts that go too deep, that have taken hold."
+# Frodo, The Return of the King
+#
+#
+# This script shall repair the patches for the little
+# broken programs using the old patches in this directory
+# first, to heal them and then create new and better
+# patches, with Gollum's help.
+#
+set -e
+
+# We check ourselves before we wreck ourselves.
+if [ ! -f patches/frodo.sh ]
+then
+ echo "But I must be run from the project root directory."
+ exit 1
+fi
+
+# Create directory of answers if it doesn't already exist.
+mkdir -p answers
+
+# Cycle through all the little broken Zig applications.
+i=0
+for broken in exercises/*.zig
+do
+ ((i=i+1))
+
+ # Remove the dir and extension, rendering the True Name.
+ true_name=$(basename "$broken" .zig)
+ patch_name="patches/patches/$true_name.patch"
+ healed_name="answers/$true_name.zig"
+ cp "$broken" "$healed_name"
+ # echo "$patch_name"
+
+ if [ -f "$patch_name" ]
+ then
+ # Apply the bandages to the wounds, grow new limbs, let
+ # new life spring into the broken bodies of the fallen.
+ echo Healing "$true_name"...
+ patch -i "$patch_name" "$healed_name"
+
+ # Create new prescriptions...
+ echo Repairing "$patch_name"...
+ if [ "$true_name.patch" = "999_the_end.patch" ]
+ then
+ i=999
+ fi
+ # with gollum's help!
+ ./patches/gollum.sh $i
+ else
+ echo Cannot repair "$true_name". No patch found.
+ fi
+done
+
diff --git a/patches/gollum.sh b/patches/gollum.sh
index 74f7626..b15af0b 100755
--- a/patches/gollum.sh
+++ b/patches/gollum.sh
@@ -26,6 +26,6 @@ echo "Hissss! before: '$b'"
echo " after: '$a'"
echo " patch: '$p'"
-diff $b $a > $p
+diff -u $b $a > $p
cat $p
diff --git a/patches/patches/001_hello.patch b/patches/patches/001_hello.patch
index fb360a7..c5aacd8 100644
--- a/patches/patches/001_hello.patch
+++ b/patches/patches/001_hello.patch
@@ -1,4 +1,10 @@
-19c19
-< fn main() void {
----
-> pub fn main() void {
+--- exercises/001_hello.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/001_hello.zig 2023-10-05 20:04:06.846096282 +0200
+@@ -16,6 +16,6 @@
+ //
+ const std = @import("std");
+
+-fn main() void {
++pub fn main() void {
+ std.debug.print("Hello world!\n", .{});
+ }
diff --git a/patches/patches/002_std.patch b/patches/patches/002_std.patch
index 6c97adb..6a1912d 100644
--- a/patches/patches/002_std.patch
+++ b/patches/patches/002_std.patch
@@ -1,4 +1,11 @@
-14c14
-< ??? = @import("std");
----
-> const std = @import("std");
+--- exercises/002_std.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/002_std.zig 2023-10-05 20:04:06.849429678 +0200
+@@ -11,7 +11,7 @@
+ // Please complete the import below:
+ //
+
+-??? = @import("std");
++const std = @import("std");
+
+ pub fn main() void {
+ std.debug.print("Standard Library.\n", .{});
diff --git a/patches/patches/003_assignment.patch b/patches/patches/003_assignment.patch
index bef4b24..0d780d9 100644
--- a/patches/patches/003_assignment.patch
+++ b/patches/patches/003_assignment.patch
@@ -1,12 +1,18 @@
-37c37
-< const n: u8 = 50;
----
-> var n: u8 = 50;
-40c40
-< const pi: u8 = 314159;
----
-> const pi: u32 = 314159;
-42c42
-< const negative_eleven: u8 = -11;
----
-> const negative_eleven: i8 = -11;
+--- exercises/003_assignment.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/003_assignment.zig 2023-10-05 20:04:06.856096469 +0200
+@@ -34,12 +34,12 @@
+ const std = @import("std");
+
+ pub fn main() void {
+- const n: u8 = 50;
++ var n: u8 = 50;
+ n = n + 5;
+
+- const pi: u8 = 314159;
++ const pi: u32 = 314159;
+
+- const negative_eleven: u8 = -11;
++ const negative_eleven: i8 = -11;
+
+ // There are no errors in the next line, just explanation:
+ // Perhaps you noticed before that the print function takes two
diff --git a/patches/patches/004_arrays.patch b/patches/patches/004_arrays.patch
index c6f9de3..ce7474e 100644
--- a/patches/patches/004_arrays.patch
+++ b/patches/patches/004_arrays.patch
@@ -1,12 +1,25 @@
-30c30
-< const some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 };
----
-> var some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 };
-43c43
-< const fourth = some_primes[???];
----
-> const fourth = some_primes[3];
-47c47
-< const length = some_primes.???;
----
-> const length = some_primes.len;
+--- exercises/004_arrays.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/004_arrays.zig 2023-10-05 20:04:06.859429866 +0200
+@@ -27,7 +27,7 @@
+ // (Problem 1)
+ // This "const" is going to cause a problem later - can you see what it is?
+ // How do we fix it?
+- const some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 };
++ var some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 };
+
+ // Individual values can be set with '[]' notation.
+ // Example: This line changes the first prime to 2 (which is correct):
+@@ -40,11 +40,11 @@
+ // (Problem 2)
+ // Looks like we need to complete this expression. Use the example
+ // above to set "fourth" to the fourth element of the some_primes array:
+- const fourth = some_primes[???];
++ const fourth = some_primes[3];
+
+ // (Problem 3)
+ // Use the len property to get the length of the array:
+- const length = some_primes.???;
++ const length = some_primes.len;
+
+ std.debug.print("First: {}, Fourth: {}, Length: {}\n", .{
+ first, fourth, length,
diff --git a/patches/patches/005_arrays2.patch b/patches/patches/005_arrays2.patch
index 83e71e0..c576150 100644
--- a/patches/patches/005_arrays2.patch
+++ b/patches/patches/005_arrays2.patch
@@ -1,8 +1,17 @@
-28c28
-< const leet = ???;
----
-> const leet = le ++ et;
-33c33
-< const bit_pattern = [_]u8{ ??? } ** 3;
----
-> const bit_pattern = [_]u8{ 1, 0, 0, 1 } ** 3;
+--- exercises/005_arrays2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/005_arrays2.zig 2023-10-05 20:04:06.862763262 +0200
+@@ -25,12 +25,12 @@
+ // (Problem 1)
+ // Please set this array concatenating the two arrays above.
+ // It should result in: 1 3 3 7
+- const leet = ???;
++ const leet = le ++ et;
+
+ // (Problem 2)
+ // Please set this array using repetition.
+ // It should result in: 1 0 0 1 1 0 0 1 1 0 0 1
+- const bit_pattern = [_]u8{ ??? } ** 3;
++ const bit_pattern = [_]u8{ 1, 0, 0, 1 } ** 3;
+
+ // Okay, that's all of the problems. Let's see the results.
+ //
diff --git a/patches/patches/006_strings.patch b/patches/patches/006_strings.patch
index 3ed9ea6..bd29ecc 100644
--- a/patches/patches/006_strings.patch
+++ b/patches/patches/006_strings.patch
@@ -1,12 +1,24 @@
-27c27
-< const d: u8 = ziggy[???];
----
-> const d: u8 = ziggy[4];
-31c31
-< const laugh = "ha " ???;
----
-> const laugh = "ha " ** 3;
-38c38
-< const major_tom = major ??? tom;
----
-> const major_tom = major ++ " " ++ tom;
+--- exercises/006_strings.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/006_strings.zig 2023-10-05 20:04:06.869430053 +0200
+@@ -24,18 +24,18 @@
+ // (Problem 1)
+ // Use array square bracket syntax to get the letter 'd' from
+ // the string "stardust" above.
+- const d: u8 = ziggy[???];
++ const d: u8 = ziggy[4];
+
+ // (Problem 2)
+ // Use the array repeat '**' operator to make "ha ha ha ".
+- const laugh = "ha " ???;
++ const laugh = "ha " ** 3;
+
+ // (Problem 3)
+ // Use the array concatenation '++' operator to make "Major Tom".
+ // (You'll need to add a space as well!)
+ const major = "Major";
+ const tom = "Tom";
+- const major_tom = major ??? tom;
++ const major_tom = major ++ " " ++ tom;
+
+ // That's all the problems. Let's see our results:
+ std.debug.print("d={u} {s}{s}\n", .{ d, laugh, major_tom });
diff --git a/patches/patches/007_strings2.patch b/patches/patches/007_strings2.patch
index 34cd053..e8cecd2 100644
--- a/patches/patches/007_strings2.patch
+++ b/patches/patches/007_strings2.patch
@@ -1,8 +1,15 @@
-18,20c18,20
-< Ziggy played guitar
-< Jamming good with Andrew Kelley
-< And the Spiders from Mars
----
-> \\Ziggy played guitar
-> \\Jamming good with Andrew Kelley
-> \\And the Spiders from Mars
+--- exercises/007_strings2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/007_strings2.zig 2023-10-05 20:04:06.872763449 +0200
+@@ -15,9 +15,9 @@
+
+ pub fn main() void {
+ const lyrics =
+- Ziggy played guitar
+- Jamming good with Andrew Kelley
+- And the Spiders from Mars
++ \\Ziggy played guitar
++ \\Jamming good with Andrew Kelley
++ \\And the Spiders from Mars
+ ;
+
+ std.debug.print("{s}\n", .{lyrics});
diff --git a/patches/patches/008_quiz.patch b/patches/patches/008_quiz.patch
index a62be07..10111bb 100644
--- a/patches/patches/008_quiz.patch
+++ b/patches/patches/008_quiz.patch
@@ -1,18 +1,30 @@
-22c22
-< const x: usize = 1;
----
-> var x: usize = 1;
-26c26
-< // 'undefined'. There is no problem on this line.
----
-> // 'undefined'. There is no error here.
-36c36
-< lang[???] = letters[x];
----
-> lang[1] = letters[x];
-38,39c38,39
-< x = ???;
-< lang[2] = letters[???];
----
-> x = 5;
-> lang[2] = letters[x];
+--- exercises/008_quiz.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/008_quiz.zig 2023-10-05 20:04:06.879430240 +0200
+@@ -19,11 +19,11 @@
+ // the idiomatic type to use for array indexing.
+ //
+ // There IS a problem on this line, but 'usize' isn't it.
+- const x: usize = 1;
++ var x: usize = 1;
+
+ // Note: When you want to declare memory (an array in this
+ // case) without putting anything in it, you can set it to
+- // 'undefined'. There is no problem on this line.
++ // 'undefined'. There is no error here.
+ var lang: [3]u8 = undefined;
+
+ // The following lines attempt to put 'Z', 'i', and 'g' into the
+@@ -33,10 +33,10 @@
+ lang[0] = letters[x];
+
+ x = 3;
+- lang[???] = letters[x];
++ lang[1] = letters[x];
+
+- x = ???;
+- lang[2] = letters[???];
++ x = 5;
++ lang[2] = letters[x];
+
+ // We want to "Program in Zig!" of course:
+ std.debug.print("Program in {s}!\n", .{lang});
diff --git a/patches/patches/009_if.patch b/patches/patches/009_if.patch
index 0b00183..ebebb35 100644
--- a/patches/patches/009_if.patch
+++ b/patches/patches/009_if.patch
@@ -1,4 +1,11 @@
-27c27
-< if (foo) {
----
-> if (foo == 1) {
+--- exercises/009_if.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/009_if.zig 2023-10-05 20:04:06.882763636 +0200
+@@ -24,7 +24,7 @@
+ const foo = 1;
+
+ // Please fix this condition:
+- if (foo) {
++ if (foo == 1) {
+ // We want our program to print this message!
+ std.debug.print("Foo is 1!\n", .{});
+ } else {
diff --git a/patches/patches/010_if2.patch b/patches/patches/010_if2.patch
index 3ce48c2..b7207ea 100644
--- a/patches/patches/010_if2.patch
+++ b/patches/patches/010_if2.patch
@@ -1,4 +1,11 @@
-13c13
-< const price: u8 = if ???;
----
-> const price: u8 = if (discount) 17 else 20;
+--- exercises/010_if2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/010_if2.zig 2023-10-05 20:04:06.886097032 +0200
+@@ -10,7 +10,7 @@
+
+ // Please use an if...else expression to set "price".
+ // If discount is true, the price should be $17, otherwise $20:
+- const price: u8 = if ???;
++ const price: u8 = if (discount) 17 else 20;
+
+ std.debug.print("With the discount, the price is ${}.\n", .{price});
+ }
diff --git a/patches/patches/011_while.patch b/patches/patches/011_while.patch
index a892191..b293fc0 100644
--- a/patches/patches/011_while.patch
+++ b/patches/patches/011_while.patch
@@ -1,4 +1,11 @@
-24c24
-< while (???) {
----
-> while (n < 1024) {
+--- exercises/011_while.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/011_while.zig 2023-10-05 20:04:06.892763823 +0200
+@@ -21,7 +21,7 @@
+ var n: u32 = 2;
+
+ // Please use a condition that is true UNTIL "n" reaches 1024:
+- while (???) {
++ while (n < 1024) {
+ // Print the current number
+ std.debug.print("{} ", .{n});
+
diff --git a/patches/patches/012_while2.patch b/patches/patches/012_while2.patch
index 29ae763..0ae0dcb 100644
--- a/patches/patches/012_while2.patch
+++ b/patches/patches/012_while2.patch
@@ -1,4 +1,11 @@
-28c28
-< while (n < 1000) : ??? {
----
-> while (n < 1000) : (n *= 2) {
+--- exercises/012_while2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/012_while2.zig 2023-10-05 20:04:06.896097219 +0200
+@@ -25,7 +25,7 @@
+
+ // Please set the continue expression so that we get the desired
+ // results in the print statement below.
+- while (n < 1000) : ??? {
++ while (n < 1000) : (n *= 2) {
+ // Print the current number
+ std.debug.print("{} ", .{n});
+ }
diff --git a/patches/patches/013_while3.patch b/patches/patches/013_while3.patch
index b0172da..48c6b9f 100644
--- a/patches/patches/013_while3.patch
+++ b/patches/patches/013_while3.patch
@@ -1,6 +1,13 @@
-27,28c27,28
-< if (n % 3 == 0) ???;
-< if (n % 5 == 0) ???;
----
-> if (n % 3 == 0) continue;
-> if (n % 5 == 0) continue;
+--- exercises/013_while3.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/013_while3.zig 2023-10-05 20:04:06.899430616 +0200
+@@ -24,8 +24,8 @@
+ while (n <= 20) : (n += 1) {
+ // The '%' symbol is the "modulo" operator and it
+ // returns the remainder after division.
+- if (n % 3 == 0) ???;
+- if (n % 5 == 0) ???;
++ if (n % 3 == 0) continue;
++ if (n % 5 == 0) continue;
+ std.debug.print("{} ", .{n});
+ }
+
diff --git a/patches/patches/014_while4.patch b/patches/patches/014_while4.patch
index fb67587..eca4ccf 100644
--- a/patches/patches/014_while4.patch
+++ b/patches/patches/014_while4.patch
@@ -1,4 +1,11 @@
-21c21
-< if (???) ???;
----
-> if (n == 4) break;
+--- exercises/014_while4.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/014_while4.zig 2023-10-05 20:04:06.906097406 +0200
+@@ -18,7 +18,7 @@
+ // Oh dear! This while loop will go forever?!
+ // Please fix this so the print statement below gives the desired output.
+ while (true) : (n += 1) {
+- if (???) ???;
++ if (n == 4) break;
+ }
+
+ // Result: we want n=4
diff --git a/patches/patches/015_for.patch b/patches/patches/015_for.patch
index e937221..bea2457 100644
--- a/patches/patches/015_for.patch
+++ b/patches/patches/015_for.patch
@@ -1,4 +1,11 @@
-18c18
-< for (???) |???| {
----
-> for (story) |scene| {
+--- exercises/015_for.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/015_for.zig 2023-10-05 20:04:06.909430803 +0200
+@@ -15,7 +15,7 @@
+
+ std.debug.print("A Dramatic Story: ", .{});
+
+- for (???) |???| {
++ for (story) |scene| {
+ if (scene == 'h') std.debug.print(":-) ", .{});
+ if (scene == 's') std.debug.print(":-( ", .{});
+ if (scene == 'n') std.debug.print(":-| ", .{});
diff --git a/patches/patches/016_for2.patch b/patches/patches/016_for2.patch
index bdbfc7d..458c6ce 100644
--- a/patches/patches/016_for2.patch
+++ b/patches/patches/016_for2.patch
@@ -1,4 +1,11 @@
-28c28
-< for (bits, ???) |bit, ???| {
----
-> for (bits, 0..) |bit, i| {
+--- exercises/016_for2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/016_for2.zig 2023-10-05 20:04:06.912764197 +0200
+@@ -25,7 +25,7 @@
+ // the value of the place as a power of two for each bit.
+ //
+ // See if you can figure out the missing pieces:
+- for (bits, ???) |bit, ???| {
++ for (bits, 0..) |bit, i| {
+ // Note that we convert the usize i to a u32 with
+ // @intCast(), a builtin function just like @import().
+ // We'll learn about these properly in a later exercise.
diff --git a/patches/patches/017_quiz2.patch b/patches/patches/017_quiz2.patch
index b46dab6..2547ff1 100644
--- a/patches/patches/017_quiz2.patch
+++ b/patches/patches/017_quiz2.patch
@@ -1,16 +1,25 @@
-12c12
-< const std = import standard library;
----
-> const std = @import("std");
-14c14
-< function main() void {
----
-> pub fn main() void {
-19c19
-< ??? (i <= stop_at) : (i += 1) {
----
-> while (i <= stop_at) : (i += 1) {
-23c23
-< std.debug.print("{}", .{???});
----
-> std.debug.print("{}", .{i});
+--- exercises/017_quiz2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/017_quiz2.zig 2023-10-05 20:04:06.919430989 +0200
+@@ -9,18 +9,18 @@
+ // Let's go from 1 to 16. This has been started for you, but there
+ // are some problems. :-(
+ //
+-const std = import standard library;
++const std = @import("std");
+
+-function main() void {
++pub fn main() void {
+ var i: u8 = 1;
+ const stop_at: u8 = 16;
+
+ // What kind of loop is this? A 'for' or a 'while'?
+- ??? (i <= stop_at) : (i += 1) {
++ while (i <= stop_at) : (i += 1) {
+ if (i % 3 == 0) std.debug.print("Fizz", .{});
+ if (i % 5 == 0) std.debug.print("Buzz", .{});
+ if (!(i % 3 == 0) and !(i % 5 == 0)) {
+- std.debug.print("{}", .{???});
++ std.debug.print("{}", .{i});
+ }
+ std.debug.print(", ", .{});
+ }
diff --git a/patches/patches/018_functions.patch b/patches/patches/018_functions.patch
index 1083a1a..55b7268 100644
--- a/patches/patches/018_functions.patch
+++ b/patches/patches/018_functions.patch
@@ -1,4 +1,10 @@
-28c28
-< ??? deepThought() ??? {
----
-> fn deepThought() u8 {
+--- exercises/018_functions.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/018_functions.zig 2023-10-05 20:04:06.922764386 +0200
+@@ -25,6 +25,6 @@
+ // We're just missing a couple things. One thing we're NOT missing is the
+ // keyword "pub", which is not needed here. Can you guess why?
+ //
+-??? deepThought() ??? {
++fn deepThought() u8 {
+ return 42; // Number courtesy Douglas Adams
+ }
diff --git a/patches/patches/019_functions2.patch b/patches/patches/019_functions2.patch
index 254889a..9be1095 100644
--- a/patches/patches/019_functions2.patch
+++ b/patches/patches/019_functions2.patch
@@ -1,4 +1,11 @@
-25c25
-< fn twoToThe(???) u32 {
----
-> fn twoToThe(my_number: u32) u32 {
+--- exercises/019_functions2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/019_functions2.zig 2023-10-05 20:04:06.926097780 +0200
+@@ -22,7 +22,7 @@
+ // You'll need to figure out the parameter name and type that we're
+ // expecting. The output type has already been specified for you.
+ //
+-fn twoToThe(???) u32 {
++fn twoToThe(my_number: u32) u32 {
+ return std.math.pow(u32, 2, my_number);
+ // std.math.pow(type, a, b) takes a numeric type and two
+ // numbers of that type (or that can coerce to that type) and
diff --git a/patches/patches/020_quiz3.patch b/patches/patches/020_quiz3.patch
index 6a00d31..e69f320 100644
--- a/patches/patches/020_quiz3.patch
+++ b/patches/patches/020_quiz3.patch
@@ -1,18 +1,30 @@
-24,25c24,25
-< fn printPowersOfTwo(numbers: [4]u16) ??? {
-< loop (numbers) |n| {
----
-> fn printPowersOfTwo(numbers: [4]u16) void {
-> for (numbers) |n| {
-34c34
-< fn twoToThe(number: u16) ??? {
----
-> fn twoToThe(number: u16) u16 {
-38c38
-< loop (n < number) : (n += 1) {
----
-> while (n < number) : (n += 1) {
-42c42
-< return ???;
----
-> return total;
+--- exercises/020_quiz3.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/020_quiz3.zig 2023-10-05 20:04:06.932764573 +0200
+@@ -21,8 +21,8 @@
+ //
+ // This function prints, but does not return anything.
+ //
+-fn printPowersOfTwo(numbers: [4]u16) ??? {
+- loop (numbers) |n| {
++fn printPowersOfTwo(numbers: [4]u16) void {
++ for (numbers) |n| {
+ std.debug.print("{} ", .{twoToThe(n)});
+ }
+ }
+@@ -31,13 +31,13 @@
+ // exercise. But don't be fooled! This one does the math without the aid
+ // of the standard library!
+ //
+-fn twoToThe(number: u16) ??? {
++fn twoToThe(number: u16) u16 {
+ var n: u16 = 0;
+ var total: u16 = 1;
+
+- loop (n < number) : (n += 1) {
++ while (n < number) : (n += 1) {
+ total *= 2;
+ }
+
+- return ???;
++ return total;
+ }
diff --git a/patches/patches/021_errors.patch b/patches/patches/021_errors.patch
index b37b3c8..518cdde 100644
--- a/patches/patches/021_errors.patch
+++ b/patches/patches/021_errors.patch
@@ -1,8 +1,20 @@
-12c12
-< ???,
----
-> TooSmall,
-29c29
-< if (???) {
----
-> if (number_error == MyNumberError.TooSmall) {
+--- exercises/021_errors.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/021_errors.zig 2023-10-05 20:04:06.936097967 +0200
+@@ -9,7 +9,7 @@
+ // "TooSmall". Please add it where needed!
+ const MyNumberError = error{
+ TooBig,
+- ???,
++ TooSmall,
+ TooFour,
+ };
+
+@@ -26,7 +26,7 @@
+ if (number_error == MyNumberError.TooBig) {
+ std.debug.print(">4. ", .{});
+ }
+- if (???) {
++ if (number_error == MyNumberError.TooSmall) {
+ std.debug.print("<4. ", .{});
+ }
+ if (number_error == MyNumberError.TooFour) {
diff --git a/patches/patches/022_errors2.patch b/patches/patches/022_errors2.patch
index 0501159..cc05b39 100644
--- a/patches/patches/022_errors2.patch
+++ b/patches/patches/022_errors2.patch
@@ -1,4 +1,11 @@
-22c22
-< var my_number: ??? = 5;
----
-> var my_number: MyNumberError!u8 = 5;
+--- exercises/022_errors2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/022_errors2.zig 2023-10-05 20:04:06.939431363 +0200
+@@ -19,7 +19,7 @@
+ const MyNumberError = error{TooSmall};
+
+ pub fn main() void {
+- var my_number: ??? = 5;
++ var my_number: MyNumberError!u8 = 5;
+
+ // Looks like my_number will need to either store a number OR
+ // an error. Can you set the type correctly above?
diff --git a/patches/patches/023_errors3.patch b/patches/patches/023_errors3.patch
index 9068e4a..6778d1b 100644
--- a/patches/patches/023_errors3.patch
+++ b/patches/patches/023_errors3.patch
@@ -1,8 +1,19 @@
-15c15
-< const b: u32 = addTwenty(4) ??? 22;
----
-> const b: u32 = addTwenty(4) catch 22;
-22c22
-< fn addTwenty(n: u32) ??? {
----
-> fn addTwenty(n: u32) MyNumberError!u32 {
+--- exercises/023_errors3.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/023_errors3.zig 2023-10-05 20:04:06.946098156 +0200
+@@ -12,14 +12,14 @@
+
+ pub fn main() void {
+ const a: u32 = addTwenty(44) catch 22;
+- const b: u32 = addTwenty(4) ??? 22;
++ const b: u32 = addTwenty(4) catch 22;
+
+ std.debug.print("a={}, b={}\n", .{ a, b });
+ }
+
+ // Please provide the return type from this function.
+ // Hint: it'll be an error union.
+-fn addTwenty(n: u32) ??? {
++fn addTwenty(n: u32) MyNumberError!u32 {
+ if (n < 5) {
+ return MyNumberError.TooSmall;
+ } else {
diff --git a/patches/patches/024_errors4.patch b/patches/patches/024_errors4.patch
index 48e0821..6753d92 100644
--- a/patches/patches/024_errors4.patch
+++ b/patches/patches/024_errors4.patch
@@ -1,10 +1,17 @@
-62c62,68
-< return detectProblems(n) ???;
----
-> return detectProblems(n) catch |err| {
-> if (err == MyNumberError.TooSmall) {
-> return 10;
-> }
->
-> return err;
-> };
+--- exercises/024_errors4.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/024_errors4.zig 2023-10-05 20:04:06.949431550 +0200
+@@ -59,7 +59,13 @@
+ // If we get a TooSmall error, we should return 10.
+ // If we get any other error, we should return that error.
+ // Otherwise, we return the u32 number.
+- return detectProblems(n) ???;
++ return detectProblems(n) catch |err| {
++ if (err == MyNumberError.TooSmall) {
++ return 10;
++ }
++
++ return err;
++ };
+ }
+
+ fn detectProblems(n: u32) MyNumberError!u32 {
diff --git a/patches/patches/025_errors5.patch b/patches/patches/025_errors5.patch
index 8aa59d4..4495ed6 100644
--- a/patches/patches/025_errors5.patch
+++ b/patches/patches/025_errors5.patch
@@ -1,4 +1,11 @@
-29c29
-< var x = detect(n);
----
-> var x = try detect(n);
+--- exercises/025_errors5.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/025_errors5.zig 2023-10-05 20:04:06.952764946 +0200
+@@ -26,7 +26,7 @@
+ // This function needs to return any error which might come back from detect().
+ // Please use a "try" statement rather than a "catch".
+ //
+- var x = detect(n);
++ var x = try detect(n);
+
+ return x + 5;
+ }
diff --git a/patches/patches/026_hello2.patch b/patches/patches/026_hello2.patch
index e97a7b5..f0224a1 100644
--- a/patches/patches/026_hello2.patch
+++ b/patches/patches/026_hello2.patch
@@ -1,4 +1,9 @@
-26c26
-< stdout.print("Hello world!\n", .{});
----
-> try stdout.print("Hello world!\n", .{});
+--- exercises/026_hello2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/026_hello2.zig 2023-10-05 20:04:06.959431737 +0200
+@@ -23,5 +23,5 @@
+ // to be able to pass it up as a return value of main().
+ //
+ // We just learned of a single statement which can accomplish this.
+- stdout.print("Hello world!\n", .{});
++ try stdout.print("Hello world!\n", .{});
+ }
diff --git a/patches/patches/027_defer.patch b/patches/patches/027_defer.patch
index 6ff7f98..6abec5b 100644
--- a/patches/patches/027_defer.patch
+++ b/patches/patches/027_defer.patch
@@ -1,4 +1,10 @@
-23c23
-< std.debug.print("Two\n", .{});
----
-> defer std.debug.print("Two\n", .{});
+--- exercises/027_defer.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/027_defer.zig 2023-10-05 20:04:06.962765133 +0200
+@@ -20,6 +20,6 @@
+ pub fn main() void {
+ // Without changing anything else, please add a 'defer' statement
+ // to this code so that our program prints "One Two\n":
+- std.debug.print("Two\n", .{});
++ defer std.debug.print("Two\n", .{});
+ std.debug.print("One ", .{});
+ }
diff --git a/patches/patches/028_defer2.patch b/patches/patches/028_defer2.patch
index 14caf8b..f09b1e5 100644
--- a/patches/patches/028_defer2.patch
+++ b/patches/patches/028_defer2.patch
@@ -1,4 +1,11 @@
-21c21
-< std.debug.print(") ", .{}); // <---- how?!
----
-> defer std.debug.print(") ", .{}); // <---- how?!
+--- exercises/028_defer2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/028_defer2.zig 2023-10-05 20:04:06.966098530 +0200
+@@ -18,7 +18,7 @@
+ fn printAnimal(animal: u8) void {
+ std.debug.print("(", .{});
+
+- std.debug.print(") ", .{}); // <---- how?!
++ defer std.debug.print(") ", .{}); // <---- how?!
+
+ if (animal == 'g') {
+ std.debug.print("Goat", .{});
diff --git a/patches/patches/029_errdefer.patch b/patches/patches/029_errdefer.patch
index aa42279..e147027 100644
--- a/patches/patches/029_errdefer.patch
+++ b/patches/patches/029_errdefer.patch
@@ -1,4 +1,11 @@
-35c35
-< std.debug.print("failed!\n", .{});
----
-> errdefer std.debug.print("failed!\n", .{});
+--- exercises/029_errdefer.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/029_errdefer.zig 2023-10-05 20:04:06.972765320 +0200
+@@ -32,7 +32,7 @@
+
+ // Please make the "failed" message print ONLY if the makeNumber()
+ // function exits with an error:
+- std.debug.print("failed!\n", .{});
++ errdefer std.debug.print("failed!\n", .{});
+
+ var num = try getNumber(); // <-- This could fail!
+
diff --git a/patches/patches/030_switch.patch b/patches/patches/030_switch.patch
index 05cbe1a..69c683e 100644
--- a/patches/patches/030_switch.patch
+++ b/patches/patches/030_switch.patch
@@ -1,2 +1,10 @@
-48a49
-> else => std.debug.print("?", .{}),
+--- exercises/030_switch.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/030_switch.zig 2023-10-05 20:04:06.976098717 +0200
+@@ -46,6 +46,7 @@
+ // match for every possible value). Please add an "else"
+ // to this switch to print a question mark "?" when c is
+ // not one of the existing matches.
++ else => std.debug.print("?", .{}),
+ }
+ }
+
diff --git a/patches/patches/031_switch2.patch b/patches/patches/031_switch2.patch
index f786762..4bac7cc 100644
--- a/patches/patches/031_switch2.patch
+++ b/patches/patches/031_switch2.patch
@@ -1,2 +1,10 @@
-33a34
-> else => '!',
+--- exercises/031_switch2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/031_switch2.zig 2023-10-05 20:04:06.979432113 +0200
+@@ -31,6 +31,7 @@
+ 26 => 'Z',
+ // As in the last exercise, please add the 'else' clause
+ // and this time, have it return an exclamation mark '!'.
++ else => '!',
+ };
+
+ std.debug.print("{c}", .{real_char});
diff --git a/patches/patches/032_unreachable.patch b/patches/patches/032_unreachable.patch
index 0883932..bab0e50 100644
--- a/patches/patches/032_unreachable.patch
+++ b/patches/patches/032_unreachable.patch
@@ -1,2 +1,10 @@
-37a38
-> else => unreachable,
+--- exercises/032_unreachable.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/032_unreachable.zig 2023-10-05 20:04:06.986098904 +0200
+@@ -35,6 +35,7 @@
+ 3 => {
+ current_value *= current_value;
+ },
++ else => unreachable,
+ }
+
+ std.debug.print("{} ", .{current_value});
diff --git a/patches/patches/033_iferror.patch b/patches/patches/033_iferror.patch
index 8433e8a..eb7ec98 100644
--- a/patches/patches/033_iferror.patch
+++ b/patches/patches/033_iferror.patch
@@ -1,2 +1,10 @@
-41a42
-> MyNumberError.TooSmall => std.debug.print("<4. ", .{}),
+--- exercises/033_iferror.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/033_iferror.zig 2023-10-05 20:04:06.989432300 +0200
+@@ -39,6 +39,7 @@
+ std.debug.print("={}. ", .{value});
+ } else |err| switch (err) {
+ MyNumberError.TooBig => std.debug.print(">4. ", .{}),
++ MyNumberError.TooSmall => std.debug.print("<4. ", .{}),
+ // Please add a match for TooSmall here and have it print: "<4. "
+ }
+ }
diff --git a/patches/patches/034_quiz4.patch b/patches/patches/034_quiz4.patch
index b259352..8c0bc0e 100644
--- a/patches/patches/034_quiz4.patch
+++ b/patches/patches/034_quiz4.patch
@@ -1,8 +1,15 @@
-12c12
-< pub fn main() void {
----
-> pub fn main() !void {
-15c15
-< const my_num: u32 = getNumber();
----
-> const my_num: u32 = try getNumber();
+--- exercises/034_quiz4.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/034_quiz4.zig 2023-10-05 20:04:06.996099091 +0200
+@@ -9,10 +9,10 @@
+
+ const NumError = error{IllegalNumber};
+
+-pub fn main() void {
++pub fn main() !void {
+ const stdout = std.io.getStdOut().writer();
+
+- const my_num: u32 = getNumber();
++ const my_num: u32 = try getNumber();
+
+ try stdout.print("my_num={}\n", .{my_num});
+ }
diff --git a/patches/patches/035_enums.patch b/patches/patches/035_enums.patch
index ed2344b..4514a14 100644
--- a/patches/patches/035_enums.patch
+++ b/patches/patches/035_enums.patch
@@ -1,4 +1,11 @@
-23c23
-< const Ops = enum { ??? };
----
-> const Ops = enum { dec, inc, pow };
+--- exercises/035_enums.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/035_enums.zig 2023-10-05 20:04:06.999432487 +0200
+@@ -20,7 +20,7 @@
+ const std = @import("std");
+
+ // Please complete the enum!
+-const Ops = enum { ??? };
++const Ops = enum { dec, inc, pow };
+
+ pub fn main() void {
+ const operations = [_]Ops{
diff --git a/patches/patches/036_enums2.patch b/patches/patches/036_enums2.patch
index 367b780..b8855c3 100644
--- a/patches/patches/036_enums2.patch
+++ b/patches/patches/036_enums2.patch
@@ -1,12 +1,26 @@
-34c34
-< blue = ???,
----
-> blue = 0x0000ff,
-56c56
-< \\ <span style="color: #{}">Blue</span>
----
-> \\ <span style="color: #{x:0>6}">Blue</span>
-62c62
-< @intFromEnum(???), // Oops! We're missing something!
----
-> @intFromEnum(Color.blue), // Oops! We're missing something!
+--- exercises/036_enums2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/036_enums2.zig 2023-10-05 20:04:07.002765884 +0200
+@@ -31,7 +31,7 @@
+ const Color = enum(u32) {
+ red = 0xff0000,
+ green = 0x00ff00,
+- blue = ???,
++ blue = 0x0000ff,
+ };
+
+ pub fn main() void {
+@@ -53,12 +53,12 @@
+ \\<p>
+ \\ <span style="color: #{x:0>6}">Red</span>
+ \\ <span style="color: #{x:0>6}">Green</span>
+- \\ <span style="color: #{}">Blue</span>
++ \\ <span style="color: #{x:0>6}">Blue</span>
+ \\</p>
+ \\
+ , .{
+ @intFromEnum(Color.red),
+ @intFromEnum(Color.green),
+- @intFromEnum(???), // Oops! We're missing something!
++ @intFromEnum(Color.blue), // Oops! We're missing something!
+ });
+ }
diff --git a/patches/patches/037_structs.patch b/patches/patches/037_structs.patch
index c26510d..7edad0f 100644
--- a/patches/patches/037_structs.patch
+++ b/patches/patches/037_structs.patch
@@ -1,4 +1,18 @@
-38a39
-> health: u8,
-46a48
-> .health = 100,
+--- exercises/037_structs.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/037_structs.zig 2023-10-05 20:04:07.009432674 +0200
+@@ -36,6 +36,7 @@
+ role: Role,
+ gold: u32,
+ experience: u32,
++ health: u8,
+ };
+
+ pub fn main() void {
+@@ -44,6 +45,7 @@
+ .role = Role.wizard,
+ .gold = 20,
+ .experience = 10,
++ .health = 100,
+ };
+
+ // Glorp gains some gold.
diff --git a/patches/patches/038_structs2.patch b/patches/patches/038_structs2.patch
index 7d85de0..456fbff 100644
--- a/patches/patches/038_structs2.patch
+++ b/patches/patches/038_structs2.patch
@@ -1,7 +1,15 @@
-44a45,50
-> chars[1] = Character{
-> .role = Role.bard,
-> .gold = 10,
-> .health = 100,
-> .experience = 20,
-> };
+--- exercises/038_structs2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/038_structs2.zig 2023-10-05 20:04:07.012766070 +0200
+@@ -42,6 +42,12 @@
+ //
+ // Feel free to run this program without adding Zump. What does
+ // it do and why?
++ chars[1] = Character{
++ .role = Role.bard,
++ .gold = 10,
++ .health = 100,
++ .experience = 20,
++ };
+
+ // Printing all RPG characters in a loop:
+ for (chars, 0..) |c, num| {
diff --git a/patches/patches/039_pointers.patch b/patches/patches/039_pointers.patch
index 57d67e5..7d75237 100644
--- a/patches/patches/039_pointers.patch
+++ b/patches/patches/039_pointers.patch
@@ -1,4 +1,11 @@
-33c33
-< num2 = ???;
----
-> num2 = num1_pointer.*;
+--- exercises/039_pointers.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/039_pointers.zig 2023-10-05 20:04:07.016099467 +0200
+@@ -30,7 +30,7 @@
+
+ // Please make num2 equal 5 using num1_pointer!
+ // (See the "cheatsheet" above for ideas.)
+- num2 = ???;
++ num2 = num1_pointer.*;
+
+ std.debug.print("num1: {}, num2: {}\n", .{ num1, num2 });
+ }
diff --git a/patches/patches/040_pointers2.patch b/patches/patches/040_pointers2.patch
index 87291c3..acdd619 100644
--- a/patches/patches/040_pointers2.patch
+++ b/patches/patches/040_pointers2.patch
@@ -1,4 +1,11 @@
-26c26
-< const b: *u8 = &a; // fix this!
----
-> const b: *const u8 = &a; // fix this!
+--- exercises/040_pointers2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/040_pointers2.zig 2023-10-05 20:04:07.022766257 +0200
+@@ -23,7 +23,7 @@
+
+ pub fn main() void {
+ const a: u8 = 12;
+- const b: *u8 = &a; // fix this!
++ const b: *const u8 = &a; // fix this!
+
+ std.debug.print("a: {}, b: {}\n", .{ a, b.* });
+ }
diff --git a/patches/patches/041_pointers3.patch b/patches/patches/041_pointers3.patch
index 02f7744..63a5661 100644
--- a/patches/patches/041_pointers3.patch
+++ b/patches/patches/041_pointers3.patch
@@ -1,4 +1,11 @@
-34c34
-< ??? p: ??? = undefined;
----
-> var p: *u8 = undefined;
+--- exercises/041_pointers3.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/041_pointers3.zig 2023-10-05 20:04:07.026099654 +0200
+@@ -31,7 +31,7 @@
+
+ // Please define pointer "p" so that it can point to EITHER foo or
+ // bar AND change the value it points to!
+- ??? p: ??? = undefined;
++ var p: *u8 = undefined;
+
+ p = &foo;
+ p.* += 1;
diff --git a/patches/patches/042_pointers4.patch b/patches/patches/042_pointers4.patch
index 8e21b81..544cc97 100644
--- a/patches/patches/042_pointers4.patch
+++ b/patches/patches/042_pointers4.patch
@@ -1,4 +1,9 @@
-40c40
-< ??? = 5; // fix me!
----
-> x.* = 5; // fix me!
+--- exercises/042_pointers4.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/042_pointers4.zig 2023-10-05 20:04:07.032766444 +0200
+@@ -37,5 +37,5 @@
+ // This function should take a reference to a u8 value and set it
+ // to 5.
+ fn makeFive(x: *u8) void {
+- ??? = 5; // fix me!
++ x.* = 5; // fix me!
+ }
diff --git a/patches/patches/043_pointers5.patch b/patches/patches/043_pointers5.patch
index ac6a8ca..beb3d38 100644
--- a/patches/patches/043_pointers5.patch
+++ b/patches/patches/043_pointers5.patch
@@ -1,4 +1,11 @@
-71c71
-< printCharacter(???);
----
-> printCharacter(&glorp);
+--- exercises/043_pointers5.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/043_pointers5.zig 2023-10-05 20:04:07.036099841 +0200
+@@ -68,7 +68,7 @@
+
+ // FIX ME!
+ // Please pass Glorp to printCharacter():
+- printCharacter(???);
++ printCharacter(&glorp);
+ }
+
+ // Note how this function's "c" parameter is a pointer to a Character struct.
diff --git a/patches/patches/044_quiz5.patch b/patches/patches/044_quiz5.patch
index 44d4451..0fd42cf 100644
--- a/patches/patches/044_quiz5.patch
+++ b/patches/patches/044_quiz5.patch
@@ -1,4 +1,17 @@
-21a22
-> var elephantB = Elephant{ .letter = 'B' };
-27a29
-> elephantB.tail = &elephantC;
+--- exercises/044_quiz5.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/044_quiz5.zig 2023-10-05 20:04:07.039433235 +0200
+@@ -19,12 +19,14 @@
+ pub fn main() void {
+ var elephantA = Elephant{ .letter = 'A' };
+ // (Please add Elephant B here!)
++ var elephantB = Elephant{ .letter = 'B' };
+ var elephantC = Elephant{ .letter = 'C' };
+
+ // Link the elephants so that each tail "points" to the next elephant.
+ // They make a circle: A->B->C->A...
+ elephantA.tail = &elephantB;
+ // (Please link Elephant B's tail to Elephant C here!)
++ elephantB.tail = &elephantC;
+ elephantC.tail = &elephantA;
+
+ visitElephants(&elephantA);
diff --git a/patches/patches/045_optionals.patch b/patches/patches/045_optionals.patch
index f1b9ddd..e7c70c2 100644
--- a/patches/patches/045_optionals.patch
+++ b/patches/patches/045_optionals.patch
@@ -1,4 +1,11 @@
-32c32
-< const answer: u8 = result;
----
-> const answer: u8 = result orelse 42;
+--- exercises/045_optionals.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/045_optionals.zig 2023-10-05 20:04:07.046100027 +0200
+@@ -29,7 +29,7 @@
+
+ // Please threaten the result so that answer is either the
+ // integer value from deepThought() OR the number 42:
+- const answer: u8 = result;
++ const answer: u8 = result orelse 42;
+
+ std.debug.print("The Ultimate Answer: {}.\n", .{answer});
+ }
diff --git a/patches/patches/046_optionals2.patch b/patches/patches/046_optionals2.patch
index 89fa604..66912eb 100644
--- a/patches/patches/046_optionals2.patch
+++ b/patches/patches/046_optionals2.patch
@@ -1,8 +1,20 @@
-24c24
-< tail: *Elephant = null, // Hmm... tail needs something...
----
-> tail: ?*Elephant = null, // <---- make this optional!
-54c54
-< if (e.tail == null) ???;
----
-> if (e.tail == null) break;
+--- exercises/046_optionals2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/046_optionals2.zig 2023-10-05 20:04:07.049433424 +0200
+@@ -21,7 +21,7 @@
+
+ const Elephant = struct {
+ letter: u8,
+- tail: *Elephant = null, // Hmm... tail needs something...
++ tail: ?*Elephant = null, // <---- make this optional!
+ visited: bool = false,
+ };
+
+@@ -51,7 +51,7 @@
+ // We should stop once we encounter a tail that
+ // does NOT point to another element. What can
+ // we put here to make that happen?
+- if (e.tail == null) ???;
++ if (e.tail == null) break;
+
+ e = e.tail.?;
+ }
diff --git a/patches/patches/047_methods.patch b/patches/patches/047_methods.patch
index c64f657..a7e8a26 100644
--- a/patches/patches/047_methods.patch
+++ b/patches/patches/047_methods.patch
@@ -1,4 +1,11 @@
-91c91
-< ???.zap(???);
----
-> heat_ray.zap(alien);
+--- exercises/047_methods.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/047_methods.zig 2023-10-05 20:04:07.056100214 +0200
+@@ -88,7 +88,7 @@
+ for (&aliens) |*alien| {
+
+ // *** Zap the alien with the heat ray here! ***
+- ???.zap(???);
++ heat_ray.zap(alien);
+
+ // If the alien's health is still above 0, it's still alive.
+ if (alien.health > 0) aliens_alive += 1;
diff --git a/patches/patches/048_methods2.patch b/patches/patches/048_methods2.patch
index cd1b5d0..b784657 100644
--- a/patches/patches/048_methods2.patch
+++ b/patches/patches/048_methods2.patch
@@ -1,4 +1,11 @@
-57c57
-< e = if (e.hasTail()) e.??? else break;
----
-> e = if (e.hasTail()) e.getTail() else break;
+--- exercises/048_methods2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/048_methods2.zig 2023-10-05 20:04:07.059433611 +0200
+@@ -54,7 +54,7 @@
+
+ // This gets the next elephant or stops:
+ // which method do we want here?
+- e = if (e.hasTail()) e.??? else break;
++ e = if (e.hasTail()) e.getTail() else break;
+ }
+ }
+
diff --git a/patches/patches/049_quiz6.patch b/patches/patches/049_quiz6.patch
index 83f9faf..0c7bbc3 100644
--- a/patches/patches/049_quiz6.patch
+++ b/patches/patches/049_quiz6.patch
@@ -1,11 +1,18 @@
-28a29,31
-> pub fn getTrunk(self: *Elephant) *Elephant {
-> return self.trunk.?;
-> }
-30,31c33,35
-< ???
-<
----
-> pub fn hasTrunk(self: *Elephant) bool {
-> return (self.trunk != null);
-> }
+--- exercises/049_quiz6.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/049_quiz6.zig 2023-10-05 20:04:07.062767005 +0200
+@@ -26,9 +26,13 @@
+
+ // Your Elephant trunk methods go here!
+ // ---------------------------------------------------
++ pub fn getTrunk(self: *Elephant) *Elephant {
++ return self.trunk.?;
++ }
+
+- ???
+-
++ pub fn hasTrunk(self: *Elephant) bool {
++ return (self.trunk != null);
++ }
+ // ---------------------------------------------------
+
+ pub fn visit(self: *Elephant) void {
diff --git a/patches/patches/050_no_value.patch b/patches/patches/050_no_value.patch
index 7ea4e9e..276f93f 100644
--- a/patches/patches/050_no_value.patch
+++ b/patches/patches/050_no_value.patch
@@ -1,14 +1,26 @@
-68c68
-< var first_line1: *const [16]u8 = ???;
----
-> var first_line1: *const [16]u8 = undefined;
-71c71
-< var first_line2: Err!*const [21]u8 = ???;
----
-> var first_line2: Err!*const [21]u8 = Err.Cthulhu;
-80,81c80,81
-< fn printSecondLine() ??? {
-< var second_line2: ?*const [18]u8 = ???;
----
-> fn printSecondLine() void {
-> var second_line2: ?*const [18]u8 = null;
+--- exercises/050_no_value.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/050_no_value.zig 2023-10-05 20:04:07.069433797 +0200
+@@ -65,10 +65,10 @@
+ const Err = error{Cthulhu};
+
+ pub fn main() void {
+- var first_line1: *const [16]u8 = ???;
++ var first_line1: *const [16]u8 = undefined;
+ first_line1 = "That is not dead";
+
+- var first_line2: Err!*const [21]u8 = ???;
++ var first_line2: Err!*const [21]u8 = Err.Cthulhu;
+ first_line2 = "which can eternal lie";
+
+ // Note we need the "{!s}" format for the error union string.
+@@ -77,8 +77,8 @@
+ printSecondLine();
+ }
+
+-fn printSecondLine() ??? {
+- var second_line2: ?*const [18]u8 = ???;
++fn printSecondLine() void {
++ var second_line2: ?*const [18]u8 = null;
+ second_line2 = "even death may die";
+
+ std.debug.print("And with strange aeons {s}.\n", .{second_line2.?});
diff --git a/patches/patches/051_values.patch b/patches/patches/051_values.patch
index 03dfc88..bb65525 100644
--- a/patches/patches/051_values.patch
+++ b/patches/patches/051_values.patch
@@ -1,12 +1,27 @@
-90c90
-< const print = ???;
----
-> const print = std.debug.print;
-155c155
-< levelUp(glorp, reward_xp);
----
-> levelUp(&glorp, reward_xp);
-161c161
-< fn levelUp(character_access: Character, xp: u32) void {
----
-> fn levelUp(character_access: *Character, xp: u32) void {
+--- exercises/051_values.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/051_values.zig 2023-10-05 20:04:07.072767194 +0200
+@@ -87,7 +87,7 @@
+ // Let's assign the std.debug.print function to a const named
+ // "print" so that we can use this new name later!
+
+- const print = ???;
++ const print = std.debug.print;
+
+ // Now let's look at assigning and pointing to values in Zig.
+ //
+@@ -152,13 +152,13 @@
+ print("XP before:{}, ", .{glorp.experience});
+
+ // Fix 1 of 2 goes here:
+- levelUp(glorp, reward_xp);
++ levelUp(&glorp, reward_xp);
+
+ print("after:{}.\n", .{glorp.experience});
+ }
+
+ // Fix 2 of 2 goes here:
+-fn levelUp(character_access: Character, xp: u32) void {
++fn levelUp(character_access: *Character, xp: u32) void {
+ character_access.experience += xp;
+ }
+
diff --git a/patches/patches/052_slices.patch b/patches/patches/052_slices.patch
index 24803d7..e38d955 100644
--- a/patches/patches/052_slices.patch
+++ b/patches/patches/052_slices.patch
@@ -1,10 +1,22 @@
-35,36c35,36
-< const hand1: []u8 = cards[???];
-< const hand2: []u8 = cards[???];
----
-> const hand1: []u8 = cards[0..4];
-> const hand2: []u8 = cards[4..];
-46c46
-< fn printHand(hand: ???) void {
----
-> fn printHand(hand: []u8) void {
+--- exercises/052_slices.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/052_slices.zig 2023-10-05 20:04:07.079433985 +0200
+@@ -32,8 +32,8 @@
+ var cards = [8]u8{ 'A', '4', 'K', '8', '5', '2', 'Q', 'J' };
+
+ // Please put the first 4 cards in hand1 and the rest in hand2.
+- const hand1: []u8 = cards[???];
+- const hand2: []u8 = cards[???];
++ const hand1: []u8 = cards[0..4];
++ const hand2: []u8 = cards[4..];
+
+ std.debug.print("Hand1: ", .{});
+ printHand(hand1);
+@@ -43,7 +43,7 @@
+ }
+
+ // Please lend this function a hand. A u8 slice hand, that is.
+-fn printHand(hand: ???) void {
++fn printHand(hand: []u8) void {
+ for (hand) |h| {
+ std.debug.print("{u} ", .{h});
+ }
diff --git a/patches/patches/053_slices2.patch b/patches/patches/053_slices2.patch
index f5403a2..afad930 100644
--- a/patches/patches/053_slices2.patch
+++ b/patches/patches/053_slices2.patch
@@ -1,20 +1,29 @@
-20,22c20,22
-< const base1: []u8 = scrambled[15..23];
-< const base2: []u8 = scrambled[6..10];
-< const base3: []u8 = scrambled[32..];
----
-> const base1: []const u8 = scrambled[15..23];
-> const base2: []const u8 = scrambled[6..10];
-> const base3: []const u8 = scrambled[32..];
-25,27c25,27
-< const justice1: []u8 = scrambled[11..14];
-< const justice2: []u8 = scrambled[0..5];
-< const justice3: []u8 = scrambled[24..31];
----
-> const justice1: []const u8 = scrambled[11..14];
-> const justice2: []const u8 = scrambled[0..5];
-> const justice3: []const u8 = scrambled[24..31];
-33c33
-< fn printPhrase(part1: []u8, part2: []u8, part3: []u8) void {
----
-> fn printPhrase(part1: []const u8, part2: []const u8, part3: []const u8) void {
+--- exercises/053_slices2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/053_slices2.zig 2023-10-05 20:04:07.082767381 +0200
+@@ -17,19 +17,19 @@
+ pub fn main() void {
+ const scrambled = "great base for all your justice are belong to us";
+
+- const base1: []u8 = scrambled[15..23];
+- const base2: []u8 = scrambled[6..10];
+- const base3: []u8 = scrambled[32..];
++ const base1: []const u8 = scrambled[15..23];
++ const base2: []const u8 = scrambled[6..10];
++ const base3: []const u8 = scrambled[32..];
+ printPhrase(base1, base2, base3);
+
+- const justice1: []u8 = scrambled[11..14];
+- const justice2: []u8 = scrambled[0..5];
+- const justice3: []u8 = scrambled[24..31];
++ const justice1: []const u8 = scrambled[11..14];
++ const justice2: []const u8 = scrambled[0..5];
++ const justice3: []const u8 = scrambled[24..31];
+ printPhrase(justice1, justice2, justice3);
+
+ std.debug.print("\n", .{});
+ }
+
+-fn printPhrase(part1: []u8, part2: []u8, part3: []u8) void {
++fn printPhrase(part1: []const u8, part2: []const u8, part3: []const u8) void {
+ std.debug.print("'{s} {s} {s}.' ", .{ part1, part2, part3 });
+ }
diff --git a/patches/patches/054_manypointers.patch b/patches/patches/054_manypointers.patch
index d8d2e6c..9570295 100644
--- a/patches/patches/054_manypointers.patch
+++ b/patches/patches/054_manypointers.patch
@@ -1,4 +1,11 @@
-35c35
-< const zen12_string: []const u8 = zen_manyptr;
----
-> const zen12_string: []const u8 = zen_manyptr[0..21];
+--- exercises/054_manypointers.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/054_manypointers.zig 2023-10-05 20:04:07.086100775 +0200
+@@ -32,7 +32,7 @@
+ // we can CONVERT IT TO A SLICE. (Hint: we do know the length!)
+ //
+ // Please fix this line so the print statement below can print it:
+- const zen12_string: []const u8 = zen_manyptr;
++ const zen12_string: []const u8 = zen_manyptr[0..21];
+
+ // Here's the moment of truth!
+ std.debug.print("{s}\n", .{zen12_string});
diff --git a/patches/patches/055_unions.patch b/patches/patches/055_unions.patch
index c362f20..7c4cfa2 100644
--- a/patches/patches/055_unions.patch
+++ b/patches/patches/055_unions.patch
@@ -1,6 +1,13 @@
-62,63c62,63
-< printInsect(ant, AntOrBee.c);
-< printInsect(bee, AntOrBee.c);
----
-> printInsect(ant, AntOrBee.a);
-> printInsect(bee, AntOrBee.b);
+--- exercises/055_unions.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/055_unions.zig 2023-10-05 20:04:07.092767568 +0200
+@@ -59,8 +59,8 @@
+ std.debug.print("Insect report! ", .{});
+
+ // Oops! We've made a mistake here.
+- printInsect(ant, AntOrBee.c);
+- printInsect(bee, AntOrBee.c);
++ printInsect(ant, AntOrBee.a);
++ printInsect(bee, AntOrBee.b);
+
+ std.debug.print("\n", .{});
+ }
diff --git a/patches/patches/056_unions2.patch b/patches/patches/056_unions2.patch
index 7341f7a..3423ccf 100644
--- a/patches/patches/056_unions2.patch
+++ b/patches/patches/056_unions2.patch
@@ -1,10 +1,20 @@
-47,48c47,48
-< printInsect(???);
-< printInsect(???);
----
-> printInsect(ant);
-> printInsect(bee);
-54c54
-< switch (???) {
----
-> switch (insect) {
+--- exercises/056_unions2.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/056_unions2.zig 2023-10-05 20:04:07.096100965 +0200
+@@ -44,14 +44,14 @@
+ std.debug.print("Insect report! ", .{});
+
+ // Could it really be as simple as just passing the union?
+- printInsect(???);
+- printInsect(???);
++ printInsect(ant);
++ printInsect(bee);
+
+ std.debug.print("\n", .{});
+ }
+
+ fn printInsect(insect: Insect) void {
+- switch (???) {
++ switch (insect) {
+ .still_alive => |a| std.debug.print("Ant alive is: {}. ", .{a}),
+ .flowers_visited => |f| std.debug.print("Bee visited {} flowers. ", .{f}),
+ }
diff --git a/patches/patches/057_unions3.patch b/patches/patches/057_unions3.patch
index 17e27a2..b0ba833 100644
--- a/patches/patches/057_unions3.patch
+++ b/patches/patches/057_unions3.patch
@@ -1,4 +1,11 @@
-18c18
-< const Insect = union(InsectStat) {
----
-> const Insect = union(enum) {
+--- exercises/057_unions3.zig 2023-10-03 22:15:22.122241138 +0200
++++ answers/057_unions3.zig 2023-10-05 20:04:07.099434359 +0200
+@@ -15,7 +15,7 @@
+ //
+ const std = @import("std");
+
+-const Insect = union(InsectStat) {
++const Insect = union(enum) {
+ flowers_visited: u16,
+ still_alive: bool,
+ };
diff --git a/patches/patches/058_quiz7.patch b/patches/patches/058_quiz7.patch
index ac21352..265b9e3 100644
--- a/patches/patches/058_quiz7.patch
+++ b/patches/patches/058_quiz7.patch
@@ -1,14 +1,31 @@
-195,196c195,196
-< .place => print("{s}", .{p.name}),
-< .path => print("--{}->", .{p.dist}),
----
-> .place => |p| print("{s}", .{p.name}),
-> .path => |p| print("--{}->", .{p.dist}),
-258c258
-< if (place == entry.*.?.place) return entry;
----
-> if (place == entry.*.?.place) return &entry.*.?;
-312c312
-< fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) void {
----
-> fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) TripError!void {
+--- exercises/058_quiz7.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/058_quiz7.zig 2023-10-05 20:04:07.106101152 +0200
+@@ -192,8 +192,8 @@
+ // Oops! The hermit forgot how to capture the union values
+ // in a switch statement. Please capture both values as
+ // 'p' so the print statements work!
+- .place => print("{s}", .{p.name}),
+- .path => print("--{}->", .{p.dist}),
++ .place => |p| print("{s}", .{p.name}),
++ .path => |p| print("--{}->", .{p.dist}),
+ }
+ }
+ };
+@@ -255,7 +255,7 @@
+ // dereference and optional value "unwrapping" look
+ // together. Remember that you return the address with the
+ // "&" operator.
+- if (place == entry.*.?.place) return entry;
++ if (place == entry.*.?.place) return &entry.*.?;
+ // Try to make your answer this long:__________;
+ }
+ return null;
+@@ -309,7 +309,7 @@
+ //
+ // Looks like the hermit forgot something in the return value of
+ // this function. What could that be?
+- fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) void {
++ fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) TripError!void {
+ // We start at the destination entry.
+ const destination_entry = self.getEntry(dest);
+
diff --git a/patches/patches/059_integers.patch b/patches/patches/059_integers.patch
index c75cf8a..a00c28d 100644
--- a/patches/patches/059_integers.patch
+++ b/patches/patches/059_integers.patch
@@ -1,8 +1,15 @@
-23,25c23,25
-< 0o131, // octal
-< 0b1101000, // binary
-< 0x66, // hex
----
-> 0o132, // octal
-> 0b1101001, // binary
-> 0x67, // hex
+--- exercises/059_integers.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/059_integers.zig 2023-10-05 20:04:07.109434546 +0200
+@@ -20,9 +20,9 @@
+
+ pub fn main() void {
+ const zig = [_]u8{
+- 0o131, // octal
+- 0b1101000, // binary
+- 0x66, // hex
++ 0o132, // octal
++ 0b1101001, // binary
++ 0x67, // hex
+ };
+
+ print("{s} is cool.\n", .{zig});
diff --git a/patches/patches/060_floats.patch b/patches/patches/060_floats.patch
index 0cfa18e..3a130dd 100644
--- a/patches/patches/060_floats.patch
+++ b/patches/patches/060_floats.patch
@@ -1,4 +1,11 @@
-46c46
-< const shuttle_weight: f16 = 907.18 * 2200;
----
-> const shuttle_weight: f32 = 907.18 * 2200.0;
+--- exercises/060_floats.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/060_floats.zig 2023-10-05 20:04:07.112767942 +0200
+@@ -43,7 +43,7 @@
+ //
+ // We'll convert this weight from tons to kilograms at a
+ // conversion of 907.18kg to the ton.
+- const shuttle_weight: f16 = 907.18 * 2200;
++ const shuttle_weight: f32 = 907.18 * 2200.0;
+
+ // By default, float values are formatted in scientific
+ // notation. Try experimenting with '{d}' and '{d:.3}' to see
diff --git a/patches/patches/061_coercions.patch b/patches/patches/061_coercions.patch
index 4661154..0f13cca 100644
--- a/patches/patches/061_coercions.patch
+++ b/patches/patches/061_coercions.patch
@@ -1,4 +1,11 @@
-70c70
-< const my_letter: ??? = &letter;
----
-> const my_letter: ?*[1]u8 = &letter;
+--- exercises/061_coercions.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/061_coercions.zig 2023-10-05 20:04:07.119434735 +0200
+@@ -67,7 +67,7 @@
+ pub fn main() void {
+ var letter: u8 = 'A';
+
+- const my_letter: ??? = &letter;
++ const my_letter: ?*[1]u8 = &letter;
+ // ^^^^^^^
+ // Your type here.
+ // Must coerce from &letter (which is a *u8).
diff --git a/patches/patches/062_loop_expressions.patch b/patches/patches/062_loop_expressions.patch
index 8b33607..90d6ca9 100644
--- a/patches/patches/062_loop_expressions.patch
+++ b/patches/patches/062_loop_expressions.patch
@@ -1,4 +1,11 @@
-50c50
-< };
----
-> } else null;
+--- exercises/062_loop_expressions.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/062_loop_expressions.zig 2023-10-05 20:04:07.122768129 +0200
+@@ -47,7 +47,7 @@
+ // return it from the for loop.
+ const current_lang: ?[]const u8 = for (langs) |lang| {
+ if (lang.len == 3) break lang;
+- };
++ } else null;
+
+ if (current_lang) |cl| {
+ print("Current language: {s}\n", .{cl});
diff --git a/patches/patches/063_labels.patch b/patches/patches/063_labels.patch
index 42ef9ea..0831e22 100644
--- a/patches/patches/063_labels.patch
+++ b/patches/patches/063_labels.patch
@@ -1,6 +1,13 @@
-131,132c131,132
-< break;
-< };
----
-> break food;
-> } else menu[0];
+--- exercises/063_labels.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/063_labels.zig 2023-10-05 20:04:07.126101525 +0200
+@@ -128,8 +128,8 @@
+ // wanted for this Food.
+ //
+ // Please return this Food from the loop.
+- break;
+- };
++ break food;
++ } else menu[0];
+ // ^ Oops! We forgot to return Mac & Cheese as the default
+ // Food when the requested ingredients aren't found.
+
diff --git a/patches/patches/064_builtins.patch b/patches/patches/064_builtins.patch
index c768927..dcab3ca 100644
--- a/patches/patches/064_builtins.patch
+++ b/patches/patches/064_builtins.patch
@@ -1,8 +1,19 @@
-66c66
-< const expected_result: u8 = ???;
----
-> const expected_result: u8 = 0b00010010;
-81c81
-< const tupni: u8 = @bitReverse(input, tupni);
----
-> const tupni: u8 = @bitReverse(input);
+--- exercises/064_builtins.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/064_builtins.zig 2023-10-05 20:04:07.132768316 +0200
+@@ -63,7 +63,7 @@
+ //
+ // If there was no overflow at all while adding 5 to a, what value would
+ // 'my_result' hold? Write the answer in into 'expected_result'.
+- const expected_result: u8 = ???;
++ const expected_result: u8 = 0b00010010;
+ print(". Without overflow: {b:0>8}. ", .{expected_result});
+
+ print("Furthermore, ", .{});
+@@ -78,6 +78,6 @@
+ // Now it's your turn. See if you can fix this attempt to use
+ // this builtin to reverse the bits of a u8 integer.
+ const input: u8 = 0b11110000;
+- const tupni: u8 = @bitReverse(input, tupni);
++ const tupni: u8 = @bitReverse(input);
+ print("{b:0>8} backwards is {b:0>8}.\n", .{ input, tupni });
+ }
diff --git a/patches/patches/065_builtins2.patch b/patches/patches/065_builtins2.patch
index 1b085ef..4b0ccd2 100644
--- a/patches/patches/065_builtins2.patch
+++ b/patches/patches/065_builtins2.patch
@@ -1,20 +1,39 @@
-61c61
-< narcissus.??? = ???;
----
-> narcissus.myself = &narcissus;
-73c73
-< const Type2 = narcissus.fetchTheMostBeautifulType();
----
-> const Type2 = Narcissus.fetchTheMostBeautifulType();
-112c112
-< if (fields[0].??? != void) {
----
-> if (fields[0].type != void) {
-116c116
-< if (fields[1].??? != void) {
----
-> if (fields[1].type != void) {
-120c120
-< if (fields[2].??? != void) {
----
-> if (fields[2].type != void) {
+--- exercises/065_builtins2.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/065_builtins2.zig 2023-10-05 20:04:07.136101712 +0200
+@@ -58,7 +58,7 @@
+ // Oops! We cannot leave the 'me' and 'myself' fields
+ // undefined. Please set them here:
+ narcissus.me = &narcissus;
+- narcissus.??? = ???;
++ narcissus.myself = &narcissus;
+
+ // This determines a "peer type" from three separate
+ // references (they just happen to all be the same object).
+@@ -70,7 +70,7 @@
+ //
+ // The fix for this is very subtle, but it makes a big
+ // difference!
+- const Type2 = narcissus.fetchTheMostBeautifulType();
++ const Type2 = Narcissus.fetchTheMostBeautifulType();
+
+ // Now we print a pithy statement about Narcissus.
+ print("A {s} loves all {s}es. ", .{
+@@ -109,15 +109,15 @@
+ // Please complete these 'if' statements so that the field
+ // name will not be printed if the field is of type 'void'
+ // (which is a zero-bit type that takes up no space at all!):
+- if (fields[0].??? != void) {
++ if (fields[0].type != void) {
+ print(" {s}", .{@typeInfo(Narcissus).Struct.fields[0].name});
+ }
+
+- if (fields[1].??? != void) {
++ if (fields[1].type != void) {
+ print(" {s}", .{@typeInfo(Narcissus).Struct.fields[1].name});
+ }
+
+- if (fields[2].??? != void) {
++ if (fields[2].type != void) {
+ print(" {s}", .{@typeInfo(Narcissus).Struct.fields[2].name});
+ }
+
diff --git a/patches/patches/066_comptime.patch b/patches/patches/066_comptime.patch
index e7130c2..2d38ebe 100644
--- a/patches/patches/066_comptime.patch
+++ b/patches/patches/066_comptime.patch
@@ -1,6 +1,13 @@
-65,66c65,66
-< var var_int = 12345;
-< var var_float = 987.654;
----
-> var var_int: u32 = 12345;
-> var var_float: f32 = 987.654;
+--- exercises/066_comptime.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/066_comptime.zig 2023-10-05 20:04:07.139435109 +0200
+@@ -62,8 +62,8 @@
+ // types with specific sizes. The comptime numbers will be
+ // coerced (if they'll fit!) into your chosen runtime types.
+ // For this it is necessary to specify a size, e.g. 32 bit.
+- var var_int = 12345;
+- var var_float = 987.654;
++ var var_int: u32 = 12345;
++ var var_float: f32 = 987.654;
+
+ // We can change what is stored at the areas set aside for
+ // "var_int" and "var_float" in the running compiled program.
diff --git a/patches/patches/067_comptime2.patch b/patches/patches/067_comptime2.patch
index 97b893b..470c69f 100644
--- a/patches/patches/067_comptime2.patch
+++ b/patches/patches/067_comptime2.patch
@@ -1,4 +1,11 @@
-38c38
-< var count = 0;
----
-> comptime var count = 0;
+--- exercises/067_comptime2.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/067_comptime2.zig 2023-10-05 20:04:07.146101899 +0200
+@@ -35,7 +35,7 @@
+ // In this contrived example, we've decided to allocate some
+ // arrays using a variable count! But something's missing...
+ //
+- var count = 0;
++ comptime var count = 0;
+
+ count += 1;
+ var a1: [count]u8 = .{'A'} ** count;
diff --git a/patches/patches/068_comptime3.patch b/patches/patches/068_comptime3.patch
index 985f0e6..313cae0 100644
--- a/patches/patches/068_comptime3.patch
+++ b/patches/patches/068_comptime3.patch
@@ -1,8 +1,20 @@
-46c46
-< if (my_scale == 0) @compileError("Scale 1:0 is not valid!");
----
-> if (my_scale == 0) my_scale = 1; //@compileError("Scale 1:0 is not valid!");
-72c72
-< var scale: u32 = undefined;
----
-> comptime var scale: u32 = undefined;
+--- exercises/068_comptime3.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/068_comptime3.zig 2023-10-05 20:04:07.149435295 +0200
+@@ -43,7 +43,7 @@
+ //
+ // Please change this so that it sets a 0 scale to 1
+ // instead.
+- if (my_scale == 0) @compileError("Scale 1:0 is not valid!");
++ if (my_scale == 0) my_scale = 1; //@compileError("Scale 1:0 is not valid!");
+
+ self.scale = my_scale;
+ self.hull_length /= my_scale;
+@@ -69,7 +69,7 @@
+ // Hey, we can't just pass this runtime variable as an
+ // argument to the scaleMe() method. What would let us do
+ // that?
+- var scale: u32 = undefined;
++ comptime var scale: u32 = undefined;
+
+ scale = 32; // 1:32 scale
+
diff --git a/patches/patches/069_comptime4.patch b/patches/patches/069_comptime4.patch
index 3d662a7..2b61673 100644
--- a/patches/patches/069_comptime4.patch
+++ b/patches/patches/069_comptime4.patch
@@ -1,6 +1,13 @@
-45,46c45,46
-< fn makeSequence(comptime T: type, ??? size: usize) [???]T {
-< var sequence: [???]T = undefined;
----
-> fn makeSequence(comptime T: type, comptime size: usize) [size]T {
-> var sequence: [size]T = undefined;
+--- exercises/069_comptime4.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/069_comptime4.zig 2023-10-05 20:04:07.152768692 +0200
+@@ -42,8 +42,8 @@
+ // 2) Sets the size of the array of type T (which is the
+ // sequence we're creating and returning).
+ //
+-fn makeSequence(comptime T: type, ??? size: usize) [???]T {
+- var sequence: [???]T = undefined;
++fn makeSequence(comptime T: type, comptime size: usize) [size]T {
++ var sequence: [size]T = undefined;
+ var i: usize = 0;
+
+ while (i < size) : (i += 1) {
diff --git a/patches/patches/070_comptime5.patch b/patches/patches/070_comptime5.patch
index c92dcc7..e5f0357 100644
--- a/patches/patches/070_comptime5.patch
+++ b/patches/patches/070_comptime5.patch
@@ -1,6 +1,13 @@
-126,127c126,127
-< const walks_like_duck = ???;
-< const quacks_like_duck = ???;
----
-> const walks_like_duck = @hasDecl(MyType, "waddle");
-> const quacks_like_duck = @hasDecl(MyType, "quack");
+--- exercises/070_comptime5.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/070_comptime5.zig 2023-10-05 20:04:07.159435482 +0200
+@@ -123,8 +123,8 @@
+ // Please make sure MyType has both waddle() and quack()
+ // methods:
+ const MyType = @TypeOf(possible_duck);
+- const walks_like_duck = ???;
+- const quacks_like_duck = ???;
++ const walks_like_duck = @hasDecl(MyType, "waddle");
++ const quacks_like_duck = @hasDecl(MyType, "quack");
+
+ const is_duck = walks_like_duck and quacks_like_duck;
+
diff --git a/patches/patches/071_comptime6.patch b/patches/patches/071_comptime6.patch
index 0c6b3ad..8731344 100644
--- a/patches/patches/071_comptime6.patch
+++ b/patches/patches/071_comptime6.patch
@@ -1,4 +1,11 @@
-43c43
-< ??? {
----
-> inline for (fields) |field| {
+--- exercises/071_comptime6.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/071_comptime6.zig 2023-10-05 20:04:07.162768879 +0200
+@@ -40,7 +40,7 @@
+
+ const fields = @typeInfo(Narcissus).Struct.fields;
+
+- ??? {
++ inline for (fields) |field| {
+ if (field.type != void) {
+ print(" {s}", .{field.name});
+ }
diff --git a/patches/patches/072_comptime7.patch b/patches/patches/072_comptime7.patch
index 205e238..d4c2e1d 100644
--- a/patches/patches/072_comptime7.patch
+++ b/patches/patches/072_comptime7.patch
@@ -1,4 +1,11 @@
-38c38
-< ??? (i < instructions.len) : (???) {
----
-> inline while (i < instructions.len) : (i += 3) {
+--- exercises/072_comptime7.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/072_comptime7.zig 2023-10-05 20:04:07.169435669 +0200
+@@ -35,7 +35,7 @@
+ // at compile time.
+ //
+ // Please fix this to loop once per "instruction":
+- ??? (i < instructions.len) : (???) {
++ inline while (i < instructions.len) : (i += 3) {
+
+ // This gets the digit from the "instruction". Can you
+ // figure out why we subtract '0' from it?
diff --git a/patches/patches/073_comptime8.patch b/patches/patches/073_comptime8.patch
index 5b50edb..9aebf42 100644
--- a/patches/patches/073_comptime8.patch
+++ b/patches/patches/073_comptime8.patch
@@ -1,8 +1,17 @@
-35c35
-< const my_llama = getLlama(5);
----
-> const my_llama = getLlama(4);
-40c40
-< fn getLlama(i: usize) u32 {
----
-> fn getLlama(comptime i: usize) u32 {
+--- exercises/073_comptime8.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/073_comptime8.zig 2023-10-05 20:04:07.172769065 +0200
+@@ -32,12 +32,12 @@
+ pub fn main() void {
+ // We meant to fetch the last llama. Please fix this simple
+ // mistake so the assertion no longer fails.
+- const my_llama = getLlama(5);
++ const my_llama = getLlama(4);
+
+ print("My llama value is {}.\n", .{my_llama});
+ }
+
+-fn getLlama(i: usize) u32 {
++fn getLlama(comptime i: usize) u32 {
+ // We've put a guard assert() at the top of this function to
+ // prevent mistakes. The 'comptime' keyword here means that
+ // the mistake will be caught when we compile!
diff --git a/patches/patches/074_comptime9.patch b/patches/patches/074_comptime9.patch
index 4f979fe..250d003 100644
--- a/patches/patches/074_comptime9.patch
+++ b/patches/patches/074_comptime9.patch
@@ -1,4 +1,11 @@
-42c42
-< fn makeLlamas(count: usize) [count]u8 {
----
-> fn makeLlamas(comptime count: usize) [count]u8 {
+--- exercises/074_comptime9.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/074_comptime9.zig 2023-10-05 20:04:07.176102462 +0200
+@@ -39,7 +39,7 @@
+
+ // And here's the function. Note that the return value type
+ // depends on one of the input arguments!
+-fn makeLlamas(count: usize) [count]u8 {
++fn makeLlamas(comptime count: usize) [count]u8 {
+ var temp: [count]u8 = undefined;
+ var i = 0;
+
diff --git a/patches/patches/075_quiz8.patch b/patches/patches/075_quiz8.patch
index ce6a2d8..1bb9e5d 100644
--- a/patches/patches/075_quiz8.patch
+++ b/patches/patches/075_quiz8.patch
@@ -1,8 +1,15 @@
-52c52,56
-<
----
-> return Path{
-> .from = from,
-> .to = to,
-> .dist = dist,
-> };
+--- exercises/075_quiz8.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/075_quiz8.zig 2023-10-05 20:04:07.182769252 +0200
+@@ -49,7 +49,11 @@
+ //
+ // Please fill in the body of this function!
+ fn makePath(from: *Place, to: *Place, dist: u8) Path {
+-
++ return Path{
++ .from = from,
++ .to = to,
++ .dist = dist,
++ };
+ }
+
+ // Using our new function, these path definitions take up considerably less
diff --git a/patches/patches/076_sentinels.patch b/patches/patches/076_sentinels.patch
index 55c4c96..cbfae31 100644
--- a/patches/patches/076_sentinels.patch
+++ b/patches/patches/076_sentinels.patch
@@ -1,8 +1,20 @@
-85c85
-< for (???) |s| {
----
-> for (my_seq) |s| {
-97c97
-< while (??? != my_sentinel) {
----
-> while (my_seq[i] != my_sentinel) {
+--- exercises/076_sentinels.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/076_sentinels.zig 2023-10-05 20:04:07.186102649 +0200
+@@ -82,7 +82,7 @@
+ print("Array:", .{});
+
+ // Loop through the items in my_seq.
+- for (???) |s| {
++ for (my_seq) |s| {
+ print("{}", .{s});
+ }
+ },
+@@ -94,7 +94,7 @@
+ // Loop through the items in my_seq until we hit the
+ // sentinel value.
+ var i: usize = 0;
+- while (??? != my_sentinel) {
++ while (my_seq[i] != my_sentinel) {
+ print("{}", .{my_seq[i]});
+ i += 1;
+ }
diff --git a/patches/patches/077_sentinels2.patch b/patches/patches/077_sentinels2.patch
index 4fef677..a91a874 100644
--- a/patches/patches/077_sentinels2.patch
+++ b/patches/patches/077_sentinels2.patch
@@ -1,4 +1,11 @@
-63c63
-< const printable = ???;
----
-> const printable = foo.data[0..foo.length];
+--- exercises/077_sentinels2.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/077_sentinels2.zig 2023-10-05 20:04:07.189436043 +0200
+@@ -60,7 +60,7 @@
+ // length... You've actually solved this problem before!
+ //
+ // Here's a big hint: do you remember how to take a slice?
+- const printable = ???;
++ const printable = foo.data[0..foo.length];
+
+ print("{s}\n", .{printable});
+ }
diff --git a/patches/patches/078_sentinels3.patch b/patches/patches/078_sentinels3.patch
index 31185d6..eb5dcff 100644
--- a/patches/patches/078_sentinels3.patch
+++ b/patches/patches/078_sentinels3.patch
@@ -1,4 +1,11 @@
-24c24
-< const printable: [*:0]const u8 = ???;
----
-> const printable: [*:0]const u8 = @ptrCast(data);
+--- exercises/078_sentinels3.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/078_sentinels3.zig 2023-10-05 20:04:07.196102836 +0200
+@@ -21,7 +21,7 @@
+ const data: [*]const u8 = "Weird Data!";
+
+ // Please cast 'data' to 'printable':
+- const printable: [*:0]const u8 = ???;
++ const printable: [*:0]const u8 = @ptrCast(data);
+
+ print("{s}\n", .{printable});
+ }
diff --git a/patches/patches/079_quoted_identifiers.patch b/patches/patches/079_quoted_identifiers.patch
index c7bcea8..b624668 100644
--- a/patches/patches/079_quoted_identifiers.patch
+++ b/patches/patches/079_quoted_identifiers.patch
@@ -1,12 +1,18 @@
-23,24c23,24
-< const 55_cows: i32 = 55;
-< const isn't true: bool = false;
----
-> const @"55_cows": i32 = 55;
-> const @"isn't true": bool = false;
-27,28c27,28
-< 55_cows,
-< isn't true,
----
-> @"55_cows",
-> @"isn't true",
+--- exercises/079_quoted_identifiers.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/079_quoted_identifiers.zig 2023-10-05 20:04:07.199436232 +0200
+@@ -20,11 +20,11 @@
+ const print = @import("std").debug.print;
+
+ pub fn main() void {
+- const 55_cows: i32 = 55;
+- const isn't true: bool = false;
++ const @"55_cows": i32 = 55;
++ const @"isn't true": bool = false;
+
+ print("Sweet freedom: {}, {}.\n", .{
+- 55_cows,
+- isn't true,
++ @"55_cows",
++ @"isn't true",
+ });
+ }
diff --git a/patches/patches/080_anonymous_structs.patch b/patches/patches/080_anonymous_structs.patch
index a94e7b8..a46ea41 100644
--- a/patches/patches/080_anonymous_structs.patch
+++ b/patches/patches/080_anonymous_structs.patch
@@ -1,8 +1,18 @@
-51c51
-< var circle1 = ??? {
----
-> var circle1 = Circle(i32){
-57c57
-< var circle2 = ??? {
----
-> var circle2 = Circle(f32){
+--- exercises/080_anonymous_structs.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/080_anonymous_structs.zig 2023-10-05 20:04:07.202769626 +0200
+@@ -48,13 +48,13 @@
+ // * circle1 should hold i32 integers
+ // * circle2 should hold f32 floats
+ //
+- var circle1 = ??? {
++ var circle1 = Circle(i32){
+ .center_x = 25,
+ .center_y = 70,
+ .radius = 15,
+ };
+
+- var circle2 = ??? {
++ var circle2 = Circle(f32){
+ .center_x = 25.234,
+ .center_y = 70.999,
+ .radius = 15.714,
diff --git a/patches/patches/081_anonymous_structs2.patch b/patches/patches/081_anonymous_structs2.patch
index a9ca689..d09ac72 100644
--- a/patches/patches/081_anonymous_structs2.patch
+++ b/patches/patches/081_anonymous_structs2.patch
@@ -1,4 +1,11 @@
-41c41
-< fn printCircle(???) void {
----
-> fn printCircle(circle: anytype) void {
+--- exercises/081_anonymous_structs2.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/081_anonymous_structs2.zig 2023-10-05 20:04:07.209436419 +0200
+@@ -38,7 +38,7 @@
+
+ // Please complete this function which prints an anonymous struct
+ // representing a circle.
+-fn printCircle(???) void {
++fn printCircle(circle: anytype) void {
+ print("x:{} y:{} radius:{}\n", .{
+ circle.center_x,
+ circle.center_y,
diff --git a/patches/patches/082_anonymous_structs3.patch b/patches/patches/082_anonymous_structs3.patch
index 6965858..7beb511 100644
--- a/patches/patches/082_anonymous_structs3.patch
+++ b/patches/patches/082_anonymous_structs3.patch
@@ -1,16 +1,32 @@
-85c85
-< const fields = ???;
----
-> const fields = @typeInfo(@TypeOf(tuple)).Struct.fields;
-92c92
-< for (fields) |field| {
----
-> inline for (fields) |field| {
-120,122c120,122
-< field.???,
-< field.???,
-< ???,
----
-> field.name,
-> field.type,
-> @field(tuple, field.name),
+--- exercises/082_anonymous_structs3.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/082_anonymous_structs3.zig 2023-10-05 20:04:07.212769813 +0200
+@@ -82,14 +82,14 @@
+ // @typeInfo(Circle).Struct.fields
+ //
+ // This will be an array of StructFields.
+- const fields = ???;
++ const fields = @typeInfo(@TypeOf(tuple)).Struct.fields;
+
+ // 2. Loop through each field. This must be done at compile
+ // time.
+ //
+ // Hint: remember 'inline' loops?
+ //
+- for (fields) |field| {
++ inline for (fields) |field| {
+ // 3. Print the field's name, type, and value.
+ //
+ // Each 'field' in this loop is one of these:
+@@ -117,9 +117,9 @@
+ //
+ // The first field should print as: "0"(bool):true
+ print("\"{s}\"({any}):{any} ", .{
+- field.???,
+- field.???,
+- ???,
++ field.name,
++ field.type,
++ @field(tuple, field.name),
+ });
+ }
+ }
diff --git a/patches/patches/083_anonymous_lists.patch b/patches/patches/083_anonymous_lists.patch
index 94b594b..b0242f1 100644
--- a/patches/patches/083_anonymous_lists.patch
+++ b/patches/patches/083_anonymous_lists.patch
@@ -1,4 +1,10 @@
-23c23
-< const hello = .{ 'h', 'e', 'l', 'l', 'o' };
----
-> const hello: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' };
+--- exercises/083_anonymous_lists.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/083_anonymous_lists.zig 2023-10-05 20:04:07.216103210 +0200
+@@ -20,6 +20,6 @@
+ //
+ // = .{ 'h', 'e', 'l', 'l', 'o' };
+ //
+- const hello = .{ 'h', 'e', 'l', 'l', 'o' };
++ const hello: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' };
+ print("I say {s}!\n", .{hello});
+ }
diff --git a/patches/patches/084_async.patch b/patches/patches/084_async.patch
index 9eba9ac..11a9da0 100644
--- a/patches/patches/084_async.patch
+++ b/patches/patches/084_async.patch
@@ -1,4 +1,11 @@
-51c51
-< foo();
----
-> _ = async foo();
+--- exercises/084_async.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/084_async.zig 2023-10-05 20:04:07.219436606 +0200
+@@ -48,7 +48,7 @@
+ pub fn main() void {
+ // Additional Hint: you can assign things to '_' when you
+ // don't intend to do anything with them.
+- foo();
++ _ = async foo();
+ }
+
+ fn foo() void {
diff --git a/patches/patches/085_async2.patch b/patches/patches/085_async2.patch
index cc71293..ba10b05 100644
--- a/patches/patches/085_async2.patch
+++ b/patches/patches/085_async2.patch
@@ -1,2 +1,10 @@
-21a22
-> resume foo_frame;
+--- exercises/085_async2.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/085_async2.zig 2023-10-05 20:04:07.226103397 +0200
+@@ -19,6 +19,7 @@
+
+ pub fn main() void {
+ var foo_frame = async foo();
++ resume foo_frame;
+ }
+
+ fn foo() void {
diff --git a/patches/patches/086_async3.patch b/patches/patches/086_async3.patch
index 2e52b2b..d80d4a1 100644
--- a/patches/patches/086_async3.patch
+++ b/patches/patches/086_async3.patch
@@ -1,9 +1,16 @@
-16c16,21
-< ???
----
-> // Silly solution. You can also use a loop.
-> resume foo_frame;
-> resume foo_frame;
-> resume foo_frame;
-> resume foo_frame;
-> resume foo_frame;
+--- exercises/086_async3.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/086_async3.zig 2023-10-05 20:04:07.229436793 +0200
+@@ -13,7 +13,12 @@
+ const n = 5;
+ var foo_frame = async foo(n);
+
+- ???
++ // Silly solution. You can also use a loop.
++ resume foo_frame;
++ resume foo_frame;
++ resume foo_frame;
++ resume foo_frame;
++ resume foo_frame;
+
+ print("\n", .{});
+ }
diff --git a/patches/patches/087_async4.patch b/patches/patches/087_async4.patch
index 3aec891..b1c1736 100644
--- a/patches/patches/087_async4.patch
+++ b/patches/patches/087_async4.patch
@@ -1,10 +1,21 @@
-19c19
-< ???
----
-> resume foo_frame;
-27,28c27,28
-< ???
-< ???
----
-> global_counter += 1;
-> suspend {}
+--- exercises/087_async4.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/087_async4.zig 2023-10-05 20:04:07.236103584 +0200
+@@ -16,7 +16,7 @@
+
+ while (global_counter <= 5) {
+ print("{} ", .{global_counter});
+- ???
++ resume foo_frame;
+ }
+
+ print("\n", .{});
+@@ -24,7 +24,7 @@
+
+ fn foo() void {
+ while (true) {
+- ???
+- ???
++ global_counter += 1;
++ suspend {}
+ }
+ }
diff --git a/patches/patches/088_async5.patch b/patches/patches/088_async5.patch
index 7ce4fc6..b9d5a21 100644
--- a/patches/patches/088_async5.patch
+++ b/patches/patches/088_async5.patch
@@ -1,4 +1,11 @@
-39c39
-< var value = ???
----
-> var value = await myframe;
+--- exercises/088_async5.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/088_async5.zig 2023-10-05 20:04:07.239436980 +0200
+@@ -36,7 +36,7 @@
+ pub fn main() void {
+ var myframe = async getPageTitle("http://example.com");
+
+- var value = ???
++ var value = await myframe;
+
+ print("{s}\n", .{value});
+ }
diff --git a/patches/patches/089_async6.patch b/patches/patches/089_async6.patch
index ecbef19..4a0687e 100644
--- a/patches/patches/089_async6.patch
+++ b/patches/patches/089_async6.patch
@@ -1,6 +1,13 @@
-44,45c44,45
-< var com_title = com_frame;
-< var org_title = org_frame;
----
-> var com_title = await com_frame;
-> var org_title = await org_frame;
+--- exercises/089_async6.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/089_async6.zig 2023-10-05 20:04:07.242770376 +0200
+@@ -41,8 +41,8 @@
+ var com_frame = async getPageTitle("http://example.com");
+ var org_frame = async getPageTitle("http://example.org");
+
+- var com_title = com_frame;
+- var org_title = org_frame;
++ var com_title = await com_frame;
++ var org_title = await org_frame;
+
+ print(".com: {s}, .org: {s}.\n", .{ com_title, org_title });
+ }
diff --git a/patches/patches/090_async7.patch b/patches/patches/090_async7.patch
index 9ef7b92..62ec057 100644
--- a/patches/patches/090_async7.patch
+++ b/patches/patches/090_async7.patch
@@ -1,4 +1,11 @@
-32c32
-< var my_beef = getBeef(0);
----
-> var my_beef = nosuspend getBeef(0);
+--- exercises/090_async7.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/090_async7.zig 2023-10-05 20:04:07.249437167 +0200
+@@ -29,7 +29,7 @@
+ // The main() function can not be async. But we know
+ // getBeef() will not suspend with this particular
+ // invocation. Please make this okay:
+- var my_beef = getBeef(0);
++ var my_beef = nosuspend getBeef(0);
+
+ print("beef? {X}!\n", .{my_beef});
+ }
diff --git a/patches/patches/091_async8.patch b/patches/patches/091_async8.patch
index 8a93b31..ddd3fce 100644
--- a/patches/patches/091_async8.patch
+++ b/patches/patches/091_async8.patch
@@ -1,16 +1,26 @@
-20c20
-< print("X", .{});
----
-> print("D", .{});
-28c28
-< print("X", .{});
----
-> print("B", .{});
-31c31
-< print("X", .{});
----
-> print("C", .{});
-34c34
-< print("X", .{});
----
-> print("E", .{});
+--- exercises/091_async8.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/091_async8.zig 2023-10-05 20:04:07.252770563 +0200
+@@ -17,7 +17,7 @@
+
+ var frame = async suspendable();
+
+- print("X", .{});
++ print("D", .{});
+
+ resume frame;
+
+@@ -25,11 +25,11 @@
+ }
+
+ fn suspendable() void {
+- print("X", .{});
++ print("B", .{});
+
+ suspend {
+- print("X", .{});
++ print("C", .{});
+ }
+
+- print("X", .{});
++ print("E", .{});
+ }
diff --git a/patches/patches/092_interfaces.patch b/patches/patches/092_interfaces.patch
index 1287e79..36d8784 100644
--- a/patches/patches/092_interfaces.patch
+++ b/patches/patches/092_interfaces.patch
@@ -1,4 +1,11 @@
-109c109
-< ???
----
-> insect.print();
+--- exercises/092_interfaces.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/092_interfaces.zig 2023-10-05 20:04:07.259437354 +0200
+@@ -106,7 +106,7 @@
+ for (my_insects) |insect| {
+ // Almost done! We want to print() each insect with a
+ // single method call here.
+- ???
++ insect.print();
+ }
+ }
+
diff --git a/patches/patches/093_hello_c.patch b/patches/patches/093_hello_c.patch
index 60eeaf0..fe1f853 100644
--- a/patches/patches/093_hello_c.patch
+++ b/patches/patches/093_hello_c.patch
@@ -1,4 +1,11 @@
-57c57
-< const c_res = write(2, "Hello C from Zig!", 17);
----
-> const c_res = c.write(2, "Hello C from Zig!", 17);
+--- exercises/093_hello_c.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/093_hello_c.zig 2023-10-05 20:04:07.262770750 +0200
+@@ -54,7 +54,7 @@
+ //
+ // In this exercise we use 'write' to output 17 chars,
+ // but something is still missing...
+- const c_res = write(2, "Hello C from Zig!", 17);
++ const c_res = c.write(2, "Hello C from Zig!", 17);
+
+ // let's see what the result from C is:
+ std.debug.print(" - C result is {d} chars written.\n", .{c_res});
diff --git a/patches/patches/094_c_math.patch b/patches/patches/094_c_math.patch
index 4b7d474..7256162 100644
--- a/patches/patches/094_c_math.patch
+++ b/patches/patches/094_c_math.patch
@@ -1,4 +1,11 @@
-22c22
-< ???
----
-> @cInclude("math.h");
+--- exercises/094_c_math.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/094_c_math.zig 2023-10-05 20:04:07.266104147 +0200
+@@ -19,7 +19,7 @@
+
+ const c = @cImport({
+ // What do wee need here?
+- ???
++ @cInclude("math.h");
+ });
+
+ pub fn main() !void {
diff --git a/patches/patches/095_for3.patch b/patches/patches/095_for3.patch
index c258b7b..ca9e3ad 100644
--- a/patches/patches/095_for3.patch
+++ b/patches/patches/095_for3.patch
@@ -1,4 +1,11 @@
-57c57
-< for (???) |n| {
----
-> for (1..21) |n| {
+--- exercises/095_for3.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/095_for3.zig 2023-10-05 20:04:07.272770937 +0200
+@@ -54,7 +54,7 @@
+
+ // I want to print every number between 1 and 20 that is NOT
+ // divisible by 3 or 5.
+- for (???) |n| {
++ for (1..21) |n| {
+
+ // The '%' symbol is the "modulo" operator and it
+ // returns the remainder after division.
diff --git a/patches/patches/096_memory_allocation.patch b/patches/patches/096_memory_allocation.patch
index a3db349..aab718f 100644
--- a/patches/patches/096_memory_allocation.patch
+++ b/patches/patches/096_memory_allocation.patch
@@ -1,4 +1,11 @@
-67c67
-< var avg: []f64 = ???;
----
-> var avg: []f64 = try allocator.alloc(f64, arr.len);
+--- exercises/096_memory_allocation.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/096_memory_allocation.zig 2023-10-05 20:04:07.276104333 +0200
+@@ -64,7 +64,7 @@
+ const allocator = arena.allocator();
+
+ // allocate memory for this array
+- var avg: []f64 = ???;
++ var avg: []f64 = try allocator.alloc(f64, arr.len);
+
+ runningAverage(arr, avg);
+ std.debug.print("Running Average: ", .{});
diff --git a/patches/patches/097_bit_manipulation.patch b/patches/patches/097_bit_manipulation.patch
index 2afe3da..5303ee1 100644
--- a/patches/patches/097_bit_manipulation.patch
+++ b/patches/patches/097_bit_manipulation.patch
@@ -1,4 +1,11 @@
-83c83
-< ???;
----
-> x ^= y;
+--- exercises/097_bit_manipulation.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/097_bit_manipulation.zig 2023-10-05 20:04:07.282771124 +0200
+@@ -80,7 +80,7 @@
+ y ^= x;
+
+ // What must be written here?
+- ???;
++ x ^= y;
+
+ print("x = {d}; y = {d}\n", .{ x, y });
+ }
diff --git a/patches/patches/098_bit_manipulation2.patch b/patches/patches/098_bit_manipulation2.patch
index 8becd34..5354a7b 100644
--- a/patches/patches/098_bit_manipulation2.patch
+++ b/patches/patches/098_bit_manipulation2.patch
@@ -1,4 +1,9 @@
-63c63
-< return bits == 0x..???;
----
-> return bits == 0x3ffffff;
+--- exercises/098_bit_manipulation2.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/098_bit_manipulation2.zig 2023-10-05 20:04:07.286104520 +0200
+@@ -60,5 +60,5 @@
+ // and if so, we know the given string is a pangram
+ //
+ // but what do we have to compare?
+- return bits == 0x..???;
++ return bits == 0x3ffffff;
+ }
diff --git a/patches/patches/099_formatting.patch b/patches/patches/099_formatting.patch
index 5b7efbe..384bf86 100644
--- a/patches/patches/099_formatting.patch
+++ b/patches/patches/099_formatting.patch
@@ -1,4 +1,11 @@
-134c134
-< print("{???} ", .{(a + 1) * (b + 1)});
----
-> print("{d:>3} ", .{(a + 1) * (b + 1)});
+--- exercises/099_formatting.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/099_formatting.zig 2023-10-05 20:04:07.292771311 +0200
+@@ -131,7 +131,7 @@
+ for (0..size) |b| {
+ // What formatting is needed here to make our columns
+ // nice and straight?
+- print("{???} ", .{(a + 1) * (b + 1)});
++ print("{d:>3} ", .{(a + 1) * (b + 1)});
+ }
+
+ // After each row we use double line feed:
diff --git a/patches/patches/100_for4.patch b/patches/patches/100_for4.patch
index 6465325..3539be2 100644
--- a/patches/patches/100_for4.patch
+++ b/patches/patches/100_for4.patch
@@ -1,4 +1,11 @@
-42c42
-< for (hex_nums, ???) |hn, ???| {
----
-> for (hex_nums, dec_nums) |hn, dn| {
+--- exercises/100_for4.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/100_for4.zig 2023-10-05 20:04:07.296104707 +0200
+@@ -39,7 +39,7 @@
+ const hex_nums = [_]u8{ 0xb, 0x2a, 0x77 };
+ const dec_nums = [_]u8{ 11, 42, 119 };
+
+- for (hex_nums, ???) |hn, ???| {
++ for (hex_nums, dec_nums) |hn, dn| {
+ if (hn != dn) {
+ std.debug.print("Uh oh! Found a mismatch: {d} vs {d}\n", .{ hn, dn });
+ return;
diff --git a/patches/patches/101_for5.patch b/patches/patches/101_for5.patch
index edb927f..00f19df 100644
--- a/patches/patches/101_for5.patch
+++ b/patches/patches/101_for5.patch
@@ -1,4 +1,11 @@
-54c54
-< for (roles, gold, experience, ???) |c, g, e, i| {
----
-> for (roles, gold, experience, 1..) |c, g, e, i| {
+--- exercises/101_for5.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/101_for5.zig 2023-10-05 20:04:07.299438103 +0200
+@@ -51,7 +51,7 @@
+
+ // We would like to number our list starting with 1, not 0.
+ // How do we do that?
+- for (roles, gold, experience, ???) |c, g, e, i| {
++ for (roles, gold, experience, 1..) |c, g, e, i| {
+ const role_name = switch (c) {
+ .wizard => "Wizard",
+ .thief => "Thief",
diff --git a/patches/patches/102_testing.patch b/patches/patches/102_testing.patch
index 49daf0c..9695b24 100644
--- a/patches/patches/102_testing.patch
+++ b/patches/patches/102_testing.patch
@@ -1,8 +1,18 @@
-86c86
-< try testing.expect(sub(10, 5) == 6);
----
-> try testing.expect(sub(10, 5) == 5);
-111c111
-< try testing.expectError(error.???, divide(15, 0));
----
-> try testing.expectError(error.DivisionByZero, divide(15, 0));
+--- exercises/102_testing.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/102_testing.zig 2023-10-05 20:04:07.302771500 +0200
+@@ -83,7 +83,7 @@
+ // an error that you need
+ // to correct.
+ test "sub" {
+- try testing.expect(sub(10, 5) == 6);
++ try testing.expect(sub(10, 5) == 5);
+
+ try testing.expect(sub(3, 1.5) == 1.5);
+ }
+@@ -108,5 +108,5 @@
+ // Now we test if the function returns an error
+ // if we pass a zero as denominator.
+ // But which error needs to be tested?
+- try testing.expectError(error.???, divide(15, 0));
++ try testing.expectError(error.DivisionByZero, divide(15, 0));
+ }
diff --git a/patches/patches/103_tokenization.patch b/patches/patches/103_tokenization.patch
index 973ffe6..98f645b 100644
--- a/patches/patches/103_tokenization.patch
+++ b/patches/patches/103_tokenization.patch
@@ -1,4 +1,11 @@
-139c139
-< var it = std.mem.tokenize(u8, poem, ???);
----
-> var it = std.mem.tokenize(u8, poem, " ,;!\n");
+--- exercises/103_tokenization.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/103_tokenization.zig 2023-10-05 20:04:07.309438291 +0200
+@@ -136,7 +136,7 @@
+ ;
+
+ // now the tokenizer, but what do we need here?
+- var it = std.mem.tokenize(u8, poem, ???);
++ var it = std.mem.tokenize(u8, poem, " ,;!\n");
+
+ // print all words and count them
+ var cnt: usize = 0;
diff --git a/patches/patches/999_the_end.patch b/patches/patches/999_the_end.patch
index ae674da..c8b9815 100644
--- a/patches/patches/999_the_end.patch
+++ b/patches/patches/999_the_end.patch
@@ -1,2 +1,7 @@
-8a9
-> // gollum's line ;-)
+--- exercises/999_the_end.zig 2023-10-03 22:15:22.125574535 +0200
++++ answers/999_the_end.zig 2023-10-05 20:04:07.312771687 +0200
+@@ -6,3 +6,4 @@
+ pub fn main() void {
+ print("\nThis is the end for now!\nWe hope you had fun and were able to learn a lot, so visit us again when the next exercises are available.\n", .{});
+ }
++// gollum's line ;-)
diff --git a/test/patch b/test/patch
deleted file mode 100755
index e3bf6f0..0000000
--- a/test/patch
+++ /dev/null
Binary files differ
diff --git a/tools/update-patches.zig b/tools/update-patches.zig
deleted file mode 100644
index 618d2bf..0000000
--- a/tools/update-patches.zig
+++ /dev/null
@@ -1,90 +0,0 @@
-const std = @import("std");
-const print = std.debug.print;
-const string = []const u8;
-
-const cwd = std.fs.cwd();
-const Dir = std.fs.Dir;
-const Allocator = std.mem.Allocator;
-
-const EXERCISES_PATH = "exercises";
-const ANSWERS_PATH = "answers";
-const PATCHES_PATH = "patches/patches";
-
-// Heals all the exercises.
-fn heal(alloc: Allocator) !void {
- try cwd.makePath(ANSWERS_PATH);
-
- const org_path = try cwd.realpathAlloc(alloc, EXERCISES_PATH);
- const patch_path = try cwd.realpathAlloc(alloc, PATCHES_PATH);
- const healed_path = try cwd.realpathAlloc(alloc, ANSWERS_PATH);
-
- var idir = try cwd.openIterableDir(EXERCISES_PATH, Dir.OpenDirOptions{});
- defer idir.close();
-
- var it = idir.iterate();
- while (try it.next()) |entry| {
-
- // create filenames
- const healed_file = try concat(alloc, &.{ healed_path, "/", entry.name });
- const patch_file = try concat(alloc, &.{ patch_path, "/", try patch_name(alloc, entry.name) });
-
- // patch the file
- const result = try std.ChildProcess.exec(.{
- .allocator = alloc,
- .argv = &.{ "patch", "-i", patch_file, "-o", healed_file, entry.name },
- .cwd = org_path,
- });
-
- print("{s}", .{result.stderr});
- }
-}
-
-// Creates new patch files for every exercise
-fn update(alloc: Allocator) !void {
- const org_path = try cwd.realpathAlloc(alloc, EXERCISES_PATH);
- const healed_path = try cwd.realpathAlloc(alloc, ANSWERS_PATH);
- const patch_path = try cwd.realpathAlloc(alloc, PATCHES_PATH);
-
- var idir = try cwd.openIterableDir(EXERCISES_PATH, Dir.OpenDirOptions{});
- defer idir.close();
-
- var it = idir.iterate();
- while (try it.next()) |entry| {
-
- // create diff
- const org_file = try concat(alloc, &.{ org_path, "/", entry.name });
- const healed_file = try concat(alloc, &.{ healed_path, "/", entry.name });
- const result = try std.ChildProcess.exec(.{
- .allocator = alloc,
- .argv = &.{ "diff", org_file, healed_file },
- });
- std.debug.assert(result.term.Exited == 1);
-
- // write diff to file
- const patch_file = try concat(alloc, &.{ patch_path, "/", try patch_name(alloc, entry.name) });
- var file = try std.fs.cwd().createFile(patch_file, .{ .read = false });
- defer file.close();
- try file.writer().print("{s}", .{result.stdout});
- }
-}
-
-fn concat(alloc: Allocator, slices: []const string) !string {
- const buf = try std.mem.concat(alloc, u8, slices);
- return buf;
-}
-
-fn patch_name(alloc: Allocator, path: string) !string {
- var filename = path;
- const index = std.mem.lastIndexOfScalar(u8, path, '.') orelse return path;
- if (index > 0) filename = path[0..index];
- return try concat(alloc, &.{ filename, ".patch" });
-}
-
-pub fn main() !void {
- var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
- defer arena.deinit();
- const alloc = arena.allocator();
-
- try heal(alloc);
- try update(alloc);
-}