From 1318a10f15db6ac8606615021d26b2ff84f56be4 Mon Sep 17 00:00:00 2001 From: javalsai Date: Mon, 2 Dec 2024 18:53:23 +0100 Subject: [PATCH] day 2 ;( --- .gitignore | 14 +++++++++ 2024/02/p1/main.zig | 37 ++++++++++++++++++++++++ 2024/02/p2/main.zig | 69 +++++++++++++++++++++++++++++++++++++++++++++ 2024/02/p2/test.zig | 44 +++++++++++++++++++++++++++++ README.md | 8 ++++++ 5 files changed, 172 insertions(+) create mode 100644 .gitignore create mode 100644 2024/02/p1/main.zig create mode 100644 2024/02/p2/main.zig create mode 100644 2024/02/p2/test.zig create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a2fa89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# inputs +demo.txt +input.txt + +# binaries +main +test + +# object files +*.o + +# zig... +.zig-cache +*.log diff --git a/2024/02/p1/main.zig b/2024/02/p1/main.zig new file mode 100644 index 0000000..3d502c9 --- /dev/null +++ b/2024/02/p1/main.zig @@ -0,0 +1,37 @@ +const std = @import("std"); + +pub fn main() !void { + var file = try std.fs.cwd() + .openFile("../input.txt", .{}); + defer file.close(); + + var buf_reader = std.io.bufferedReader(file.reader()); + var in_stream = buf_reader.reader(); + + var buf: [64]u8 = undefined; + var t: u32 = 0; + while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| { + var split_iter = std.mem.split(u8, line, " "); + + var dir: i8 = 0; + var prev = try std.fmt.parseInt(i8, split_iter.next() orelse unreachable, 10); + t += while (split_iter.next()) |strnum| { + const n = try std.fmt.parseInt(i8, strnum, 10); + const d = prev - n; + prev = n; + if (d == 0 or @abs(d) > 3) + break 0; + + if (dir == 0) { + dir = d; + } else if (!sameSign(dir, d)) { + break 0; + } + } else 1; + } + std.debug.print("Total {d}\n", .{t}); +} + +pub fn sameSign(n1: i8, n2: i8) bool { + return (n1 < 0) == (n2 < 0); +} diff --git a/2024/02/p2/main.zig b/2024/02/p2/main.zig new file mode 100644 index 0000000..0d68e9d --- /dev/null +++ b/2024/02/p2/main.zig @@ -0,0 +1,69 @@ +const std = @import("std"); + +pub fn main() !void { + var file = try std.fs.cwd() + .openFile("../input.txt", .{}); + defer file.close(); + + var buf_reader = std.io.bufferedReader(file.reader()); + var in_stream = buf_reader.reader(); + + var buf: [64]u8 = undefined; + var t: u32 = 0; + out: while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| { + var split_iter = std.mem.split(u8, line, " "); + const first_res = try check_list(&split_iter, null); + if (first_res != null) { + var res: ?usize = first_res; + var fail: usize = 0; + while (res != null) { + if (res.? < fail) { + // std.debug.print(".. {s}\n", .{line}); + continue :out; + } + var split_iter_l = std.mem.split(u8, line, " "); + res = try check_list(&split_iter_l, fail); + fail += 1; + } + } + + t += 1; + } + std.debug.print("Total {d}\n", .{t}); +} + +pub fn sameSign(n1: i8, n2: i8) bool { + return (n1 < 0) == (n2 < 0); +} + +// null if everythin alr +// idx num of failure otherwise +pub fn check_list(iter: *std.mem.SplitIterator(u8, .sequence), skip: ?usize) !?usize { + var dir: i8 = 0; + var i: usize = 0; + if (skip != null and skip.? == 0) { + _ = iter.next(); + i = 1; + } + var prev = try std.fmt.parseInt(i8, iter.next().?, 10); + while (iter.next()) |strnum| { + i += 1; + if (skip != null and skip.? == i) { + continue; + } + const n = try std.fmt.parseInt(i8, strnum, 10); + // std.debug.print("i={d} prev={} sk={any} n={}\n", .{ i, prev, skip, n }); + const d = prev - n; + if (d == 0 or @abs(d) > 3) { + return i; + } + + if (dir == 0) { + dir = d; + } else if (!sameSign(dir, d)) { + return i; + } + prev = n; + } + return null; +} diff --git a/2024/02/p2/test.zig b/2024/02/p2/test.zig new file mode 100644 index 0000000..e84a232 --- /dev/null +++ b/2024/02/p2/test.zig @@ -0,0 +1,44 @@ +const std = @import("std"); + +pub fn main() !void { + const line = "50 29 30 31 34 35 37"; + var iter = std.mem.split(u8, line, " "); + const res = check_list(&iter, 0); + std.debug.print("{any}\n", .{res}); +} + +pub fn sameSign(n1: i8, n2: i8) bool { + return (n1 < 0) == (n2 < 0); +} + +// null if everythin alr +// idx num of failure otherwise +pub fn check_list(iter: *std.mem.SplitIterator(u8, .sequence), skip: ?usize) !?usize { + var dir: i8 = 0; + var i: usize = 0; + if (skip != null and skip.? == 0) { + _ = iter.next(); + i = 1; + } + var prev = try std.fmt.parseInt(i8, iter.next().?, 10); + while (iter.next()) |strnum| { + i += 1; + if (skip != null and skip.? == i) { + continue; + } + const n = try std.fmt.parseInt(i8, strnum, 10); + std.debug.print("i={d} prev={} sk={any} n={}\n", .{ i, prev, skip, n }); + const d = prev - n; + if (d == 0 or @abs(d) > 3) { + return i; + } + + if (dir == 0) { + dir = d; + } else if (!sameSign(dir, d)) { + return i; + } + prev = n; + } + return null; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..3cbb8aa --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# AOC +What is AOC??: [adventofcode](https://adventofcode.com) + +All this is a mix of langs, but in general: +* `asm`: I use nasm, at least for now for assembly programs (linux, x86\_64), no special linking normallly, so just elf64 compile and link. +* `zig`: No need to set up a full project, simply `zig build-exe -fstrip -OReleaseFast main.zig` + +I also tend to use `perf stat` to check their performance.