Overview
| Comment: | 202408 1st star |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
6c8d6b453fa1f933f6155a2e8c3a51c0 |
| User & Date: | nnz on 2024-12-08 16:02:59.297 |
| Other Links: | manifest | tags |
Context
|
2024-12-08
| ||
| 17:11 | 202408 2nd star check-in: 9395df6993 user: nnz tags: trunk | |
| 16:02 | 202408 1st star check-in: 6c8d6b453f user: nnz tags: trunk | |
| 15:25 | 202408 found the antinodes; counting to do check-in: ce30145a0d user: nnz tags: trunk | |
Changes
Modified Makefile
from [5fd029b772]
to [e5558dd887].
|
| | | 1 2 3 4 5 6 7 8 | all: aocdbg aoc aocclang aoctcc clean: rm aocdbg aoc aocclang aoctcc aocdbg: *.c *.h gcc -std=c99 -pedantic -pedantic-errors \ -Werror -Wall -Wextra \ |
| ︙ | ︙ |
Modified aoc2024.c
from [ffa5f1e4f3]
to [98ee960fa7].
| ︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* === aoc202408 =======================================================
Oh! another square of text!
Idea: for all points p with an antenna find all points q>p with
a corresponding frequency. For each such pair calculate the 2 antinodes
and add the resulting points (if not there already) to an array.
The answer to Part One is the number of elements in the array
===================================================================== */
void aoc202408(char *data, size_t len) {
(void)len; // unused argument
struct TextGrid tg;
tg.data = data;
tg.cols = strchr(data, '\n') - data + 1;
tg.rows = tg.cols - 1; // rows includes the '\n'
| > > > > > > > > < | < < | | | | < < | | > | < | | < < < < | > | < < < < < < | < < < < < | | < < < < | | | > | | < < | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
/* === aoc202408 =======================================================
Oh! another square of text!
Idea: for all points p with an antenna find all points q>p with
a corresponding frequency. For each such pair calculate the 2 antinodes
and add the resulting points (if not there already) to an array.
The answer to Part One is the number of elements in the array
===================================================================== */
static unsigned *antinode_find(unsigned (*a)[2], size_t n,
unsigned col, unsigned row) {
for (size_t k = 0; k < n; k++) {
if ((a[k][0] == col) && (a[k][1] == row)) return a[k];
}
return NULL;
}
void aoc202408(char *data, size_t len) {
(void)len; // unused argument
struct TextGrid tg;
tg.data = data;
tg.cols = strchr(data, '\n') - data + 1;
tg.rows = tg.cols - 1; // rows includes the '\n'
unsigned anti[512][2]; // locations of antinodes; col at index 0, row at 1
unsigned nanti = 0;
char *p = data;
while (*p) {
while ((*p == '.') || (*p == '\n')) p++;
if (*p) {
// p points to an antenna
unsigned prow = TGrow(&tg, p), pcol = TGcol(&tg, p);
char *q = strchr(p+1, *p);
while (q) {
// q points to an antenna of the same type as p
unsigned qrow = TGrow(&tg, q), qcol = TGcol(&tg, q);
int deltarow = (int)qrow - (int)prow;
int deltacol = (int)qcol - (int)pcol;
int anticol = (int)pcol - deltacol;
int antirow = (int)prow - deltarow;
if (TGvalid(&tg, (unsigned)anticol, (unsigned)antirow) && (*TGcharptr(&tg, (unsigned)anticol, (unsigned)antirow) != '\n')) {
unsigned *ff = antinode_find(anti, nanti, (unsigned)anticol, (unsigned)antirow);
if (!ff) {
anti[nanti][0] = (unsigned)anticol;
anti[nanti++][1] = (unsigned)antirow;
}
}
anticol = (int)qcol + deltacol;
antirow = (int)qrow + deltarow;
if (TGvalid(&tg, (unsigned)anticol, (unsigned)antirow) && (*TGcharptr(&tg, (unsigned)anticol, (unsigned)antirow) != '\n')) {
unsigned *ff = antinode_find(anti, nanti, (unsigned)anticol, (unsigned)antirow);
if (!ff) {
anti[nanti][0] = (unsigned)anticol;
anti[nanti++][1] = (unsigned)antirow;
}
}
q = strchr(q+1, *p); // next antenna of this type
}
p += 1;
}
}
printf("There are %u antinodes within the map.\n", nanti);
}
/* === aoc202407 =======================================================
Part one looks easy
Part two also easy
===================================================================== */
|
| ︙ | ︙ |
Modified aocutils.c
from [462345b34b]
to [e6035b6b40].
1 2 3 4 5 | #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include "aocutils.h" | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "aocutils.h"
bool TGvalid(struct TextGrid *tg, unsigned col, unsigned row) {
if (row >= tg->rows) return false;
if (col >= tg->cols) return false;
return true;
}
char *TGcharptr(struct TextGrid *tg, unsigned col, unsigned row) {
if (!TGvalid(tg, col, row)) return NULL;
return tg->data + (row * tg->cols) + col;
}
unsigned TGcol(struct TextGrid *tg, char *p) {
return (p - tg->data) % tg->cols;
}
unsigned TGrow(struct TextGrid *tg, char *p) {
return (p - tg->data) / tg->cols;
|
| ︙ | ︙ |
Modified aocutils.h
from [8f6a78c0fe]
to [11e9112422].
1 2 3 4 5 6 |
#ifndef AOCUTILS_H_INCLUDED
#define AOCUTILS_H_INCLUDED
#include <stdbool.h>
struct TextGrid {
| | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#ifndef AOCUTILS_H_INCLUDED
#define AOCUTILS_H_INCLUDED
#include <stdbool.h>
struct TextGrid {
unsigned cols, rows;
char *data; // may have '\n' at end of rows
};
bool TGvalid(struct TextGrid *tg, unsigned col, unsigned row);
char *TGcharptr(struct TextGrid *tg, unsigned col, unsigned row);
unsigned TGcol(struct TextGrid *tg, char *p);
unsigned TGrow(struct TextGrid *tg, char *p);
size_t linearize2d(unsigned width, unsigned row, unsigned col); // TODO
size_t text2array(unsigned **dst, const char *txt);
size_t slurp(char **dst, const char *filename);
unsigned distance(unsigned a, unsigned b);
|
| ︙ | ︙ |