mirror of
https://codeberg.org/andyscott/ziglings.git
synced 2024-12-22 06:03:09 -05:00
Merge branch 'woodpecker' of https://codeberg.org/ziglings/exercises into woodpecker
This commit is contained in:
commit
9003544446
109 changed files with 1606 additions and 770 deletions
|
@ -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
|
||||
|
|
60
patches/frodo.sh
Executable file
60
patches/frodo.sh
Executable file
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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", .{});
|
||||
}
|
||||
|
|
|
@ -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", .{});
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
//
|
||||
|
|
|
@ -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 });
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(":-| ", .{});
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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(", ", .{});
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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", .{});
|
||||
}
|
||||
|
|
|
@ -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 ", .{});
|
||||
}
|
||||
|
|
|
@ -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", .{});
|
||||
|
|
|
@ -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!
|
||||
|
||||
|
|
|
@ -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("?", .{}),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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. "
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
|
|
@ -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!
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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| {
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
|
|
|
@ -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.* });
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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!
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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.?;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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.?});
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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", .{});
|
||||
}
|
||||
|
|
|
@ -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}),
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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", .{});
|
||||
}
|
||||
|
|
|
@ -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 {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
|
|
|
@ -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", .{});
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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: ", .{});
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue