diff options
Diffstat (limited to 'exercises')
75 files changed, 171 insertions, 133 deletions
diff --git a/exercises/001_hello.zig b/exercises/001_hello.zig index 7f40b92..93a0cfb 100644 --- a/exercises/001_hello.zig +++ b/exercises/001_hello.zig @@ -16,6 +16,6 @@ // const std = @import("std"); -fn main() void { +pub fn main() void { std.debug.print("Hello world!\n", .{}); } diff --git a/exercises/002_std.zig b/exercises/002_std.zig index 8cc3792..5916c7c 100644 --- a/exercises/002_std.zig +++ b/exercises/002_std.zig @@ -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/exercises/003_assignment.zig b/exercises/003_assignment.zig index 10ba8cb..23ef638 100644 --- a/exercises/003_assignment.zig +++ b/exercises/003_assignment.zig @@ -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/exercises/004_arrays.zig b/exercises/004_arrays.zig index 88fcc78..b6756bb 100644 --- a/exercises/004_arrays.zig +++ b/exercises/004_arrays.zig @@ -27,7 +27,7 @@ pub fn main() void { // (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 @@ pub fn main() void { // (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/exercises/005_arrays2.zig b/exercises/005_arrays2.zig index 07b9abe..e170266 100644 --- a/exercises/005_arrays2.zig +++ b/exercises/005_arrays2.zig @@ -21,12 +21,12 @@ pub fn main() void { // (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_unit = [_]u8{ ??? }; + const bit_pattern_unit = [_]u8{ 1, 0, 0, 1 }; const bit_pattern: [3 * bit_pattern_unit.len]u8 = @bitCast(@as([3][bit_pattern_unit.len]u8, @splat(bit_pattern_unit))); // Okay, that's all of the problems. Let's see the results. diff --git a/exercises/006_strings.zig b/exercises/006_strings.zig index 08977de..4238874 100644 --- a/exercises/006_strings.zig +++ b/exercises/006_strings.zig @@ -24,14 +24,14 @@ pub fn main() void { // (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 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 ++ [_]u8{' '} ++ tom; // That's all the problems. Let's see our results: std.debug.print("d={u} {s}\n", .{ d, major_tom }); diff --git a/exercises/007_strings2.zig b/exercises/007_strings2.zig index 6350be1..74cb752 100644 --- a/exercises/007_strings2.zig +++ b/exercises/007_strings2.zig @@ -15,9 +15,9 @@ const std = @import("std"); 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/exercises/008_quiz.zig b/exercises/008_quiz.zig index 5a81fb2..88ec381 100644 --- a/exercises/008_quiz.zig +++ b/exercises/008_quiz.zig @@ -19,7 +19,7 @@ pub fn main() void { // 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 @@ -33,10 +33,10 @@ pub fn main() void { 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/exercises/009_if.zig b/exercises/009_if.zig index e167104..68bf04b 100644 --- a/exercises/009_if.zig +++ b/exercises/009_if.zig @@ -24,7 +24,7 @@ pub fn main() void { const foo = 42; // Please fix this condition: - if (foo) { + if (foo == 42) { // We want our program to print this message! std.debug.print("Foo is 42!\n", .{}); } else { diff --git a/exercises/010_if2.zig b/exercises/010_if2.zig index f0ffb43..7bbc01c 100644 --- a/exercises/010_if2.zig +++ b/exercises/010_if2.zig @@ -10,7 +10,7 @@ pub fn main() void { // 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/exercises/011_while.zig b/exercises/011_while.zig index 674d904..1706e67 100644 --- a/exercises/011_while.zig +++ b/exercises/011_while.zig @@ -21,7 +21,7 @@ pub fn main() void { 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/exercises/012_while2.zig b/exercises/012_while2.zig index c9905aa..6f8e168 100644 --- a/exercises/012_while2.zig +++ b/exercises/012_while2.zig @@ -25,7 +25,7 @@ pub fn main() void { // 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/exercises/013_while3.zig b/exercises/013_while3.zig index 52d5ebd..715a6d1 100644 --- a/exercises/013_while3.zig +++ b/exercises/013_while3.zig @@ -24,8 +24,8 @@ pub fn main() void { 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/exercises/014_while4.zig b/exercises/014_while4.zig index 95aecb0..dfd48fc 100644 --- a/exercises/014_while4.zig +++ b/exercises/014_while4.zig @@ -18,7 +18,7 @@ pub fn main() void { // 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/exercises/015_for.zig b/exercises/015_for.zig index 0ee8e7d..e6b9729 100644 --- a/exercises/015_for.zig +++ b/exercises/015_for.zig @@ -15,7 +15,7 @@ pub fn main() void { 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/exercises/016_for2.zig b/exercises/016_for2.zig index 6fb7844..eaab65f 100644 --- a/exercises/016_for2.zig +++ b/exercises/016_for2.zig @@ -25,7 +25,7 @@ pub fn main() void { // 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/exercises/017_quiz2.zig b/exercises/017_quiz2.zig index 6f32c2e..4ad3ca7 100644 --- a/exercises/017_quiz2.zig +++ b/exercises/017_quiz2.zig @@ -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/exercises/018_functions.zig b/exercises/018_functions.zig index 1f78438..c9cc6c5 100644 --- a/exercises/018_functions.zig +++ b/exercises/018_functions.zig @@ -25,6 +25,6 @@ pub fn main() void { // 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/exercises/019_functions2.zig b/exercises/019_functions2.zig index 5a76c7b..b161167 100644 --- a/exercises/019_functions2.zig +++ b/exercises/019_functions2.zig @@ -22,7 +22,7 @@ pub fn main() void { // 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: u8) 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/exercises/020_quiz3.zig b/exercises/020_quiz3.zig index 571628e..2284999 100644 --- a/exercises/020_quiz3.zig +++ b/exercises/020_quiz3.zig @@ -21,8 +21,8 @@ pub fn main() void { // // 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 @@ fn printPowersOfTwo(numbers: [4]u16) ??? { // 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/exercises/021_errors.zig b/exercises/021_errors.zig index 7afeace..a6670b1 100644 --- a/exercises/021_errors.zig +++ b/exercises/021_errors.zig @@ -9,7 +9,7 @@ // "TooSmall". Please add it where needed! const MyNumberError = error{ TooBig, - ???, + TooSmall, TooFour, }; @@ -26,7 +26,7 @@ pub fn main() void { 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/exercises/022_errors2.zig b/exercises/022_errors2.zig index 1d513b3..0d4bb73 100644 --- a/exercises/022_errors2.zig +++ b/exercises/022_errors2.zig @@ -19,7 +19,7 @@ const std = @import("std"); 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/exercises/023_errors3.zig b/exercises/023_errors3.zig index 195f21a..2fdc4a2 100644 --- a/exercises/023_errors3.zig +++ b/exercises/023_errors3.zig @@ -12,14 +12,14 @@ const MyNumberError = error{TooSmall}; 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/exercises/024_errors4.zig b/exercises/024_errors4.zig index 02ec0f2..dc5c7d6 100644 --- a/exercises/024_errors4.zig +++ b/exercises/024_errors4.zig @@ -59,7 +59,13 @@ fn fixTooSmall(n: u32) MyNumberError!u32 { // 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/exercises/025_errors5.zig b/exercises/025_errors5.zig index 94bf1c7..55e08a8 100644 --- a/exercises/025_errors5.zig +++ b/exercises/025_errors5.zig @@ -26,7 +26,7 @@ fn addFive(n: u32) MyNumberError!u32 { // This function needs to return any error which might come back from detect(). // Please use a "try" statement rather than a "catch". // - const x = detect(n); + const x = try detect(n); return x + 5; } diff --git a/exercises/026_hello2.zig b/exercises/026_hello2.zig index f110d87..096131f 100644 --- a/exercises/026_hello2.zig +++ b/exercises/026_hello2.zig @@ -28,5 +28,5 @@ pub fn main(init: std.process.Init) !void { // 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/exercises/027_defer.zig b/exercises/027_defer.zig index b41e2af..68d0974 100644 --- a/exercises/027_defer.zig +++ b/exercises/027_defer.zig @@ -20,6 +20,6 @@ const std = @import("std"); 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/exercises/028_defer2.zig b/exercises/028_defer2.zig index b490a89..9540f60 100644 --- a/exercises/028_defer2.zig +++ b/exercises/028_defer2.zig @@ -20,7 +20,7 @@ pub fn main() void { fn printAnimal(animal: u8) void { std.debug.print("(", .{}); - std.debug.print(") ", .{}); // <---- how?! + defer std.debug.print(") ", .{}); // <---- how?! if (animal == 'g') { std.debug.print("Goat", .{}); @@ -51,9 +51,9 @@ fn calculateTheUltimateQuestionOfLife() u32 { // Try reordering the statements to get the answer 42 { - defer x = x / 10; - defer x = x + 11; defer x = x * 2; + defer x = x + 11; + defer x = x / 10; } return x; diff --git a/exercises/029_errdefer.zig b/exercises/029_errdefer.zig index 39ab306..bda1ea2 100644 --- a/exercises/029_errdefer.zig +++ b/exercises/029_errdefer.zig @@ -32,7 +32,7 @@ fn makeNumber() MyErr!u32 { // 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/exercises/030_switch.zig b/exercises/030_switch.zig index cb983f5..04e6b6d 100644 --- a/exercises/030_switch.zig +++ b/exercises/030_switch.zig @@ -46,6 +46,7 @@ pub fn main() void { // 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/exercises/031_switch2.zig b/exercises/031_switch2.zig index cf5b5a5..444539c 100644 --- a/exercises/031_switch2.zig +++ b/exercises/031_switch2.zig @@ -31,6 +31,7 @@ pub fn main() void { 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/exercises/032_unreachable.zig b/exercises/032_unreachable.zig index ffc35a4..7fe5fc1 100644 --- a/exercises/032_unreachable.zig +++ b/exercises/032_unreachable.zig @@ -35,6 +35,7 @@ pub fn main() void { 3 => { current_value *= current_value; }, + else => unreachable, } std.debug.print("{} ", .{current_value}); diff --git a/exercises/033_iferror.zig b/exercises/033_iferror.zig index 12da2d2..cd93495 100644 --- a/exercises/033_iferror.zig +++ b/exercises/033_iferror.zig @@ -40,6 +40,7 @@ pub fn main() void { } else |err| switch (err) { MyNumberError.TooBig => std.debug.print(">4. ", .{}), // Please add a match for TooSmall here and have it print: "<4. " + MyNumberError.TooSmall => std.debug.print("<4. ", .{}), } } diff --git a/exercises/034_quiz4.zig b/exercises/034_quiz4.zig index b33a6f5..dd176b7 100644 --- a/exercises/034_quiz4.zig +++ b/exercises/034_quiz4.zig @@ -14,9 +14,9 @@ pub fn main(init: std.process.Init) !void { var stdout_writer = std.Io.File.stdout().writer(io, &.{}); const stdout = &stdout_writer.interface; - const my_num: u32 = getNumber(); + const my_num: NumError!u32 = getNumber(); - try stdout.print("my_num={}\n", .{my_num}); + try stdout.print("my_num={!}\n", .{my_num}); } // This function is obviously weird and non-functional. But you will not be changing it for this quiz. diff --git a/exercises/035_enums.zig b/exercises/035_enums.zig index 1825f52..da0e415 100644 --- a/exercises/035_enums.zig +++ b/exercises/035_enums.zig @@ -20,7 +20,7 @@ const std = @import("std"); // Please complete the enum! -const Ops = enum { ??? }; +const Ops = enum { inc, pow, dec }; pub fn main() void { const operations = [_]Ops{ diff --git a/exercises/036_enums2.zig b/exercises/036_enums2.zig index dc2998c..d4898ab 100644 --- a/exercises/036_enums2.zig +++ b/exercises/036_enums2.zig @@ -31,7 +31,7 @@ const std = @import("std"); const Color = enum(u32) { red = 0xff0000, green = 0x00ff00, - blue = ???, + blue = 0x0000ff }; pub fn main() void { @@ -53,12 +53,12 @@ pub fn main() void { \\<p> \\ <span style="color: #{x:0>6}">Red</span> \\ <span style="color: #{x:0>6}">Green</span> - \\ <span style="color: #{}">Blue</span> + \\ <span style="color: #{x:0>6}">Blue</span> \\</p> \\ , .{ @intFromEnum(Color.red), @intFromEnum(Color.green), - @intFromEnum(???), // Oops! We're missing something! + @intFromEnum(Color.blue) // Oops! We're missing something! }); } diff --git a/exercises/037_structs.zig b/exercises/037_structs.zig index c345faf..a7a9a2f 100644 --- a/exercises/037_structs.zig +++ b/exercises/037_structs.zig @@ -33,6 +33,7 @@ const Role = enum { // Please add a new property to this struct called "health" and make // it a u8 integer type. const Character = struct { + health: u8, role: Role, gold: u32, experience: u32, @@ -41,6 +42,7 @@ const Character = struct { pub fn main() void { // Please initialize Glorp with 100 health. var glorp_the_wise = Character{ + .health = 100, .role = Role.wizard, .gold = 20, .experience = 10, diff --git a/exercises/038_structs2.zig b/exercises/038_structs2.zig index b9d84aa..bffc33a 100644 --- a/exercises/038_structs2.zig +++ b/exercises/038_structs2.zig @@ -42,6 +42,12 @@ pub fn main() void { // // 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/exercises/039_pointers.zig b/exercises/039_pointers.zig index 792fcc7..fc06a29 100644 --- a/exercises/039_pointers.zig +++ b/exercises/039_pointers.zig @@ -30,7 +30,7 @@ pub fn main() void { // 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/exercises/040_pointers2.zig b/exercises/040_pointers2.zig index e220336..eb97c85 100644 --- a/exercises/040_pointers2.zig +++ b/exercises/040_pointers2.zig @@ -22,7 +22,7 @@ const std = @import("std"); pub fn main() void { - const a: u8 = 12; + var a: u8 = 12; const b: *u8 = &a; // fix this! std.debug.print("a: {}, b: {}\n", .{ a, b.* }); diff --git a/exercises/041_pointers3.zig b/exercises/041_pointers3.zig index 9e2bcc6..5b63d71 100644 --- a/exercises/041_pointers3.zig +++ b/exercises/041_pointers3.zig @@ -31,7 +31,7 @@ pub fn main() void { // 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/exercises/042_pointers4.zig b/exercises/042_pointers4.zig index 1f6db70..1ecc1f3 100644 --- a/exercises/042_pointers4.zig +++ b/exercises/042_pointers4.zig @@ -37,5 +37,5 @@ pub fn main() void { // 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/exercises/043_pointers5.zig b/exercises/043_pointers5.zig index 3117639..75c9feb 100644 --- a/exercises/043_pointers5.zig +++ b/exercises/043_pointers5.zig @@ -68,7 +68,7 @@ pub fn main() void { // 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/exercises/044_quiz5.zig b/exercises/044_quiz5.zig index 8a0d88c..3e6ee79 100644 --- a/exercises/044_quiz5.zig +++ b/exercises/044_quiz5.zig @@ -19,12 +19,14 @@ const Elephant = struct { 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/exercises/045_optionals.zig b/exercises/045_optionals.zig index 494c960..1763f6b 100644 --- a/exercises/045_optionals.zig +++ b/exercises/045_optionals.zig @@ -29,7 +29,7 @@ pub fn main() void { // 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/exercises/046_optionals2.zig b/exercises/046_optionals2.zig index b5fffbb..a158389 100644 --- a/exercises/046_optionals2.zig +++ b/exercises/046_optionals2.zig @@ -22,7 +22,7 @@ const std = @import("std"); const Elephant = struct { letter: u8, - tail: *Elephant = null, // Hmm... tail needs something... + tail: ?*Elephant = null, // Hmm... tail needs something... visited: bool = false, }; @@ -34,6 +34,7 @@ pub fn main() void { // Link the elephants so that each tail "points" to the next. linkElephants(&elephantA, &elephantB); linkElephants(&elephantB, &elephantC); + linkElephants(&elephantC, &elephantA); // `linkElephants` will stop the program if you try and link an // elephant that doesn't exist! Uncomment and see what happens. @@ -66,6 +67,6 @@ fn visitElephants(first_elephant: *Elephant) void { // HINT: We want something similar to what `.?` does, // but instead of ending the program, we want to exit the loop... - e = e.tail ??? + e = e.tail orelse break; } } diff --git a/exercises/047_methods.zig b/exercises/047_methods.zig index 3e88719..dcdeb6a 100644 --- a/exercises/047_methods.zig +++ b/exercises/047_methods.zig @@ -106,7 +106,7 @@ pub fn main() void { 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/exercises/048_methods2.zig b/exercises/048_methods2.zig index a1fbe9e..f0ce821 100644 --- a/exercises/048_methods2.zig +++ b/exercises/048_methods2.zig @@ -54,7 +54,7 @@ fn visitElephants(first_elephant: *Elephant) void { // 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/exercises/049_quiz6.zig b/exercises/049_quiz6.zig index 9dbea51..2da18de 100644 --- a/exercises/049_quiz6.zig +++ b/exercises/049_quiz6.zig @@ -27,7 +27,13 @@ const Elephant = struct { // 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); + } // --------------------------------------------------- diff --git a/exercises/050_no_value.zig b/exercises/050_no_value.zig index 8074f7e..fab0a5d 100644 --- a/exercises/050_no_value.zig +++ b/exercises/050_no_value.zig @@ -64,10 +64,10 @@ const std = @import("std"); 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 = undefined; first_line2 = "which can eternal lie"; // Note we need the "{!s}" format for the error union string. @@ -76,8 +76,8 @@ pub fn main() void { printSecondLine(); } -fn printSecondLine() ??? { - var second_line2: ?*const [18]u8 = ???; +fn printSecondLine() void { + var second_line2: ?*const [18]u8 = undefined; second_line2 = "even death may die"; std.debug.print("And with strange aeons {s}.\n", .{second_line2.?}); diff --git a/exercises/051_values.zig b/exercises/051_values.zig index aa4dbe9..64470a8 100644 --- a/exercises/051_values.zig +++ b/exercises/051_values.zig @@ -87,7 +87,7 @@ pub fn main() void { // 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. // @@ -163,13 +163,13 @@ pub fn main() void { 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/exercises/052_slices.zig b/exercises/052_slices.zig index af5930b..24dbb08 100644 --- a/exercises/052_slices.zig +++ b/exercises/052_slices.zig @@ -32,8 +32,8 @@ pub fn main() void { 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 @@ pub fn main() void { } // 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/exercises/053_slices2.zig b/exercises/053_slices2.zig index 545b4da..924f6a3 100644 --- a/exercises/053_slices2.zig +++ b/exercises/053_slices2.zig @@ -17,19 +17,19 @@ const std = @import("std"); 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/exercises/054_manypointers.zig b/exercises/054_manypointers.zig index ede02df..d57c112 100644 --- a/exercises/054_manypointers.zig +++ b/exercises/054_manypointers.zig @@ -33,7 +33,7 @@ pub fn main() void { // 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 [21]u8 = zen_manyptr[0..21]; // Here's the moment of truth! std.debug.print("{s}\n", .{zen12_string}); diff --git a/exercises/055_unions.zig b/exercises/055_unions.zig index 794f2df..aac38a6 100644 --- a/exercises/055_unions.zig +++ b/exercises/055_unions.zig @@ -59,7 +59,7 @@ pub fn main() void { std.debug.print("Insect report! ", .{}); // Oops! We've made a mistake here. - printInsect(ant, AntOrBee.c); + printInsect(ant, AntOrBee.a); printInsect(bee, AntOrBee.c); std.debug.print("\n", .{}); diff --git a/exercises/056_unions2.zig b/exercises/056_unions2.zig index c46d133..bebc833 100644 --- a/exercises/056_unions2.zig +++ b/exercises/056_unions2.zig @@ -44,14 +44,14 @@ pub fn main() void { 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/exercises/057_unions3.zig b/exercises/057_unions3.zig index a5017d2..0c3c3b2 100644 --- a/exercises/057_unions3.zig +++ b/exercises/057_unions3.zig @@ -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/exercises/058_quiz7.zig b/exercises/058_quiz7.zig index d3b677b..f7d231d 100644 --- a/exercises/058_quiz7.zig +++ b/exercises/058_quiz7.zig @@ -192,8 +192,8 @@ const TripItem = union(enum) { // Oops! The hermit forgot how to capture the union values // in a switch statement. Please capture each value 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}), } } }; @@ -254,7 +254,7 @@ const HermitsNotebook = struct { // 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; @@ -308,7 +308,7 @@ const HermitsNotebook = struct { // // 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/exercises/059_integers.zig b/exercises/059_integers.zig index ae65790..32953e5 100644 --- a/exercises/059_integers.zig +++ b/exercises/059_integers.zig @@ -20,9 +20,9 @@ const print = @import("std").debug.print; 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/exercises/060_floats.zig b/exercises/060_floats.zig index f060810..4441920 100644 --- a/exercises/060_floats.zig +++ b/exercises/060_floats.zig @@ -50,7 +50,7 @@ pub fn main() void { // // We'll convert this weight from pounds to metric units at a // conversion of 0.453592 kg to the pound. - const shuttle_weight: f16 = 0.453592 * 4480e3; + const shuttle_weight: f31 = 0.453592 * 4480e3; // By default, float values are formatted in standard decimal // notation. Experiment with '{d}' and '{d:.3}' to see how @@ -58,7 +58,7 @@ pub fn main() void { // scientific notation. // NOTE: The weight of the shuttle is a huge number, a scientific notation // may be more appropriate. - print("Shuttle liftoff weight: {d:.0} metric tons\n", .{shuttle_weight / 1e3}); + print("Shuttle liftoff weight: {e:.3} metric tons\n", .{shuttle_weight / 1e3}); } // Floating further: diff --git a/exercises/061_coercions.zig b/exercises/061_coercions.zig index ccf3c9b..6166144 100644 --- a/exercises/061_coercions.zig +++ b/exercises/061_coercions.zig @@ -67,11 +67,11 @@ const print = @import("std").debug.print; 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). - // Hint: Use coercion Rules 4 and 5. + // Hint: Use coercion Rules 3 and 5. // When it's right, this will work: print("Letter: {u}\n", .{my_letter.?.*[0]}); diff --git a/exercises/062_loop_expressions.zig b/exercises/062_loop_expressions.zig index f6b8771..8c37e28 100644 --- a/exercises/062_loop_expressions.zig +++ b/exercises/062_loop_expressions.zig @@ -47,7 +47,7 @@ pub fn main() void { // 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/exercises/063_labels.zig b/exercises/063_labels.zig index 79adfaa..e9bb294 100644 --- a/exercises/063_labels.zig +++ b/exercises/063_labels.zig @@ -128,8 +128,8 @@ pub fn main() void { // wanted for this Food. // // Please return this Food from the loop. - break; - }; + break :food_loop 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/exercises/064_builtins.zig b/exercises/064_builtins.zig index e91dfbe..b1c23fb 100644 --- a/exercises/064_builtins.zig +++ b/exercises/064_builtins.zig @@ -63,7 +63,7 @@ pub fn main() void { // // 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 = 0b10010; print(". Without overflow: {b:0>8}. ", .{expected_result}); print("Furthermore, ", .{}); @@ -78,6 +78,6 @@ pub fn main() void { // 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/exercises/065_builtins2.zig b/exercises/065_builtins2.zig index 9d137ef..2c29bdb 100644 --- a/exercises/065_builtins2.zig +++ b/exercises/065_builtins2.zig @@ -58,7 +58,7 @@ pub fn main() void { // 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 @@ pub fn main() void { // // 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. ", .{ @@ -102,16 +102,16 @@ pub fn main() void { // 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 (field_???[???] != void) { - print(" {s}", .{field_???[???]}); + if (field_types[0] != void) { + print(" {s}", .{field_names[0]}); } - if (field_???[???] != void) { - print(" {s}", .{field_???[???]}); + if (field_types[1] != void) { + print(" {s}", .{field_names[1]}); } - if (field_???[???] != void) { - print(" {s}", .{field_???[???]}); + if (field_types[2] != void) { + print(" {s}", .{field_names[2]}); } // Yuck, look at all that repeated code above! I don't know diff --git a/exercises/066_comptime.zig b/exercises/066_comptime.zig index 9b07a2d..124b472 100644 --- a/exercises/066_comptime.zig +++ b/exercises/066_comptime.zig @@ -62,8 +62,8 @@ pub fn main() void { // 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/exercises/067_comptime2.zig b/exercises/067_comptime2.zig index e212263..da27d57 100644 --- a/exercises/067_comptime2.zig +++ b/exercises/067_comptime2.zig @@ -36,7 +36,7 @@ pub fn main() void { // 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; const a1: [count]u8 = @splat('A'); diff --git a/exercises/068_comptime3.zig b/exercises/068_comptime3.zig index bb82778..919a6ed 100644 --- a/exercises/068_comptime3.zig +++ b/exercises/068_comptime3.zig @@ -43,7 +43,9 @@ const Schooner = struct { // // 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; + } self.scale = my_scale; self.hull_length /= my_scale; @@ -69,7 +71,7 @@ pub fn main() void { // 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/exercises/069_comptime4.zig b/exercises/069_comptime4.zig index e090bb3..0263de0 100644 --- a/exercises/069_comptime4.zig +++ b/exercises/069_comptime4.zig @@ -42,8 +42,8 @@ pub fn main() void { // 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/exercises/070_comptime5.zig b/exercises/070_comptime5.zig index afd4ae8..c6bc4bb 100644 --- a/exercises/070_comptime5.zig +++ b/exercises/070_comptime5.zig @@ -123,8 +123,8 @@ fn isADuck(possible_duck: anytype) bool { // 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/exercises/071_comptime6.zig b/exercises/071_comptime6.zig index 3df9299..4d3f38f 100644 --- a/exercises/071_comptime6.zig +++ b/exercises/071_comptime6.zig @@ -41,7 +41,7 @@ pub fn main() void { const field_names = @typeInfo(Narcissus).@"struct".field_names; const field_types = @typeInfo(Narcissus).@"struct".field_types; - ??? { + inline for (field_names, field_types) |field_name, field_type| { if (field_type != void) { print(" {s}", .{field_name}); } diff --git a/exercises/072_comptime7.zig b/exercises/072_comptime7.zig index 631e75b..1bdcc1a 100644 --- a/exercises/072_comptime7.zig +++ b/exercises/072_comptime7.zig @@ -35,7 +35,7 @@ pub fn main() void { // 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/exercises/073_comptime8.zig b/exercises/073_comptime8.zig index fe1f8ea..1baf179 100644 --- a/exercises/073_comptime8.zig +++ b/exercises/073_comptime8.zig @@ -32,7 +32,7 @@ const llamas = [llama_count]u32{ 5, 10, 15, 20, 25 }; 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 = comptime getLlama(4); print("My llama value is {}.\n", .{my_llama}); } diff --git a/exercises/074_comptime9.zig b/exercises/074_comptime9.zig index dfdc588..82bf6b3 100644 --- a/exercises/074_comptime9.zig +++ b/exercises/074_comptime9.zig @@ -28,12 +28,12 @@ fn makeCreature(comptime count: usize, comptime fmt: []const u8) [count]Animal { start, // Ready to start a new animal. l, // This means we've seen an "l", so if we see an "m", we know it's a Llama. }; - var state = State.start; + comptime var state = State.start; // We return an array of animals representing the creature. (This is why we // really needed the 'count' parameter. Arrays need a size.) var animals: [count]Animal = undefined; - var next_animal: usize = 0; + comptime var next_animal: usize = 0; inline for (fmt) |char| { @@ -57,7 +57,10 @@ fn makeCreature(comptime count: usize, comptime fmt: []const u8) [count]Animal { // // What do you think happens with Gators? Do they join with // other animals or is this an error? - 'g' => ???, + 'g' => { + animals[next_animal] = .Gator; + next_animal += 1; + }, else => @compileError(std.fmt.comptimePrint("No animal starts with '{c}'!", .{char})), }, @@ -69,7 +72,7 @@ fn makeCreature(comptime count: usize, comptime fmt: []const u8) [count]Animal { next_animal += 1; // Something is missing here. After we finish a Llama, we // need to be ready to _start_ over with a new animal... - ??? + state = State.start; }, else => @compileError("Only llamas start with 'l'!"), diff --git a/exercises/075_quiz8.zig b/exercises/075_quiz8.zig index 08270ee..fd7c702 100644 --- a/exercises/075_quiz8.zig +++ b/exercises/075_quiz8.zig @@ -48,7 +48,13 @@ const Path = struct { // instead. // // Please fill in the body of this function! -fn makePath(from: *Place, to: *Place, dist: u8) Path {} +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 // space in our program now! |
