This repository has been archived on 2020-12-19. You can view files and clone it, but cannot push or open issues or pull requests.
aoc2020/day1/main.zig

95 lines
3.1 KiB
Zig

const std = @import("std");
pub fn main() !void {
var allocator = std.heap.GeneralPurposeAllocator(.{}){};
var f = std.fs.File { .handle = try std.os.open("input-part1", std.os.O_RDONLY, 0) };
var buffer : [1024]u8 = undefined;
var expenses = std.ArrayList(u32).init(&allocator.allocator);
defer expenses.deinit();
var byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
defer byte_buffer.deinit();
var read = try f.read(&buffer);
std.log.info("Read {} bytes", .{read});
while (read != 0) {
for (buffer) | v, k | {
if (std.ascii.isDigit(v)) {
try byte_buffer.append(v);
}
if (v == '\n') {
var x = atoi(byte_buffer.items[0..]);
//std.log.debug("{}", .{x});
try expenses.append(x);
// Set the position back to zero, without freeing existing memory
byte_buffer.deinit();
byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
}
}
read = try f.read(&buffer);
//std.log.info("Read {} bytes", .{read});
}
//std.log.info("{}", .{expenses.items.len});
part1(expenses.items[0..]);
part2(expenses.items[0..]);
}
fn part2(expenses : []u32) void {
var i : u32 = 0;
var elements : [3]u32 = undefined;
while (i < expenses.len) : (i += 1) {
var j : u32 = 0;
while (j < expenses.len) : (j += 1) {
var k : u32 = 0;
while (k < expenses.len) : (k += 1) {
if (k == j or k == 1) {
continue;
}
if (expenses[i] + expenses[j] + expenses[k] == 2020) {
elements[0] = expenses[i];
elements[1] = expenses[j];
elements[2] = expenses[k];
}
}
}
}
std.log.info("{} and {} and {} sum to {} and multiply to {}",
.{elements[0], elements[1], elements[2], elements[0] + elements[1] + elements[2],
elements[0] * elements[1] * elements[2]});
}
fn part1(expenses : []u32) void {
var i : u32 = 0;
var elements : [2]u32 = undefined;
while (i < expenses.len) : (i += 1) {
var j : u32 = 0;
while (j < expenses.len) : (j += 1) {
if (i == j) {
continue;
}
if (expenses[i] + expenses[j] == 2020) {
elements[0] = expenses[i];
elements[1] = expenses[j];
}
}
}
std.log.info("{} and {} sum to {} and multiply to {}",
.{elements[0], elements[1], elements[0] + elements[1],
elements[0] * elements[1]});
}
fn atoi(a: []u8) u32 {
var i : u32 = 0;
for(a) |v, k| {
if (! std.ascii.isDigit(v)) {
std.log.warn("Byte {x} is not a digit", .{v});
continue;
}
// 48 is '0' in ascii
std.debug.assert(v >= 48 and v < 58);
i += @as(u32, (v - 48) * std.math.pow(u32, 10, @intCast(u32, a.len - k - 1)));
}
//std.log.debug("{x} --> {}", .{a, i});
return i;
}