diff --git a/exercises/001_hello.zig b/exercises/001_hello.zig index 2d95a10..eab663a 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 497d400..e5058a9 100644 --- a/exercises/005_arrays2.zig +++ b/exercises/005_arrays2.zig @@ -25,12 +25,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 = [_]u8{ ??? } ** 3; + const bit_pattern = [_]u8{ 1, 0, 0, 1 } ** 3; // Okay, that's all of the problems. Let's see the results. // diff --git a/exercises/006_strings.zig b/exercises/006_strings.zig index 5a7172c..3ad26ce 100644 --- a/exercises/006_strings.zig +++ b/exercises/006_strings.zig @@ -24,18 +24,18 @@ 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 repeat '**' operator to make "ha ha ha ". - const laugh = "ha " ???; + const laugh = "ha " ** 3; // (Problem 3) // Use the array concatenation '++' operator to make "Major Tom". // (You'll need to add a space as well!) const major = "Major"; const tom = "Tom"; - const major_tom = major ??? tom; + const major_tom = major ++ " " ++ tom; // That's all the problems. Let's see our results: std.debug.print("d={u} {s}{s}\n", .{ d, laugh, major_tom }); diff --git a/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..718d877 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,11 @@ pub fn main() void { lang[0] = letters[x]; x = 3; - lang[???] = letters[x]; + lang[1] = letters[x]; - x = ???; - lang[2] = letters[???]; + // x = letters.len - 1; + x = letters.len - 1; + 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 4536fc3..23afdeb 100644 --- a/exercises/009_if.zig +++ b/exercises/009_if.zig @@ -21,7 +21,7 @@ const std = @import("std"); pub fn main() void { - const foo = 1; + const foo: bool = true; // Please fix this condition: if (foo) { 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 4cccf62..8f9a924 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..5350b89 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() ??? { +pub fn deepThought() u8 { return 42; // Number courtesy Douglas Adams } diff --git a/exercises/019_functions2.zig b/exercises/019_functions2.zig index a527ae2..000b5a2 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(comptime my_number: u32) u32 { return std.math.pow(u32, 2, my_number); // std.math.pow(type, a, b) takes a numeric type and two // numbers of that type (or that can coerce to that type) and diff --git a/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..fa535ab 100644 --- a/exercises/024_errors4.zig +++ b/exercises/024_errors4.zig @@ -59,7 +59,10 @@ 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 63595b1..b226dd5 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". // - var x = detect(n); + var x = try detect(n); return x + 5; } diff --git a/exercises/026_hello2.zig b/exercises/026_hello2.zig index cd59b86..64c64c4 100644 --- a/exercises/026_hello2.zig +++ b/exercises/026_hello2.zig @@ -23,5 +23,5 @@ pub fn main() !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..f05355a 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", .{}); - std.debug.print("One ", .{}); + defer std.debug.print("Two\n", .{}); + defer std.debug.print("One ", .{}); } diff --git a/exercises/028_defer2.zig b/exercises/028_defer2.zig index 35c1326..358fe28 100644 --- a/exercises/028_defer2.zig +++ b/exercises/028_defer2.zig @@ -18,7 +18,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", .{}); diff --git a/exercises/029_errdefer.zig b/exercises/029_errdefer.zig index 82fdfe1..6747b5b 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..59ad03c 100644 --- a/exercises/030_switch.zig +++ b/exercises/030_switch.zig @@ -42,6 +42,7 @@ pub fn main() void { // ... we don't need everything in between ... 25 => std.debug.print("Y", .{}), 26 => std.debug.print("Z", .{}), + else => std.debug.print("?", .{}), // Switch statements must be "exhaustive" (there must be a // match for every possible value). Please add an "else" // to this switch to print a question mark "?" when c is diff --git a/exercises/031_switch2.zig b/exercises/031_switch2.zig index cf5b5a5..11d160b 100644 --- a/exercises/031_switch2.zig +++ b/exercises/031_switch2.zig @@ -29,6 +29,7 @@ pub fn main() void { // ... 25 => 'Y', 26 => 'Z', + else => '!', // As in the last exercise, please add the 'else' clause // and this time, have it return an exclamation mark '!'. }; 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 6ba0c61..d444c57 100644 --- a/exercises/033_iferror.zig +++ b/exercises/033_iferror.zig @@ -39,6 +39,7 @@ pub fn main() void { std.debug.print("={}. ", .{value}); } else |err| switch (err) { MyNumberError.TooBig => std.debug.print(">4. ", .{}), + MyNumberError.TooSmall => std.debug.print("<4. ", .{}), // Please add a match for TooSmall here and have it print: "<4. " } } diff --git a/exercises/034_quiz4.zig b/exercises/034_quiz4.zig index 2d843f2..fc4c49b 100644 --- a/exercises/034_quiz4.zig +++ b/exercises/034_quiz4.zig @@ -9,10 +9,10 @@ const std = @import("std"); 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 = getNumber() catch 42; try stdout.print("my_num={}\n", .{my_num}); } 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..5e0efdd 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 { \\
\\ Red \\ Green - \\ Blue + \\ Blue \\
\\ , .{ @intFromEnum(Color.red), @intFromEnum(Color.green), - @intFromEnum(???), // Oops! We're missing something! + @intFromEnum(Color.blue), // Oops! We're missing something! }); } diff --git a/exercises/037_structs.zig b/exercises/037_structs.zig index c345faf..50741ec 100644 --- a/exercises/037_structs.zig +++ b/exercises/037_structs.zig @@ -34,6 +34,7 @@ const Role = enum { // it a u8 integer type. const Character = struct { role: Role, + health: u8, gold: u32, experience: u32, }; @@ -44,6 +45,7 @@ pub fn main() void { .role = Role.wizard, .gold = 20, .experience = 10, + .health = 100, }; // Glorp gains some gold. diff --git a/exercises/038_structs2.zig b/exercises/038_structs2.zig index b9d84aa..1a6f0e5 100644 --- a/exercises/038_structs2.zig +++ b/exercises/038_structs2.zig @@ -33,6 +33,13 @@ pub fn main() void { .experience = 10, }; + chars[1] = Character{ + .role = Role.bard, + .gold = 10, + .health = 100, + .experience = 20, + }; + // Please add "Zump the Loud" with the following properties: // // role bard diff --git a/exercises/039_pointers.zig b/exercises/039_pointers.zig index d545525..399803f 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 a4852f6..e54888d 100644 --- a/exercises/040_pointers2.zig +++ b/exercises/040_pointers2.zig @@ -23,7 +23,7 @@ const std = @import("std"); pub fn main() void { const a: u8 = 12; - const b: *u8 = &a; // fix this! + const b: *const u8 = &a; // fix this! std.debug.print("a: {}, b: {}\n", .{ a, b.* }); } diff --git a/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 9e2fa6f..23ee2e2 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..82d7cf6 100644 --- a/exercises/044_quiz5.zig +++ b/exercises/044_quiz5.zig @@ -18,12 +18,14 @@ const Elephant = struct { pub fn main() void { var elephantA = Elephant{ .letter = 'A' }; + var elephantB = Elephant{ .letter = 'B' }; // (Please add Elephant B here!) 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; + elephantB.tail = &elephantC; // (Please link Elephant B's tail to Elephant C here!) elephantC.tail = &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 d3f65bb..77b7f24 100644 --- a/exercises/046_optionals2.zig +++ b/exercises/046_optionals2.zig @@ -21,7 +21,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, }; @@ -51,7 +51,7 @@ fn visitElephants(first_elephant: *Elephant) void { // We should stop once we encounter a tail that // does NOT point to another element. What can // we put here to make that happen? - if (e.tail == null) ???; + if (e.tail == null) break; e = e.tail.?; } diff --git a/exercises/047_methods.zig b/exercises/047_methods.zig index d2e3ee6..fad36b5 100644 --- a/exercises/047_methods.zig +++ b/exercises/047_methods.zig @@ -88,7 +88,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 3291965..4bfb33c 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 92541a5..3f5684c 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(me: *Elephant) *Elephant { + return me.trunk.?; + } + + pub fn hasTrunk(me: *Elephant) bool { + return me.trunk != null; + } // --------------------------------------------------- diff --git a/exercises/050_no_value.zig b/exercises/050_no_value.zig index 8c73ed3..80d20eb 100644 --- a/exercises/050_no_value.zig +++ b/exercises/050_no_value.zig @@ -65,10 +65,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 = Err.Cthulhu; first_line2 = "which can eternal lie"; // Note we need the "{!s}" format for the error union string. @@ -77,8 +77,8 @@ pub fn main() void { printSecondLine(); } -fn printSecondLine() ??? { - var second_line2: ?*const [18]u8 = ???; +fn printSecondLine() void { + var second_line2: ?*const [18]u8 = null; second_line2 = "even death may die"; std.debug.print("And with strange aeons {s}.\n", .{second_line2.?}); diff --git a/exercises/051_values.zig b/exercises/051_values.zig index f2653f9..848b6a8 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. // @@ -152,13 +152,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..d323e1d 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: *[4]u8 = cards[0..4]; + const hand2 = cards[4..8]; 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: *[4]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 695b55e..b6e39f2 100644 --- a/exercises/054_manypointers.zig +++ b/exercises/054_manypointers.zig @@ -32,7 +32,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 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 6339fc8..f6913b4 100644 --- a/exercises/055_unions.zig +++ b/exercises/055_unions.zig @@ -59,8 +59,8 @@ pub fn main() void { std.debug.print("Insect report! ", .{}); // Oops! We've made a mistake here. - printInsect(ant, AntOrBee.c); - printInsect(bee, AntOrBee.c); + printInsect(ant, AntOrBee.a); + printInsect(bee, AntOrBee.b); std.debug.print("\n", .{}); } diff --git a/exercises/056_unions2.zig b/exercises/056_unions2.zig index e4294db..911ee42 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 142180f..52b0a9e 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 bbdebf6..245a6c3 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 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 @@ 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; @@ -309,7 +309,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) !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 39e077c..46facd5 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 + 'Z', // octal + 'i', // binary + 'g', // hex }; print("{s} is cool.\n", .{zig}); diff --git a/exercises/060_floats.zig b/exercises/060_floats.zig index 69b3946..42aff63 100644 --- a/exercises/060_floats.zig +++ b/exercises/060_floats.zig @@ -43,7 +43,7 @@ pub fn main() void { // // 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 * 2.200; // By default, float values are formatted in scientific // notation. Try experimenting with '{d}' and '{d:.3}' to see diff --git a/exercises/061_coercions.zig b/exercises/061_coercions.zig index ccf3c9b..0ecf542 100644 --- a/exercises/061_coercions.zig +++ b/exercises/061_coercions.zig @@ -67,7 +67,7 @@ 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). diff --git a/exercises/062_loop_expressions.zig b/exercises/062_loop_expressions.zig index f6b8771..6815f25 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 "NOOP"; if (current_lang) |cl| { print("Current language: {s}\n", .{cl}); diff --git a/exercises/063_labels.zig b/exercises/063_labels.zig index 79adfaa..ce3783f 100644 --- a/exercises/063_labels.zig +++ b/exercises/063_labels.zig @@ -115,21 +115,17 @@ pub fn main() void { // (Remember that want_it will be the index number of // the ingredient based on its position in the // required ingredient list for each food.) - const found = for (wanted_ingredients) |want_it| { - if (required_ingredient == want_it) break true; - } else false; - - // We did not find this required ingredient, so we - // can't make this Food. Continue the outer loop. - if (!found) continue :food_loop; + for (wanted_ingredients) |want_it| { + if (required_ingredient == want_it) break; + } else continue :food_loop; } // If we get this far, the required ingredients were all // wanted for this Food. // // Please return this Food from the loop. - break; - }; + break food; + } else menu[0]; // ^ Oops! We forgot to return Mac & Cheese as the default // Food when the requested ingredients aren't found. diff --git a/exercises/064_builtins.zig b/exercises/064_builtins.zig index 1d680d8..2b63d3e 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 7d9939a..d2fcd69 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. ", .{ @@ -109,15 +109,15 @@ 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 (fields[0].??? != void) { + if (fields[0].type != void) { print(" {s}", .{@typeInfo(Narcissus).Struct.fields[0].name}); } - if (fields[1].??? != void) { + if (fields[1].type != void) { print(" {s}", .{@typeInfo(Narcissus).Struct.fields[1].name}); } - if (fields[2].??? != void) { + if (fields[2].type != void) { print(" {s}", .{@typeInfo(Narcissus).Struct.fields[2].name}); } diff --git a/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 7d4bdb0..136bca1 100644 --- a/exercises/067_comptime2.zig +++ b/exercises/067_comptime2.zig @@ -35,7 +35,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; var a1: [count]u8 = .{'A'} ** count; diff --git a/exercises/068_comptime3.zig b/exercises/068_comptime3.zig index 15b8997..4d8419a 100644 --- a/exercises/068_comptime3.zig +++ b/exercises/068_comptime3.zig @@ -43,7 +43,8 @@ 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) @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 +70,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 3b85aae..69a529b 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 7723291..d467184 100644 --- a/exercises/071_comptime6.zig +++ b/exercises/071_comptime6.zig @@ -40,7 +40,7 @@ pub fn main() void { const fields = @typeInfo(Narcissus).Struct.fields; - ??? { + inline for (fields) |field| { if (field.type != void) { print(" {s}", .{field.name}); } diff --git a/exercises/072_comptime7.zig b/exercises/072_comptime7.zig index 9bc30fb..48bb39e 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..2e69566 100644 --- a/exercises/073_comptime8.zig +++ b/exercises/073_comptime8.zig @@ -32,12 +32,12 @@ 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 = getLlama(4); print("My llama value is {}.\n", .{my_llama}); } -fn getLlama(i: usize) u32 { +fn getLlama(comptime i: usize) u32 { // We've put a guard assert() at the top of this function to // prevent mistakes. The 'comptime' keyword here means that // the mistake will be caught when we compile! diff --git a/exercises/074_comptime9.zig b/exercises/074_comptime9.zig index 6db8ad2..d5e6e67 100644 --- a/exercises/074_comptime9.zig +++ b/exercises/074_comptime9.zig @@ -39,7 +39,7 @@ const llamas = makeLlamas(llama_count); // And here's the function. Note that the return value type // depends on one of the input arguments! -fn makeLlamas(count: usize) [count]u8 { +fn makeLlamas(comptime count: usize) [count]u8 { var temp: [count]u8 = undefined; var i = 0; diff --git a/exercises/075_quiz8.zig b/exercises/075_quiz8.zig index 12b460c..8eee967 100644 --- a/exercises/075_quiz8.zig +++ b/exercises/075_quiz8.zig @@ -8,6 +8,8 @@ // of it. // const print = @import("std").debug.print; +const mem = @import("std").mem; +const fmt = @import("std").fmt; const TripError = error{ Unreachable, EatenByAGrue }; @@ -49,12 +51,47 @@ const Path = struct { // // 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, + }; +} +fn makePath2(comptime path: []const u8) Path { + var it = mem.split(u8, path, "->"); + var from: []const u8 = it.first(); + it = mem.split(u8, it.next().?, ":"); + var to: []const u8 = it.first(); + var dist: []const u8 = it.next().?; + return Path{ + .from = &@field(@This(), from), + .to = &@field(@This(), to), + .dist = try fmt.parseInt(u8, dist, 10), + }; +} + +fn makePath3(comptime path: []const u8) Path { + var it = mem.split(u8, path, "->"); + var from: []const u8 = it.first(); + var list = it.next().?; + var connections_it = mem.split(u8, list[1..(path.len - from.len - 3)], " "); + + while (connections_it.next()) |connect| { + var connection_it = mem.split(u8, connect, ":"); + return Path{ + .from = &@field(@This(), from), + .to = &@field(@This(), connection_it.first()), + .dist = try fmt.parseInt(u8, connection_it.next().?, 10), + }; + } } // Using our new function, these path definitions take up considerably less // space in our program now! -const a_paths = [_]Path{makePath(&a, &b, 2)}; +// const a_paths = [_]Path{makePath(&a, &b, 2)}; +const a_paths = [_]Path{makePath2("a->b:2")}; +// const a_paths = makePath3("a->(b:2)"); const b_paths = [_]Path{ makePath(&b, &a, 2), makePath(&b, &d, 1) }; const c_paths = [_]Path{ makePath(&c, &d, 3), makePath(&c, &e, 2) }; const d_paths = [_]Path{ makePath(&d, &b, 1), makePath(&d, &c, 3), makePath(&d, &f, 7) }; @@ -154,6 +191,10 @@ pub fn main() void { const start = &a; // Archer's Point const destination = &f; // Fox Pond + // makePath3("a->(b:2 d:3)"); + var temp: Path = makePath3("a->(b:2)"); + _ = temp; + // We could either have this: // // a.paths = a_paths[0..]; diff --git a/exercises/076_sentinels.zig b/exercises/076_sentinels.zig index 1af59da..8f8ab02 100644 --- a/exercises/076_sentinels.zig +++ b/exercises/076_sentinels.zig @@ -82,7 +82,7 @@ fn printSequence(my_seq: anytype) void { print("Array:", .{}); // Loop through the items in my_seq. - for (???) |s| { + for (my_seq) |s| { print("{}", .{s}); } }, @@ -94,7 +94,7 @@ fn printSequence(my_seq: anytype) void { // Loop through the items in my_seq until we hit the // sentinel value. var i: usize = 0; - while (??? != my_sentinel) { + while (my_seq[i] != my_sentinel) { print("{}", .{my_seq[i]}); i += 1; } diff --git a/exercises/077_sentinels2.zig b/exercises/077_sentinels2.zig index fb8f13d..c2fb54c 100644 --- a/exercises/077_sentinels2.zig +++ b/exercises/077_sentinels2.zig @@ -60,7 +60,7 @@ pub fn main() void { // length... You've actually solved this problem before! // // Here's a big hint: do you remember how to take a slice? - const printable = ???; + const printable = foo.data[0..foo.length]; print("{s}\n", .{printable}); } diff --git a/exercises/078_sentinels3.zig b/exercises/078_sentinels3.zig index 1e443e6..90b953f 100644 --- a/exercises/078_sentinels3.zig +++ b/exercises/078_sentinels3.zig @@ -21,7 +21,7 @@ pub fn main() void { const data: [*]const u8 = "Weird Data!"; // Please cast 'data' to 'printable': - const printable: [*:0]const u8 = ???; + const printable: [*:0]const u8 = @ptrCast(data); print("{s}\n", .{printable}); } diff --git a/exercises/079_quoted_identifiers.zig b/exercises/079_quoted_identifiers.zig index 182c7ff..6abbe59 100644 --- a/exercises/079_quoted_identifiers.zig +++ b/exercises/079_quoted_identifiers.zig @@ -20,11 +20,11 @@ const print = @import("std").debug.print; pub fn main() void { - const 55_cows: i32 = 55; - const isn't true: bool = false; + const @"55_cows": i32 = 55; + const @"isn't true": bool = false; print("Sweet freedom: {}, {}.\n", .{ - 55_cows, - isn't true, + @"55_cows", + @"isn't true", }); } diff --git a/exercises/080_anonymous_structs.zig b/exercises/080_anonymous_structs.zig index 8205641..1e13f77 100644 --- a/exercises/080_anonymous_structs.zig +++ b/exercises/080_anonymous_structs.zig @@ -48,13 +48,13 @@ pub fn main() void { // * circle1 should hold i32 integers // * circle2 should hold f32 floats // - var circle1 = ??? { + var circle1 = Circle(i32) { .center_x = 25, .center_y = 70, .radius = 15, }; - var circle2 = ??? { + var circle2 = Circle(f32) { .center_x = 25.234, .center_y = 70.999, .radius = 15.714, diff --git a/exercises/081_anonymous_structs2.zig b/exercises/081_anonymous_structs2.zig index df78713..0b84438 100644 --- a/exercises/081_anonymous_structs2.zig +++ b/exercises/081_anonymous_structs2.zig @@ -38,7 +38,7 @@ pub fn main() void { // Please complete this function which prints an anonymous struct // representing a circle. -fn printCircle(???) void { +fn printCircle(circle: anytype) void { print("x:{} y:{} radius:{}\n", .{ circle.center_x, circle.center_y, diff --git a/exercises/082_anonymous_structs3.zig b/exercises/082_anonymous_structs3.zig index 6760ff3..ed6ab7c 100644 --- a/exercises/082_anonymous_structs3.zig +++ b/exercises/082_anonymous_structs3.zig @@ -82,14 +82,14 @@ fn printTuple(tuple: anytype) void { // @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 @@ fn printTuple(tuple: anytype) void { // // The first field should print as: "0"(bool):true print("\"{s}\"({any}):{any} ", .{ - field.???, - field.???, - ???, + field.name, + field.type, + @field(tuple, field.name), }); } } diff --git a/exercises/083_anonymous_lists.zig b/exercises/083_anonymous_lists.zig index daaeaff..82d008a 100644 --- a/exercises/083_anonymous_lists.zig +++ b/exercises/083_anonymous_lists.zig @@ -20,6 +20,6 @@ pub fn main() void { // // = .{ 'h', 'e', 'l', 'l', 'o' }; // - const hello = .{ 'h', 'e', 'l', 'l', 'o' }; + const hello: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' }; print("I say {s}!\n", .{hello}); } diff --git a/exercises/084_async.zig b/exercises/084_async.zig index 56c9969..14dc283 100644 --- a/exercises/084_async.zig +++ b/exercises/084_async.zig @@ -48,7 +48,7 @@ const print = @import("std").debug.print; pub fn main() void { // Additional Hint: you can assign things to '_' when you // don't intend to do anything with them. - foo(); + async foo(); } fn foo() void { diff --git a/exercises/092_interfaces.zig b/exercises/092_interfaces.zig index 7c958eb..e83a02f 100644 --- a/exercises/092_interfaces.zig +++ b/exercises/092_interfaces.zig @@ -106,7 +106,7 @@ pub fn main() !void { for (my_insects) |insect| { // Almost done! We want to print() each insect with a // single method call here. - ??? + insect.print(); } } diff --git a/exercises/093_hello_c.zig b/exercises/093_hello_c.zig index 043b9ed..ca8ffbe 100644 --- a/exercises/093_hello_c.zig +++ b/exercises/093_hello_c.zig @@ -54,7 +54,7 @@ pub fn main() void { // // In this exercise we use 'write' to output 17 chars, // but something is still missing... - const c_res = write(2, "Hello C from Zig!", 17); + const c_res = c.write(2, "Hello C from Zig!", 17); // let's see what the result from C is: std.debug.print(" - C result is {d} chars written.\n", .{c_res}); diff --git a/exercises/094_c_math.zig b/exercises/094_c_math.zig index 3815cb0..78d4050 100644 --- a/exercises/094_c_math.zig +++ b/exercises/094_c_math.zig @@ -19,7 +19,7 @@ const std = @import("std"); const c = @cImport({ // What do wee need here? - ??? + @cInclude("math.h"); }); pub fn main() !void { diff --git a/exercises/095_for3.zig b/exercises/095_for3.zig index e4c4662..3077342 100644 --- a/exercises/095_for3.zig +++ b/exercises/095_for3.zig @@ -54,7 +54,7 @@ pub fn main() void { // I want to print every number between 1 and 20 that is NOT // divisible by 3 or 5. - for (???) |n| { + for (1..21) |n| { // The '%' symbol is the "modulo" operator and it // returns the remainder after division. diff --git a/exercises/096_memory_allocation.zig b/exercises/096_memory_allocation.zig index 6e818b5..d41eb3a 100644 --- a/exercises/096_memory_allocation.zig +++ b/exercises/096_memory_allocation.zig @@ -64,7 +64,7 @@ pub fn main() !void { const allocator = arena.allocator(); // allocate memory for this array - var avg: []f64 = ???; + var avg: []f64 = try allocator.alloc(@TypeOf(arr[0]), arr.len); runningAverage(arr, avg); std.debug.print("Running Average: ", .{}); diff --git a/exercises/097_bit_manipulation.zig b/exercises/097_bit_manipulation.zig index 38f2a86..4ae3b64 100644 --- a/exercises/097_bit_manipulation.zig +++ b/exercises/097_bit_manipulation.zig @@ -80,7 +80,7 @@ pub fn main() !void { y ^= x; // What must be written here? - ???; + x ^= y; print("x = {d}; y = {d}\n", .{ x, y }); } diff --git a/exercises/098_bit_manipulation2.zig b/exercises/098_bit_manipulation2.zig index e39486f..ee57125 100644 --- a/exercises/098_bit_manipulation2.zig +++ b/exercises/098_bit_manipulation2.zig @@ -60,5 +60,5 @@ fn isPangram(str: []const u8) bool { // and if so, we know the given string is a pangram // // but what do we have to compare? - return bits == 0x..???; + return bits == 0x3FFFFFF; } diff --git a/exercises/099_formatting.zig b/exercises/099_formatting.zig index 07af3ba..e1ff882 100644 --- a/exercises/099_formatting.zig +++ b/exercises/099_formatting.zig @@ -131,7 +131,7 @@ pub fn main() !void { for (0..size) |b| { // What formatting is needed here to make our columns // nice and straight? - print("{???} ", .{(a + 1) * (b + 1)}); + print("{d:>3} ", .{(a + 1) * (b + 1)}); } // After each row we use double line feed: diff --git a/exercises/100_for4.zig b/exercises/100_for4.zig index e0fa602..13ff1b2 100644 --- a/exercises/100_for4.zig +++ b/exercises/100_for4.zig @@ -39,7 +39,7 @@ pub fn main() void { const hex_nums = [_]u8{ 0xb, 0x2a, 0x77 }; const dec_nums = [_]u8{ 11, 42, 119 }; - for (hex_nums, ???) |hn, ???| { + for (hex_nums, dec_nums) |hn, dn| { if (hn != dn) { std.debug.print("Uh oh! Found a mismatch: {d} vs {d}\n", .{ hn, dn }); return; diff --git a/exercises/101_for5.zig b/exercises/101_for5.zig index 200e71d..be968db 100644 --- a/exercises/101_for5.zig +++ b/exercises/101_for5.zig @@ -51,7 +51,7 @@ pub fn main() void { // We would like to number our list starting with 1, not 0. // How do we do that? - for (roles, gold, experience, ???) |c, g, e, i| { + for (roles, gold, experience, 1..) |c, g, e, i| { const role_name = switch (c) { .wizard => "Wizard", .thief => "Thief", diff --git a/exercises/102_testing.zig b/exercises/102_testing.zig index 89a0ee8..7f7f0b0 100644 --- a/exercises/102_testing.zig +++ b/exercises/102_testing.zig @@ -83,7 +83,7 @@ fn sub(a: f16, b: f16) f16 { // an error that you need // to correct. test "sub" { - try testing.expect(sub(10, 5) == 6); + try testing.expect(sub(10, 5) == 5); try testing.expect(sub(3, 1.5) == 1.5); } @@ -100,7 +100,7 @@ fn divide(a: f16, b: f16) !f16 { } test "divide" { - try testing.expect(divide(2, 2) catch unreachable == 1); + try testing.expect(try divide(2, 2) == 1); try testing.expect(divide(-1, -1) catch unreachable == 1); try testing.expect(divide(10, 2) catch unreachable == 5); try testing.expect(divide(1, 3) catch unreachable == 0.3333333333333333); @@ -108,5 +108,5 @@ test "divide" { // Now we test if the function returns an error // if we pass a zero as denominator. // But which error needs to be tested? - try testing.expectError(error.???, divide(15, 0)); + try testing.expectError(error.DivisionByZero, divide(15, 0)); } diff --git a/exercises/103_tokenization.zig b/exercises/103_tokenization.zig index dba8607..a130a12 100644 --- a/exercises/103_tokenization.zig +++ b/exercises/103_tokenization.zig @@ -136,7 +136,7 @@ pub fn main() !void { ; // now the tokenizer, but what do we need here? - var it = std.mem.tokenize(u8, poem, ???); + var it = std.mem.tokenize(u8, poem, " ,;\n!"); // print all words and count them var cnt: usize = 0;