summary refs log tree commit diff homepage
path: root/2019/day06.c
blob: fbfda57fdaa73c40fb593013918199c95d41e5ed (plain) (blame)
1
2
3
4
5
6
7
8
9
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static struct Node {
	char name[4];
	size_t parent;
} tree[2048];

static size_t node(const char *name) {
	size_t i;
	for (i = 0; tree[i].name[0]; ++i) {
		if (strcmp(name, tree[i].name)) continue;
		return i;
	}
	strncpy(tree[i].name, name, sizeof(tree[i].name));
	return i;
}

static size_t ancestors(size_t i) {
	size_t n = 0;
	while (i) {
		i = tree[i].parent;
		n++;
	}
	return n;
}

int main(void) {
	node("COM");
	char parent[4], child[4];
	while (EOF != scanf("%3s)%3s\n", parent, child)) {
		tree[node(child)].parent = node(parent);
	}
	size_t orbits = 0;
	for (size_t i = 0; tree[i].name[0]; ++i) {
		orbits += ancestors(i);
	}
	printf("%zu\n", orbits);
}