From 516e6ed4a9066fa43d6159b2a0ec58416ab28013 Mon Sep 17 00:00:00 2001 From: xander Date: Sun, 7 Dec 2025 13:12:06 +0100 Subject: solve up to day 7 --- src/day02.zig | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/day02.zig (limited to 'src/day02.zig') diff --git a/src/day02.zig b/src/day02.zig new file mode 100644 index 0000000..f764589 --- /dev/null +++ b/src/day02.zig @@ -0,0 +1,78 @@ +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}); +} -- cgit v1.2.3