const std = @import("std"); const Range = struct { begin: u64, end: u64 }; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); var stdin_buffer: [1024]u8 = undefined; var stdin_reader = std.fs.File.stdin().reader(&stdin_buffer); const stdin = &stdin_reader.interface; const allocator = gpa.allocator(); var ranges = try std.ArrayList(Range).initCapacity(allocator, 1); defer ranges.deinit(allocator); while (try stdin.takeDelimiter(',')) |range_str| { const range_str_trimmed = std.mem.trim(u8, range_str, "\n"); var it = std.mem.splitScalar(u8, range_str_trimmed, '-'); const begin = try std.fmt.parseInt(u64, it.next().?, 10); const end = try std.fmt.parseInt(u64, it.next().?, 10); const range = Range{ .begin = begin, .end = end }; try ranges.append(allocator, range); } var i: u64 = 1; var task1: u64 = 0; var task2: u64 = 0; var founds = try std.ArrayList(u64).initCapacity(allocator, 1); defer founds.deinit(allocator); while (i < 1000000) : (i += 1) { var n: u64 = i; var digits: u64 = 0; var number: u64 = i; while (n != 0) { digits += 1; n /= 10; } // doubles for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { task1 += number; var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } number = 0; // Triples if (i < 10000) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 4s if (i < 1000) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 5s if (i < 1000) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 6s if (i < 100) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 7s if (i < 100) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 8s if (i < 100) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 9s if (i < 100) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 10s if (i < 100) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 11s if (i < 10) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; // 12s if (i < 10) { for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (0..digits) |_| { number *= 10; } number += i; for (ranges.items) |range| { if (number <= range.end and number >= range.begin) { var f = false; for (founds.items) |found| { if (found == number) { f = true; break; } } if (!f) { task2 += number; try founds.append(allocator, number); } break; } } } number = 0; } std.debug.print("{d}\n", .{task1}); std.debug.print("{d}\n", .{task2}); }