Compare commits
14 Commits
5cdaee7420
...
d12d5a677c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d12d5a677c | ||
|
|
af15995fc7 | ||
|
|
c245fd663a | ||
|
|
3c0ecf6910 | ||
|
|
fabedb4a24 | ||
|
|
b1fcca9d82 | ||
|
|
a47dfe1f4d | ||
|
|
90d05995b5 | ||
|
|
54f743ba43 | ||
|
|
87b258d0a9 | ||
|
|
6b29634279 | ||
|
|
c2dcaf3099 | ||
|
|
468e3d7eed | ||
|
|
26978cb2d3 |
@ -16,6 +16,6 @@
|
||||
//
|
||||
const std = @import("std");
|
||||
|
||||
fn main() void {
|
||||
pub fn main() void {
|
||||
std.debug.print("Hello world!\n", .{});
|
||||
}
|
||||
|
||||
@ -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", .{});
|
||||
|
||||
@ -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: u19 = 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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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.
|
||||
//
|
||||
|
||||
@ -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 });
|
||||
|
||||
@ -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});
|
||||
|
||||
@ -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
|
||||
@ -30,13 +30,14 @@ pub fn main() void {
|
||||
// 'lang' array we just created by indexing the array
|
||||
// 'letters' with the variable 'x'. As you can see above, x=1
|
||||
// to begin with.
|
||||
//x = 1;
|
||||
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});
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub fn main() void {
|
||||
const foo = 1;
|
||||
const foo = true;
|
||||
|
||||
// Please fix this condition:
|
||||
if (foo) {
|
||||
|
||||
@ -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});
|
||||
}
|
||||
|
||||
@ -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});
|
||||
|
||||
|
||||
@ -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});
|
||||
}
|
||||
|
||||
@ -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});
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(":-| ", .{});
|
||||
|
||||
@ -25,13 +25,14 @@ 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.
|
||||
const i_u32: u32 = @intCast(i);
|
||||
const place_value = std.math.pow(u32, 2, i_u32);
|
||||
value += place_value * bit;
|
||||
// std.debug.print( "The current value is: {}.\n", .{place_value});
|
||||
}
|
||||
|
||||
std.debug.print("The value of bits '1101': {}.\n", .{value});
|
||||
|
||||
@ -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(", ", .{});
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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: 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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -19,8 +19,7 @@ const std = @import("std");
|
||||
const MyNumberError = error{TooSmall};
|
||||
|
||||
pub fn main() void {
|
||||
var my_number: ??? = 5;
|
||||
|
||||
var my_number: MyNumberError!usize = 5;
|
||||
// Looks like my_number will need to either store a number OR
|
||||
// an error. Can you set the type correctly above?
|
||||
my_number = MyNumberError.TooSmall;
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -53,13 +53,19 @@ fn fixTooBig(n: u32) MyNumberError!u32 {
|
||||
}
|
||||
|
||||
fn fixTooSmall(n: u32) MyNumberError!u32 {
|
||||
return detectProblems(n) catch |err| {
|
||||
if (err == MyNumberError.TooSmall) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
return err;
|
||||
};
|
||||
// Oh dear, this is missing a lot! But don't worry, it's nearly
|
||||
// identical to fixTooBig() above.
|
||||
//
|
||||
// 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) ???;
|
||||
}
|
||||
|
||||
fn detectProblems(n: u32) MyNumberError!u32 {
|
||||
|
||||
@ -25,9 +25,7 @@ pub fn main() void {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@ -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", .{});
|
||||
}
|
||||
|
||||
@ -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 ", .{});
|
||||
}
|
||||
|
||||
@ -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", .{});
|
||||
|
||||
@ -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!
|
||||
|
||||
|
||||
@ -46,6 +46,9 @@ 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("?", .{});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +31,9 @@ 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 => {
|
||||
return std.debug.print("!", .{});
|
||||
},
|
||||
};
|
||||
|
||||
std.debug.print("{c}", .{real_char});
|
||||
|
||||
@ -35,6 +35,9 @@ pub fn main() void {
|
||||
3 => {
|
||||
current_value *= current_value;
|
||||
},
|
||||
else => {
|
||||
unreachable;
|
||||
},
|
||||
}
|
||||
|
||||
std.debug.print("{} ", .{current_value});
|
||||
|
||||
@ -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. "
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,10 +9,16 @@ 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 = try getNumber();
|
||||
|
||||
// if (my_num) |value| {
|
||||
// stdout("ZIG! {!}", .{value});
|
||||
// } else |err| switch (err) {
|
||||
// NumError.IllegalNumber => 42,
|
||||
// }
|
||||
|
||||
try stdout.print("my_num={}\n", .{my_num});
|
||||
}
|
||||
|
||||
@ -41,12 +41,12 @@ pub fn main() void {
|
||||
|
||||
for (hex_nums, ???) |hn, ???| {
|
||||
if (hn != dn) {
|
||||
std.debug.print("Uh oh! Found a mismatch: {d} vs {d}\n", .{ hn, dn });
|
||||
print("Uh oh! Found a mismatch: {d} vs {d}\n", .{ hn, dn });
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
std.debug.print("Arrays match!\n", .{});
|
||||
print("Arrays match!\n", .{});
|
||||
}
|
||||
//
|
||||
// You are perhaps wondering what happens if one of the two lists
|
||||
|
||||
@ -40,7 +40,7 @@ pub fn main() !void {
|
||||
// okay, seems like a threat of violence is not the answer in this case
|
||||
// can you go here to find a way to read the content?
|
||||
// https://ziglang.org/documentation/master/std/#std.fs.File
|
||||
// hint: you might find two answers that are both vaild in this case
|
||||
// hint: you might find two answers that are both valid in this case
|
||||
const bytes_read = zig_read_the_file_or_i_will_fight_you(&content);
|
||||
|
||||
// Woah, too screamy. I know you're excited for zigling time but tone it down a bit.
|
||||
|
||||
@ -15,11 +15,11 @@
|
||||
// 1 => { op = 2; continue; },
|
||||
// 2 => { op = 3; continue; },
|
||||
// 3 => return,
|
||||
// 4 => {},
|
||||
// else => {},
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// std.debug.print("This statement cannot be reached");
|
||||
// std.debug.print("This statement cannot be reached\n", .{});
|
||||
// }
|
||||
//
|
||||
// By combining all we've learned so far, we can now proceed with a labeled switch
|
||||
@ -36,7 +36,7 @@
|
||||
// 3 => return,
|
||||
// else => {},
|
||||
// }
|
||||
// std.debug.print("This statement cannot be reached");
|
||||
// std.debug.print("This statement cannot be reached\n", .{});
|
||||
// }
|
||||
//
|
||||
// The flow of execution on this second case is:
|
||||
@ -45,13 +45,12 @@
|
||||
// to re-evaluate the labeled switch again, now providing the value '2';
|
||||
// 3. In the case '2' we repeat the same pattern as case '1'
|
||||
// but instead the value to be evaluated is now '3';
|
||||
// 4. Finally we get to case '3', where we return from the function as a whole.
|
||||
// 5. In this example as the input has no clear exhaustive patterns but a essentially
|
||||
// any u8 integer, we need do need to handle any case that is not explicitly handled
|
||||
// by using the `else => {}` branch as a default case.
|
||||
// 4. Finally we get to case '3', where we return from the function as a whole,
|
||||
// so the debug statement is never executed.
|
||||
// 5. In this example, since the input does not have clear, exhaustive patterns and
|
||||
// can essentially be any 'u8' integer, we need to handle all cases not explicitly
|
||||
// covered by using the 'else => {}' branch as the default case.
|
||||
//
|
||||
// Since step 4 or a break stament do not exist in this switch, the debug statement is
|
||||
// never executed
|
||||
//
|
||||
const std = @import("std");
|
||||
|
||||
|
||||
@ -7,5 +7,5 @@
|
||||
- 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 });
|
||||
print("Uh oh! Found a mismatch: {d} vs {d}\n", .{ hn, dn });
|
||||
return;
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
- // can you go here to find a way to read the content?
|
||||
+ // can you go here to find a way to read the content ?
|
||||
// https://ziglang.org/documentation/master/std/#std.fs.File
|
||||
// hint: you might find two answers that are both vaild in this case
|
||||
// hint: you might find two answers that are both valid in this case
|
||||
- const bytes_read = zig_read_the_file_or_i_will_fight_you(&content);
|
||||
+ const bytes_read = try file.read(&content);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user