Skip to content

Instantly share code, notes, and snippets.

@sotolf2
Created May 15, 2024 07:42
Show Gist options
  • Save sotolf2/9e18ca887ca9d7b1d26669ff78d6ac44 to your computer and use it in GitHub Desktop.
Save sotolf2/9e18ca887ca9d7b1d26669ff78d6ac44 to your computer and use it in GitHub Desktop.
const std = @import("std");
const mem = std.mem;
const fs = std.fs;
const sort = std.sort;
const print = std.debug.print;
fn getLines(path: []const u8, allocator: mem.Allocator) !std.ArrayList(u32) {
const file = try fs.cwd().openFile(path, .{});
defer file.close();
var buf_reader = std.io.bufferedReader(file.reader());
const reader = buf_reader.reader();
var nums = std.ArrayList(u32).init(allocator);
var line = std.ArrayList(u8).init(allocator);
defer line.deinit();
const writer = line.writer();
try reader.streamUntilDelimiter(writer, '\n', null);
var it = mem.split(u8, line.items, ",");
while (it.next()) |str| {
try nums.append(try std.fmt.parseInt(u32, str, 10));
}
return nums;
}
fn part1(nums: std.ArrayList(u32)) !void {
var res: u32 = 0;
mem.sort(u32, nums.items, {}, sort.asc(u32));
const median = nums.items[nums.items.len / 2];
for (nums.items) |num| {
res += if (num > median) num - median else median - num;
}
print("Part1: {d}\n", .{res});
}
fn part2(nums: std.ArrayList(u32)) !void {
var res: usize = 0;
var sum: u32 = 0;
for (nums.items) |num| {
sum += num;
}
const average = sum / nums.items.len;
for (nums.items) |num| {
var cost: usize = 0;
const to_move = if (num > average) num - average else average - num;
for (0..to_move + 1) |i| {
cost += i;
}
res += cost;
}
print("part2: {d}\n", .{res});
}
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const alloc = gpa.allocator();
const filename = "day07.txt";
const input = try getLines(filename, alloc);
defer input.deinit();
try part1(input);
try part2(input);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment