const std = @import("std"); const fs = std.fs; const fmt = std.fmt; fn asc(context: void, a: i32, b: i32) bool { return a > b; } pub fn task1(input: []i32) i32 { std.sort.sort(i32, input, {}, asc); var i: usize = 0; while (i < input.len - 1) : (i+=1) { var j: usize = i + 1; while (j < input.len - 1) : (j+=1) { if (input[i]+input[j] == 2020) { return input[i] * input[j]; } } } return -1; } pub fn task2(input: []i32) i32 { std.sort.sort(i32, input, {}, asc); var i: usize = 0; while (i < input.len - 1) : (i+=1) { var j: usize = i + 1; while (j < input.len - 1) : (j+=1) { var k: usize = j + 1; while (k < input.len - 1) : (k+=1) { if (input[i]+input[j]+input[k] == 2020) { return input[i] * input[j] * input[k]; } } } } return -1; } pub fn main() !void { const stdout = std.io.getStdOut().writer(); var buffer: [1024]u8 = undefined; const allocator = &std.heap.FixedBufferAllocator.init(&buffer).allocator; const file = try fs.cwd().openFile("input.txt", fs.File.OpenFlags{ .read = true, }); defer file.close(); var input = std.ArrayList(i32).init(allocator); const reader = file.reader(); while (true) { const data = reader .readUntilDelimiterAlloc(std.heap.page_allocator, '\n', 32) catch break; try input.append(try fmt.parseInt(i32, data, 10)); } var result = task1(input.items); try stdout.print("Task 1: {}\n", .{result}); result = task2(input.items); try stdout.print("Task 2: {}\n", .{result}); }