#include #include #include "../../lib/aoc.h" int volume(int length, int width, int height) { return length * width * height; } int ribbon_length(int length, int width, int height) { int first_perimeter = (length + width) * 2; int second_perimeter = (length + height) * 2; int third_perimeter = (height + width) * 2; int smallest_perimeter = first_perimeter; if (second_perimeter < smallest_perimeter) smallest_perimeter = second_perimeter; if (third_perimeter < smallest_perimeter) smallest_perimeter = third_perimeter; return smallest_perimeter + volume(length, width, height); } int surface_area(int length, int width, int height) { int first_side = length * width * 2; int second_side = length * height * 2; int third_side = height * width * 2; int smallest_side = first_side; if (second_side < smallest_side) smallest_side = second_side; if (third_side < smallest_side) smallest_side = third_side; return first_side + second_side + third_side + (smallest_side / 2); } int main() { char *input = aoc_read_input(); int paper = 0; int ribbon = 0; char *tok = strtok(input, "x"); while (tok != NULL) { int l = atoi(tok); tok = strtok(NULL, "x"); int w = atoi(tok); tok = strtok(NULL, "\n"); int h = atoi(tok); paper += surface_area(l, w, h); ribbon += ribbon_length(l, w, h); tok = strtok(NULL, "x"); } printf("Part 1: %d\n", paper); printf("Part 1: %d\n", ribbon); free(input); }