Files
dobiadi c76afe8679 Day2
2025-12-03 20:14:41 +01:00

601 lines
15 KiB
Zig

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});
}