From 451d82f90a59e5360751e7f97d82a99d45b331e6 Mon Sep 17 00:00:00 2001 From: Lucas Ransan Date: Tue, 15 Jun 2021 11:55:11 +0200 Subject: Zig week 117 task 1 --- challenge-117/luc65r/zig/ch-1.zig | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 challenge-117/luc65r/zig/ch-1.zig 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; +} -- cgit From c9462a291535bf1694af25f7bd71e0902f7e1f09 Mon Sep 17 00:00:00 2001 From: Lucas Ransan Date: Tue, 15 Jun 2021 15:08:12 +0200 Subject: Zig week 117 task 2 --- challenge-117/luc65r/zig/ch-2.zig | 77 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 challenge-117/luc65r/zig/ch-2.zig 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(); +} -- cgit