const std = @import("std"); const print = std.debug.print; pub fn solve(part: []u8, reader: *std.Io.Reader, _: std.mem.Allocator) !void { if (std.mem.eql(u8, part, "1")) { try part1(reader); } else { try part2(reader); } } fn digits(number: usize) usize { var value = number; var n: usize = 0; while (value != 0) : (value /= 10) { n += 1; } return n; } fn part1(reader: *std.Io.Reader) !void { var output: usize = 0; while (reader.takeDelimiter(',')) |line| { const trimmed = std.mem.trimRight(u8, line.?, &[_]u8{'\n'}); if (trimmed.len == 0) break; var split = std.mem.splitScalar(u8, trimmed, '-'); var start = try std.fmt.parseInt(usize, split.next().?, 10); const end = try std.fmt.parseInt(usize, split.next().?, 10); while (start <= end): (start += 1) { const n = digits(start); if (n % 2 == 0 and start % std.math.pow(usize, 10,n/2) == start / std.math.pow(usize, 10,n/2)) { output += start; start += std.math.pow(usize, 2,n/2); } } } else |_| { } print("{d}\n", .{output}); } fn part2(reader: *std.Io.Reader) !void { var output: usize = 0; while (reader.takeDelimiter(',')) |line| { const trimmed = std.mem.trimRight(u8, line.?, &[_]u8{'\n'}); if (trimmed.len == 0) break; var split = std.mem.splitScalar(u8, trimmed, '-'); var start = try std.fmt.parseInt(usize, split.next().?, 10); const end = try std.fmt.parseInt(usize, split.next().?, 10); while (start <= end): (start += 1) { const n = digits(start); for (1..n) |i| { if (n % i == 0) { const p: usize = std.math.pow(usize, 10,i); if (start % p != 0) { const div = start / (start % p); var c: usize = 0; for (0..n/i - 1) |_| { c *= p; c += p; } c += 1; if (div == c){ output += start; start += std.math.pow(usize, 2, n/2); break; } } } } } } else |_| { } print("{d}\n", .{output}); }