Improve part 1 efficiency
This commit is contained in:
parent
45b25120e0
commit
89d248d3b8
1 changed files with 29 additions and 6 deletions
|
|
@ -2,7 +2,7 @@ const std = @import("std");
|
||||||
|
|
||||||
pub const title = "Day 02";
|
pub const title = "Day 02";
|
||||||
|
|
||||||
pub fn run(allocator: std.mem.Allocator) !void {
|
pub fn run(_: std.mem.Allocator) !void {
|
||||||
const input = @embedFile("./input/day02.txt");
|
const input = @embedFile("./input/day02.txt");
|
||||||
var ranges = std.mem.tokenizeScalar(u8, input, ',');
|
var ranges = std.mem.tokenizeScalar(u8, input, ',');
|
||||||
|
|
||||||
|
|
@ -18,13 +18,17 @@ pub fn run(allocator: std.mem.Allocator) !void {
|
||||||
std.debug.print("{d} to {d}\n", .{start, end});
|
std.debug.print("{d} to {d}\n", .{start, end});
|
||||||
|
|
||||||
outer: for (start..end+1) |id| {
|
outer: for (start..end+1) |id| {
|
||||||
const id_s = try std.fmt.allocPrint(allocator, "{}", .{id});
|
// IDs smaller than 10 cannot possibly have repeated digits
|
||||||
defer allocator.free(id_s);
|
if (id / 10 == 0) continue;
|
||||||
|
|
||||||
if (id_s.len % 2 == 1) continue;
|
const len = getLen(id);
|
||||||
|
// Uneven numbers cannot consist of 2 sequences
|
||||||
|
if (len % 2 == 1) continue;
|
||||||
|
|
||||||
for (0..id_s.len / 2) |i| {
|
for (0..len / 2) |i| {
|
||||||
if (id_s[i] != id_s[i + id_s.len / 2]) {
|
const a = getDigit(id, i);
|
||||||
|
const b = getDigit(id, i + len / 2);
|
||||||
|
if (a != b) {
|
||||||
continue :outer;
|
continue :outer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -41,3 +45,22 @@ pub fn run(allocator: std.mem.Allocator) !void {
|
||||||
try stdout.flush();
|
try stdout.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn getDigit(x: u64, n: usize) u8 {
|
||||||
|
var new_x = x;
|
||||||
|
for (0..n) |_| {
|
||||||
|
new_x /= 10;
|
||||||
|
}
|
||||||
|
return @intCast(new_x % 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getLen(x: u64) usize {
|
||||||
|
var new_x = x;
|
||||||
|
var n: usize = 0;
|
||||||
|
while (true) {
|
||||||
|
n += 1;
|
||||||
|
new_x /= 10;
|
||||||
|
if (new_x == 0) break;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue