Aleksei Dorokhov 7 mesi fa
parent
commit
92d79a15cb
4 ha cambiato i file con 138 aggiunte e 0 eliminazioni
  1. 3 0
      day3/.gitignore
  2. 23 0
      day3/build.zig
  3. 53 0
      day3/day3a.zig
  4. 59 0
      day3/day3b.zig

+ 3 - 0
day3/.gitignore

@@ -0,0 +1,3 @@
+input.txt
+.zig-cache
+zig-out

+ 23 - 0
day3/build.zig

@@ -0,0 +1,23 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) void {
+    const exe1 = b.addExecutable(.{
+        .name = "day3a",
+        .root_module = b.createModule(.{
+            .root_source_file = b.path("day3a.zig"),
+            .target = b.graph.host,
+        }),
+    });
+
+    b.installArtifact(exe1);
+
+    const exe2 = b.addExecutable(.{
+        .name = "day3b",
+        .root_module = b.createModule(.{
+            .root_source_file = b.path("day3b.zig"),
+            .target = b.graph.host,
+        }),
+    });
+    
+    b.installArtifact(exe2);
+}

+ 53 - 0
day3/day3a.zig

@@ -0,0 +1,53 @@
+const std = @import("std");
+
+const allocator = std.heap.page_allocator;
+
+
+
+fn findLargestDigitPos(batteryLine: []const u8) usize {
+    var largestPos: usize = 0;
+    var largestDigit: u8 = 0;
+
+    for (batteryLine, 0..) |digit, pos| {
+        if (digit > largestDigit) {
+            largestDigit = digit;
+            largestPos = pos;
+        }
+    }
+
+    return largestPos;
+}
+
+pub fn main() !void {
+    var printBuf: [1024]u8 = undefined;
+
+    const inputFile = try std.fs.cwd().openFile(
+        "input.txt",
+        .{
+            .mode = .read_only,
+        },
+    );
+    defer inputFile.close();
+
+    var inputFileBuffer: [1024]u8 = undefined;
+    var inputFileReader = inputFile.reader(&inputFileBuffer);
+    const inputFileSize = try inputFileReader.getSize();
+
+    const inputBuffer = try allocator.alloc(u8, inputFileSize);
+    try inputFileReader.interface.readSliceAll(inputBuffer);
+
+    var counter:u64 = 0;
+
+    var it = std.mem.tokenizeScalar(u8, inputBuffer, '\n');
+    while (it.next()) |batteryLine| {
+        const largestPos = findLargestDigitPos(batteryLine[0..batteryLine.len-1]);
+        const secondLargestPos = findLargestDigitPos(batteryLine[largestPos+1..]) + largestPos + 1;
+
+        counter += @intCast((batteryLine[largestPos] - '0') * 10 +
+                            (batteryLine[secondLargestPos] - '0'));
+    }
+
+    try std.fs.File.stdout().writeAll(
+      try std.fmt.bufPrint(&printBuf, "{}\n", .{counter}));
+}
+

+ 59 - 0
day3/day3b.zig

@@ -0,0 +1,59 @@
+const std = @import("std");
+
+var allocatorBuffer: [10*1024*1024]u8 = undefined;
+
+fn findLargestDigitPos(batteryLine: []const u8) usize {
+    var largestPos: usize = 0;
+    var largestDigit: u8 = 0;
+
+    for (batteryLine, 0..) |digit, pos| {
+        if (digit > largestDigit) {
+            largestDigit = digit;
+            largestPos = pos;
+        }
+    }
+
+    return largestPos;
+}
+
+pub fn main() !void {
+    var fb_alloc = std.heap.FixedBufferAllocator.init(&allocatorBuffer);
+    var allocator = fb_alloc.allocator();
+
+    var printBuf: [1024]u8 = undefined;
+
+    const inputFile = try std.fs.cwd().openFile(
+        "input.txt",
+        .{
+            .mode = .read_only,
+        },
+    );
+    defer inputFile.close();
+
+    var inputFileBuffer: [1024]u8 = undefined;
+    var inputFileReader = inputFile.reader(&inputFileBuffer);
+    const inputFileSize = try inputFileReader.getSize();
+
+    const inputBuffer = try allocator.alloc(u8, inputFileSize);
+    try inputFileReader.interface.readSliceAll(inputBuffer);
+
+    var counter:u64 = 0;
+
+    var it = std.mem.tokenizeScalar(u8, inputBuffer, '\n');
+    while (it.next()) |batteryLine| {
+        var joltage:u64 = 0;
+        var remainderLine = batteryLine;
+        for (0..12) |digitOffset| {
+            const minSuffix:usize = @intCast(12 - digitOffset - 1);
+            const largestPos = findLargestDigitPos(remainderLine[0..remainderLine.len-minSuffix]);
+            joltage *= 10;
+            joltage +=  remainderLine[largestPos] - '0';
+            remainderLine = remainderLine[largestPos+1..];
+        }
+        counter += joltage;
+    }
+
+    try std.fs.File.stdout().writeAll(
+      try std.fmt.bufPrint(&printBuf, "{}\n", .{counter}));
+}
+