/ src / days / day1.zig
day1.zig
 1  const std = @import("std");
 2  const mem = std.mem;
 3  
 4  const input = @embedFile("inputs/day01.txt");
 5  
 6  pub fn run(alloc: mem.Allocator, progress: *std.Progress.Node) !void {
 7      const n1 = progress.start("Parsing", 0);
 8  
 9      const parsed = try parse(alloc, input);
10      defer parsed.deinit();
11  
12      n1.end();
13  
14      const n2 = progress.start("Running", 0);
15      defer n2.end();
16  
17      std.mem.sort(u64, parsed.items, .{}, BiggerThan(u64).sort);
18  
19      std.log.info("Result Part 1: {}", .{parsed.items[0]});
20      std.log.info("Result Part 2: {}", .{parsed.items[0] + parsed.items[1] + parsed.items[2]});
21  }
22  
23  pub fn parse(alloc: mem.Allocator, buffer: []const u8) !std.ArrayList(u64) {
24      var ret = std.ArrayList(u64).init(alloc);
25  
26      var idx: usize = 0;
27      var block_iter = std.mem.splitSequence(u8, buffer, "\n");
28      while (block_iter.next()) |block| {
29          if (std.mem.eql(u8, block, "")) {
30              idx += 1;
31              try ret.append(0);
32              continue;
33          }
34  
35          const cal = try std.fmt.parseUnsigned(u64, block, 0);
36          if (ret.popOrNull()) |current| {
37              try ret.insert(idx, current + cal);
38          } else {
39              try ret.insert(idx, cal);
40          }
41      }
42  
43      return ret;
44  }
45  
46  fn BiggerThan(comptime T: type) type {
47      return struct {
48          fn sort(_: @TypeOf(.{}), lhs: T, rhs: T) bool {
49              return lhs > rhs;
50          }
51      };
52  }
53  
54  test "test" {
55      const testing = std.testing;
56  
57      const test_input =
58          \\1000
59          \\2000
60          \\3000
61          \\
62          \\4000
63          \\
64          \\5000
65          \\6000
66          \\
67          \\7000
68          \\8000
69          \\9000
70          \\
71          \\10000
72      ;
73  
74      const parsed = try parse(testing.allocator, test_input);
75      defer parsed.deinit();
76  
77      std.mem.sort(u64, parsed.items, .{}, BiggerThan(u64).sort);
78  
79      try testing.expectEqual(parsed.items[0], 24000);
80  }