Merge branch 'master' of https://gitea.benno-lorenz.com/bennolor/aoc25
This commit is contained in:
1
puzzle_input/day2.txt
Normal file
1
puzzle_input/day2.txt
Normal file
@@ -0,0 +1 @@
|
||||
16100064-16192119,2117697596-2117933551,1-21,9999936269-10000072423,1770-2452,389429-427594,46633-66991,877764826-877930156,880869-991984,18943-26512,7216-9427,825-1162,581490-647864,2736-3909,39327886-39455605,430759-454012,1178-1741,219779-244138,77641-97923,1975994465-1976192503,3486612-3602532,277-378,418-690,74704280-74781349,3915-5717,665312-740273,69386294-69487574,2176846-2268755,26-45,372340114-372408052,7996502103-7996658803,7762107-7787125,48-64,4432420-4462711,130854-178173,87-115,244511-360206,69-86
|
||||
74
src/days/day2.zig
Normal file
74
src/days/day2.zig
Normal file
@@ -0,0 +1,74 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub fn day2pt1(ranges: []const u8) !usize {
|
||||
var i = std.mem.splitScalar(u8, ranges, ',');
|
||||
var sum: usize = 0;
|
||||
while (i.next()) |range| {
|
||||
var j = std.mem.splitScalar(u8, range, '-');
|
||||
const range_start = try std.fmt.parseInt(usize, j.next().?, 10);
|
||||
const range_end = try std.fmt.parseInt(usize, j.next().?, 10);
|
||||
|
||||
var k = range_start;
|
||||
const max_len = 32;
|
||||
var buf: [max_len]u8 = undefined;
|
||||
while (k <= range_end) {
|
||||
const current_id = try std.fmt.bufPrint(&buf, "{d}", .{k});
|
||||
if (current_id.len % 2 == 0) {
|
||||
const half = current_id.len / 2;
|
||||
if (std.mem.eql(u8, current_id[0..half], current_id[half..current_id.len])) {
|
||||
sum += k;
|
||||
}
|
||||
}
|
||||
k += 1;
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
pub fn day2pt2(ranges: []const u8) !usize {
|
||||
var i = std.mem.splitScalar(u8, ranges, ',');
|
||||
var sum: usize = 0;
|
||||
while (i.next()) |range| {
|
||||
var j = std.mem.splitScalar(u8, range, '-');
|
||||
const range_start = try std.fmt.parseInt(usize, j.next().?, 10);
|
||||
const range_end = try std.fmt.parseInt(usize, j.next().?, 10);
|
||||
|
||||
var k = range_start;
|
||||
const max_len = 32;
|
||||
var buf: [max_len]u8 = undefined;
|
||||
while (k <= range_end) {
|
||||
const current_id = try std.fmt.bufPrint(&buf, "{d}", .{k});
|
||||
const len = current_id.len;
|
||||
var found = false;
|
||||
// Try all possible substring lengths that divide the length - should be made more efficient (>人<;)
|
||||
for (1..len / 2 + 1) |sub_len| {
|
||||
if (len % sub_len != 0) continue;
|
||||
const repeats = len / sub_len;
|
||||
if (repeats < 2) continue;
|
||||
const sub = current_id[0..sub_len];
|
||||
var valid = true;
|
||||
for (1..repeats) |r| {
|
||||
if (!std.mem.eql(u8, sub, current_id[r * sub_len .. (r + 1) * sub_len])) {
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (valid) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
sum += k;
|
||||
}
|
||||
k += 1;
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
test "Day 2 example testing" {
|
||||
const example_input = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124";
|
||||
try std.testing.expectEqual(try day2pt1(example_input), 1227775554);
|
||||
try std.testing.expectEqual(try day2pt2(example_input), 4174379265);
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
const std = @import("std");
|
||||
const loadpuzzle = @import("utils/loadpuzzle.zig");
|
||||
const day1 = @import("days/day1.zig");
|
||||
const day2 = @import("days/day2.zig");
|
||||
|
||||
pub fn main() !void {
|
||||
// Prints to stderr, ignoring potential errors.
|
||||
@@ -12,6 +13,12 @@ pub fn main() !void {
|
||||
const day1_input = try loadpuzzle.readFile(gpa, "puzzle_input/day1.txt");
|
||||
std.debug.print("Day 1 Part 1: {any}\n", .{try day1.day1pt1(day1_input)});
|
||||
std.debug.print("Day 1 Part 2: {any}\n", .{try day1.day1pt2(day1_input)});
|
||||
gpa.free(day1_input);
|
||||
|
||||
const day2_input = try loadpuzzle.readFile(gpa, "puzzle_input/day2.txt");
|
||||
std.debug.print("Day 2 Part 1: {any}\n", .{try day2.day2pt1(day2_input)});
|
||||
std.debug.print("Day 2 Part 1: {any}\n", .{try day2.day2pt2(day2_input)});
|
||||
gpa.free(day2_input);
|
||||
}
|
||||
|
||||
test "simple test" {
|
||||
|
||||
Reference in New Issue
Block a user