diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-06-16 21:27:36 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-16 21:27:36 +0100 |
| commit | d017964c3a86583b2bc4ea7fd6f3d1f1b88e4b00 (patch) | |
| tree | 2160ef6a129cce0f55ed7ff9f0642ec827a5567a | |
| parent | 577ab81f446233a46e28f105cca154375d150ce1 (diff) | |
| parent | c9462a291535bf1694af25f7bd71e0902f7e1f09 (diff) | |
| download | perlweeklychallenge-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.zig | 37 | ||||
| -rw-r--r-- | challenge-117/luc65r/zig/ch-2.zig | 77 |
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(); +} |
