1const std = @import("std");
2
3pub fn run(input: []u8) !void {
4 var ranges = std.mem.tokenizeScalar(u8, std.mem.trimEnd(u8, input, "\n"), ',');
5
6 var answer1: u64 = 0;
7 var answer2: u64 = 0;
8 while (ranges.next()) |range_str| {
9 var range = std.mem.tokenizeScalar(u8, range_str, '-');
10
11 const low = try std.fmt.parseInt(u64, range.next().?, 10);
12 const high = try std.fmt.parseInt(u64, range.next().?, 10);
13
14 var buf: [32]u8 = undefined;
15 for (low..high + 1) |num| {
16 const num_str = try std.fmt.bufPrint(&buf, "{d}", .{num});
17
18 const middle = num_str.len / 2;
19
20 if (std.mem.eql(u8, num_str[0..middle], num_str[middle..])) {
21 answer1 += num;
22 answer2 += num;
23 continue;
24 }
25
26 for (1..middle + 1) |chunk_len| {
27 const repeating_str = num_str[0..chunk_len];
28
29 var is_repeating = true;
30 var i = chunk_len;
31 while (i + chunk_len <= num_str.len) : (i += chunk_len) {
32 if (num_str.len % chunk_len != 0) {
33 is_repeating = false;
34 break;
35 }
36
37 if (!std.mem.eql(u8, repeating_str, num_str[i .. i + chunk_len])) {
38 is_repeating = false;
39 break;
40 }
41 }
42
43 if (is_repeating) {
44 answer2 += num;
45 break;
46 }
47 }
48 }
49 }
50
51 std.debug.print("Answer P1: {d}\n", .{answer1});
52 std.debug.print("Answer P2: {d}\n", .{answer2});
53}