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 -< \\ Blue ---- -> \\ Blue -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 @@ + \\

+ \\ Red + \\ Green +- \\ Blue ++ \\ Blue + \\

+ \\ + , .{ + @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 8ed8a5e..98f645b 100644 --- a/patches/patches/103_tokenization.patch +++ b/patches/patches/103_tokenization.patch @@ -1,4 +1,11 @@ -139c139 -< var it = std.mem.tokenizeAny(u8, poem, ???); ---- -> var it = std.mem.tokenizeAny(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 Binary files a/test/patch and /dev/null 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); -}