mirror of
https://github.com/peter-tanner/advent-of-code-2021.git
synced 2024-11-30 11:10:20 +08:00
Day 5 solutions
This commit is contained in:
parent
ebe0a1c41a
commit
e547d91e82
133
5/5-1and2.c
Normal file
133
5/5-1and2.c
Normal file
|
@ -0,0 +1,133 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
// PART 2 - DIAGONAL_LINES
|
||||
#define PART_2
|
||||
|
||||
// SPACE
|
||||
|
||||
#define SPACE_SIZE 1000
|
||||
|
||||
typedef unsigned int **SPACE;
|
||||
|
||||
void print_space(SPACE space)
|
||||
{
|
||||
for (size_t i = 0; i < SPACE_SIZE; i++)
|
||||
{
|
||||
for (size_t j = 0; j < SPACE_SIZE; j++)
|
||||
{
|
||||
if (space[j][i] == 0)
|
||||
putchar('.');
|
||||
else
|
||||
printf("%d", space[j][i]);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
unsigned int count_intersections(SPACE space)
|
||||
{
|
||||
unsigned int count = 0;
|
||||
for (size_t i = 0; i < SPACE_SIZE; i++)
|
||||
{
|
||||
for (size_t j = 0; j < SPACE_SIZE; j++)
|
||||
{
|
||||
if (space[j][i] > 1)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
//
|
||||
// LINE
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
} LINE;
|
||||
|
||||
void swap(unsigned int *v1, unsigned int *v2)
|
||||
{
|
||||
unsigned int buf = *v1;
|
||||
*v1 = *v2;
|
||||
*v2 = buf;
|
||||
}
|
||||
|
||||
// void print_line(LINE *line)
|
||||
// {
|
||||
// printf("[%d,%d]->[%d,%d]\n", line->x1, line->y1, line->x2, line->y2);
|
||||
// }
|
||||
|
||||
#ifndef PART_2
|
||||
bool is_straight_line(LINE *line)
|
||||
{
|
||||
return line->x1 == line->x2 || line->y1 == line->y2;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool plot_line(LINE *line, SPACE space)
|
||||
{
|
||||
int dx = line->x2 - line->x1;
|
||||
#ifndef PART_2
|
||||
if (!is_straight_line(line)) //PART 1
|
||||
return false;
|
||||
#endif
|
||||
int dy = line->y2 - line->y1;
|
||||
if (dx == 0 || abs(dy / dx) > 1)
|
||||
{
|
||||
int b = line->x1 - dx / dy * line->y1;
|
||||
if (dy < 0)
|
||||
swap(&line->y1, &line->y2);
|
||||
for (int y = line->y1; y <= line->y2; y++)
|
||||
{
|
||||
int x = dx / dy * y + b;
|
||||
space[x][y]++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int b = line->y1 - dy / dx * line->x1;
|
||||
if (dx < 0)
|
||||
swap(&line->x1, &line->x2);
|
||||
for (int x = line->x1; x <= line->x2; x++)
|
||||
{
|
||||
int y = dy / dx * x + b;
|
||||
space[x][y]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void read_space_file(FILE *file, SPACE space)
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
LINE *line = calloc(1, sizeof(LINE));
|
||||
while (fscanf(file, "%d,%d -> %d,%d\n", &line->x1, &line->y1, &line->x2, &line->y2) == 4)
|
||||
{
|
||||
plot_line(line, space);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
FILE *p_file = fopen("input", "r");
|
||||
|
||||
// MAKE SPACE
|
||||
SPACE space = calloc(SPACE_SIZE, sizeof(unsigned int *));
|
||||
for (size_t i = 0; i < SPACE_SIZE; i++)
|
||||
{
|
||||
space[i] = calloc(SPACE_SIZE, sizeof(unsigned int));
|
||||
}
|
||||
//
|
||||
|
||||
read_space_file(p_file, space);
|
||||
print_space(space);
|
||||
printf("%d\n", count_intersections(space));
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user