1
0
aoc-2022/day10.c
2022-12-11 02:59:49 +02:00

127 lines
2.2 KiB
C

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "aoc.h"
typedef enum {
INST_TYPE_NOOP,
INST_TYPE_ADD,
} INST_TYPE;
typedef struct {
INST_TYPE type;
int amount;
} Instruction;
typedef struct {
Instruction *instructions;
int count;
} day10_Data;
static void *day10_parse(char **lines, int line_count)
{
day10_Data *data = malloc(sizeof(day10_Data));
data->count = line_count;
data->instructions = malloc(line_count * sizeof(Instruction));
for (int i = 0; i < line_count; i++) {
char *line = lines[i];
Instruction *inst = &data->instructions[i];
if (!strcmp(line, "noop")) {
inst->type = INST_TYPE_NOOP;
} else { // addx
inst->type = INST_TYPE_ADD;
inst->amount = atoi(line + 5);
}
}
return data;
}
static void day10_part1(void *p)
{
day10_Data *data = p;
int regx = 1;
int result = 0;
int inst_idx = 0;
int cycle = 0;
int add_timer = 0;
bool add_started = false;
while (inst_idx < data->count) {
Instruction *inst = &data->instructions[inst_idx];
if (!add_started) {
if (inst->type == INST_TYPE_NOOP) {
inst_idx++;
} else if (inst->type == INST_TYPE_ADD) {
add_started = true;
add_timer = 2;
}
}
cycle++;
if ((cycle - 20) % 40 == 0 && cycle <= 220) {
result += cycle*regx;
}
if (add_started) {
add_timer--;
if (add_timer == 0) {
add_started = false;
regx += inst->amount;
inst_idx++;
}
}
}
printf("%d\n", result);
}
static void day10_part2(void *p)
{
day10_Data *data = p;
int regx = 1;
int inst_idx = 0;
int cycle = 0;
int add_timer = 0;
bool add_started = false;
while (inst_idx < data->count) {
Instruction *inst = &data->instructions[inst_idx];
if (!add_started) {
if (inst->type == INST_TYPE_NOOP) {
inst_idx++;
} else if (inst->type == INST_TYPE_ADD) {
add_started = true;
add_timer = 2;
}
}
if (abs(cycle % 40 - regx) <= 1) {
printf("#");
} else {
printf(".");
}
cycle++;
if (add_started) {
add_timer--;
if (add_timer == 0) {
add_started = false;
regx += inst->amount;
inst_idx++;
}
}
if (cycle % 40 == 0) {
printf("\n");
}
}
}
ADD_SOLUTION(10, day10_parse, day10_part1, day10_part2);