const std = @import("std"); const List = std.ArrayList; // Can't be bothered to read the file dynamically const data = @embedFile("inputs/puzzle.txt"); const numbers = [_][]const u8{ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", }; const Digit = struct { pos: usize, val: u8, }; fn digit_position(_: void, a: Digit, b: Digit) bool { return a.pos < b.pos; } pub fn main() !void { const alloc = std.heap.page_allocator; const stdout = std.io.getStdOut().writer(); var lines = std.mem.tokenizeSequence(u8, data, "\n"); var sum: u32 = 0; while (lines.next()) |line| { var digits = List(Digit).init(alloc); defer digits.deinit(); for (line, 0..) |byte, idx| { if (std.ascii.isDigit(byte)) { const digit = try std.fmt.charToDigit(byte, 10); try digits.append(.{ .pos = idx, .val = digit }); } } var line_idx: usize = 0; while (line_idx < line.len) { const cur = line[line_idx..]; for (numbers, 1..) |number, digit| { if (std.mem.startsWith(u8, cur, number)) { try digits.append(.{ .pos = line_idx, .val = @intCast(digit) }); } } line_idx += 1; } const sorted = try digits.toOwnedSlice(); std.mem.sort(Digit, sorted, {}, digit_position); const first = sorted[0].val; const last = sorted[sorted.len - 1].val; const val = (first * 10) + last; sum += val; } try stdout.print("{}\n", .{sum}); }