Wow Zig is hard. Day 1 done
commit
851c774c23
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,91 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub fn main() !void {
|
||||
const file = try std.fs.cwd().openFile("./data.txt", .{});
|
||||
defer file.close();
|
||||
|
||||
var buffer: [40000]u8 = undefined;
|
||||
_ = try file.readAll(&buffer);
|
||||
|
||||
var it = std.mem.split(u8, &buffer, "\n");
|
||||
|
||||
var total1: u64 = 0;
|
||||
var total2: u64 = 0;
|
||||
|
||||
while (it.next()) |line| {
|
||||
std.debug.print("line: {s}\n", .{line});
|
||||
if (!std.ascii.isAlphanumeric(line[0])) {
|
||||
continue;
|
||||
}
|
||||
var first: ?u8 = null;
|
||||
var last: ?u8 = null;
|
||||
|
||||
// Part 1
|
||||
for (line, 0..) |char, idx| {
|
||||
if (std.ascii.isDigit(char)) {
|
||||
var str = line[idx .. idx + 1];
|
||||
const parsed = try std.fmt.parseInt(u8, str, 10);
|
||||
|
||||
if (first == null) {
|
||||
first = parsed;
|
||||
}
|
||||
last = parsed;
|
||||
}
|
||||
}
|
||||
|
||||
total1 += (first orelse 0) * 10 + (last orelse 0);
|
||||
|
||||
first = null;
|
||||
last = null;
|
||||
|
||||
// Part 2
|
||||
for (line, 0..) |_, idx| {
|
||||
if (matchDigit(line[idx..line.len])) |parsed| {
|
||||
std.debug.print("parsed: {any}\n", .{parsed});
|
||||
|
||||
if (first == null) {
|
||||
first = parsed;
|
||||
}
|
||||
last = parsed;
|
||||
}
|
||||
}
|
||||
|
||||
total2 += (first orelse 0) * 10 + (last orelse 0);
|
||||
}
|
||||
|
||||
std.debug.print("part 1 total: {any}\n", .{total1});
|
||||
std.debug.print("part 2 total: {any}\n", .{total2});
|
||||
}
|
||||
|
||||
pub fn matchDigit(str: []const u8) ?u8 {
|
||||
// is the first char a digit? if so, return it
|
||||
if (std.ascii.isDigit(str[0])) {
|
||||
const digit = std.fmt.parseInt(u8, str[0..1], 10) catch 0;
|
||||
return digit;
|
||||
} else {
|
||||
const words = [_][]const u8{ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
|
||||
|
||||
for (words, 0..) |word, idx| {
|
||||
if (startsWith(str, word)) {
|
||||
return @intCast(idx + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// does the outer string start with the inner string
|
||||
pub fn startsWith(outer: []const u8, inner: []const u8) bool {
|
||||
if (outer.len < inner.len) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (inner, 0..) |c, idx| {
|
||||
if (c != outer[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
1abc2
|
||||
pqr3stu8vwx
|
||||
a1b2c3d4e5f
|
||||
treb7uchet
|
@ -0,0 +1,7 @@
|
||||
two1nine
|
||||
eightwothree
|
||||
abcone2threexyz
|
||||
xtwone3four
|
||||
4nineeightseven2
|
||||
zoneight234
|
||||
7pqrstsixteen
|
Loading…
Reference in New Issue