aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-06-16 21:27:36 +0100
committerGitHub <noreply@github.com>2021-06-16 21:27:36 +0100
commitd017964c3a86583b2bc4ea7fd6f3d1f1b88e4b00 (patch)
tree2160ef6a129cce0f55ed7ff9f0642ec827a5567a
parent577ab81f446233a46e28f105cca154375d150ce1 (diff)
parentc9462a291535bf1694af25f7bd71e0902f7e1f09 (diff)
downloadperlweeklychallenge-club-d017964c3a86583b2bc4ea7fd6f3d1f1b88e4b00.tar.gz
perlweeklychallenge-club-d017964c3a86583b2bc4ea7fd6f3d1f1b88e4b00.tar.bz2
perlweeklychallenge-club-d017964c3a86583b2bc4ea7fd6f3d1f1b88e4b00.zip
Merge pull request #4282 from luc65r/117
Challenge 117 in Zig
-rw-r--r--challenge-117/luc65r/zig/ch-1.zig37
-rw-r--r--challenge-117/luc65r/zig/ch-2.zig77
2 files changed, 114 insertions, 0 deletions
diff --git a/challenge-117/luc65r/zig/ch-1.zig b/challenge-117/luc65r/zig/ch-1.zig
new file mode 100644
index 0000000000..974edf2d02
--- /dev/null
+++ b/challenge-117/luc65r/zig/ch-1.zig
@@ -0,0 +1,37 @@
+const std = @import("std");
+const File = std.fs.File;
+
+pub fn main() !void {
+ const stdout = std.io.getStdOut().writer();
+ const argv = std.os.argv;
+
+ const file = try switch (argv.len) {
+ 1 => std.io.getStdIn(),
+ 2 => try std.fs.cwd().openFileZ(argv[1], File.OpenFlags{}),
+ else => error.InvalidArguments,
+ };
+ defer file.close();
+
+ try stdout.print("{}\n", .{try findMissing(&file)});
+}
+
+fn findMissing(file: *const File) !u32 {
+ const in = file.reader();
+ var buf: [10]u8 = undefined;
+
+ var min: u32 = std.math.maxInt(u32);
+ var max: u32 = 0;
+ var sum: u32 = 0;
+
+ while (try in.readUntilDelimiterOrEof(buf[0..], ',')) |number| {
+ var n = try std.fmt.parseInt(u32, number, 10);
+ sum += n;
+ if (n < min) min = n;
+ if (n > max) max = n;
+
+ try in.skipUntilDelimiterOrEof('\n');
+ }
+
+ const sumWithoutMissing = @divExact((max - min + 1) * (max + min), 2);
+ return sumWithoutMissing - sum;
+}
diff --git a/challenge-117/luc65r/zig/ch-2.zig b/challenge-117/luc65r/zig/ch-2.zig
new file mode 100644
index 0000000000..dc513778ad
--- /dev/null
+++ b/challenge-117/luc65r/zig/ch-2.zig
@@ -0,0 +1,77 @@
+const std = @import("std");
+const Allocator = std.mem.Allocator;
+
+const stdout = std.io.getStdOut().writer();
+var bufferedStdout = std.io.bufferedWriter(stdout);
+const bufout = bufferedStdout.writer();
+
+const Move = enum {
+ horizontal,
+ left,
+ right,
+
+ fn toChar(self: Move) u8 {
+ return switch (self) {
+ Move.horizontal => 'H',
+ Move.left => 'L',
+ Move.right => 'R',
+ };
+ }
+};
+
+const Position = struct {
+ y: u32,
+ x: u32,
+
+ fn isBottomRight(self: Position) bool {
+ return self.y == 0 and self.x == 0;
+ }
+
+ fn move(self: Position, m: Move) ?Position {
+ return switch (m) {
+ Move.horizontal => .{
+ .y = self.y,
+ .x = if (self.x > 0) self.x - 1 else return null,
+ },
+ Move.left => .{
+ .y = if (self.y > 0) self.y - 1 else return null,
+ .x = self.x + 1,
+ },
+ Move.right => .{
+ .y = if (self.y > 0) self.y - 1 else return null,
+ .x = self.x,
+ },
+ };
+ }
+
+ fn printDirs(self: Position, dirs: []u8, depth: u32) anyerror!void {
+ if (self.isBottomRight()) {
+ try bufout.print("{s}\n", .{dirs[0..depth]});
+ return;
+ }
+
+ for ([_]Move{ Move.horizontal, Move.left, Move.right }) |m| {
+ const pos = self.move(m) orelse continue;
+ dirs[depth] = m.toChar();
+ try pos.printDirs(dirs, depth + 1);
+ }
+ }
+};
+
+pub fn main() !void {
+ const argv = std.os.argv;
+ if (argv.len != 2)
+ return error.InvalidArguments;
+
+ const size = try std.fmt.parseInt(u32, std.mem.span(argv[1]), 10);
+
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ defer arena.deinit();
+ const allocator = &arena.allocator;
+
+ const position = Position{ .y = size, .x = 0 };
+
+ var dirs = try allocator.alloc(u8, 2 * size);
+ try position.printDirs(dirs, 0);
+ try bufferedStdout.flush();
+}