aboutsummaryrefslogtreecommitdiff
path: root/exercises
diff options
context:
space:
mode:
authorDave Gauer <dave@ratfactor.com>2021-03-06 18:20:50 -0500
committerDave Gauer <dave@ratfactor.com>2021-03-06 18:20:50 -0500
commitda567348477e5de13f43dc5689e9ca34906c78f3 (patch)
treefda3d892da265dc49b648866ea38e473551654ce /exercises
parent71dd4ff1ae20dc54637198f9fa87c0fc27b33f55 (diff)
downloadziglings-da567348477e5de13f43dc5689e9ca34906c78f3.tar.gz
ziglings-da567348477e5de13f43dc5689e9ca34906c78f3.tar.bz2
ziglings-da567348477e5de13f43dc5689e9ca34906c78f3.tar.xz
ziglings-da567348477e5de13f43dc5689e9ca34906c78f3.zip
add ex52 slices
Diffstat (limited to 'exercises')
-rw-r--r--exercises/52_slices.zig49
1 files changed, 49 insertions, 0 deletions
diff --git a/exercises/52_slices.zig b/exercises/52_slices.zig
new file mode 100644
index 0000000..98177cd
--- /dev/null
+++ b/exercises/52_slices.zig
@@ -0,0 +1,49 @@
+//
+// We've seen that passing arrays around can be awkward. Perhaps you
+// remember a particularly horrendous function definition from quiz3?
+// This function can only take arrays that are exactly 4 items long!
+//
+// fn printPowersOfTwo(numbers: [4]u16) void { ... }
+//
+// That's the trouble with arrays - their size is part of the data
+// type and must be hard-coded into every usage of that type. This
+// digits array is a [10]u8 forever and ever:
+//
+// var digits = [10]u8{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+//
+// Thankfully, Zig has slices, which let you dynamically point to a
+// start item and provide a length. Here are slices of our digit
+// array:
+//
+// const foo = digits[0..1]; // 0
+// const bar = digits[3..9]; // 3 4 5 6 7 8
+// const all = digits[0..]; // 0 1 2 3 4 5 6 7 8 9
+//
+// As you can see, a slice [x..y] defines a first item by index x and
+// a length y (where y-1 is the index of the last item). Leaving y off
+// gives you the rest of the items.
+//
+// Notice that the type of a slice on an array of u8 items is []u8.
+//
+const std = @import("std");
+
+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[???];
+
+ std.debug.print("Hand1: ", .{});
+ printHand(hand1);
+
+ std.debug.print("Hand2: ", .{});
+ printHand(hand2);
+}
+
+// Please lend this function a hand. A u8 slice hand, that is.
+fn printHand(hand: ???) void {
+ for (hand) |h| {
+ std.debug.print("{u} ", .{h});
+ }
+}