advent2025

Advent of Code 2025 Solutions
git clone git://bsandro.tech/advent2025
Log | Files | Refs | LICENSE

commit 9e218d4783dc432e405a84c993f919178022bbe2
parent 7fd372e83bd54861fc4e26e8cc1ebba8b9f427ba
Author: bsandro <email@bsandro.tech>
Date:   Thu, 11 Dec 2025 19:15:17 +0200

day11 p2 does not work yet

Diffstat:
Mday11.c | 109++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 77 insertions(+), 32 deletions(-)

diff --git a/day11.c b/day11.c @@ -1,15 +1,18 @@ #include <stdio.h> #include <string.h> +#include <strings.h> #include <stdbool.h> +#include <stdlib.h> #include "cputime.h" #define NAME_LEN 4 -#define MAX_NODES 600 +#define MAX_NODES 100000 typedef struct Node { char name[NAME_LEN]; int adj_l; - struct Node *adj[32]; + int adj[32]; + bool visited; } Node; typedef struct { @@ -27,68 +30,110 @@ Node * find(Nodes *nodes, char name[4]) { return n; } -Node * find_or_create(Nodes *nodes, char name[4]) { - Node *n = find(nodes, name); - if (n!=NULL) return n; - n = &nodes->nodes[nodes->cnt++]; +int find_index(Nodes *nodes, char name[4]) { + for (int i=0;i<nodes->cnt;++i) { + if (strncmp(name, nodes->nodes[i].name, NAME_LEN-1)==0) { + return i; + } + } + return -1; +} + +int get_index(Nodes *nodes, Node *node) { + for (int i=0;i<nodes->cnt;++i) { + if (&nodes->nodes[i]==node) { + return i; + } + } + return -1; +} + +int find_or_create(Nodes *nodes, char name[4]) { + int idx = find_index(nodes, name); + if (idx!=-1) return idx; + idx = nodes->cnt++; + Node *n = &nodes->nodes[idx]; strcpy(n->name, name); - return n; + return idx; } -int bfs1(Nodes *nodes) { +int bfs(Nodes *nodes) { int num = 0; - Node *start = find(nodes, "you"); - Node *end = find(nodes, "out"); - Node *queue[MAX_NODES] = {0}; + int start = find_index(nodes, "you"); + int end = find_index(nodes, "out"); + int queue[MAX_NODES] = {0}; int front = 0; int back = 0; queue[back++] = start; while (front<back) { - Node *cur = queue[front++]; + int cur = queue[front++]; if (cur==end) num++; - for (int i=0;i<cur->adj_l;++i) { - queue[back++] = cur->adj[i]; + Node *cur_node = &nodes->nodes[cur]; + for (int i=0;i<cur_node->adj_l;++i) { + queue[back++] = cur_node->adj[i]; } } return num; } -int bfs2(Nodes *nodes) { +int dfs_walk(Nodes *nodes, int idx) { + int end = find_index(nodes, "out"); + int dac = find_index(nodes, "dac"); + int fft = find_index(nodes, "fft"); + if (idx==end) { + if (nodes->nodes[dac].visited&&nodes->nodes[fft].visited) return 1; + else return 0; + } + Node *n = &nodes->nodes[idx]; + n->visited = true; int num = 0; - Node *start = find(nodes, "you"); - Node *end = find(nodes, "out"); - Node *queue[MAX_NODES] = {0}; - int front = 0; - int back = 0; - queue[back++] = start; - while (front<back) { - Node *cur = queue[front++]; - if (cur==end) num++; - for (int i=0;i<cur->adj_l;++i) { - queue[back++] = cur->adj[i]; - } + for (int i=0;i<n->adj_l;++i) { + num += dfs_walk(nodes, 0); + } + n->visited = false; + return num; +} + +int dfs(Nodes *nodes) { + int num = 0; + Node *start = find(nodes, "svr"); + for (int i=0;i<start->adj_l;++i) { + num += dfs_walk(nodes, start->adj[i]); } return num; } +void print_nodes(Nodes *nodes) { + printf("%d nodes\n", nodes->cnt); + for (int i=0;i<nodes->cnt;++i) { + printf("(%d) [%s] -> ", i, nodes->nodes[i].name); + for (int j=0;j<nodes->nodes[i].adj_l;++j) { + printf("[%d:%s]", nodes->nodes[i].adj[j], nodes->nodes[nodes->nodes[i].adj[j]].name); + } + printf("\n"); + } +} + int main(void) { char buf[NAME_LEN]; int buf_l = 0; - Nodes nodes = {0}; + Nodes *nodes = malloc(sizeof(Nodes)); + bzero(nodes, sizeof(Nodes)); Node *node = NULL; for (int c=getchar();c!=EOF;c=getchar()) { if (c>='a'&&c<='z') buf[buf_l++] = c; else if (c==':') { - node = find_or_create(&nodes, buf); + node = &nodes->nodes[find_or_create(nodes, buf)]; buf_l = 0; } else if (c=='\n'||(c==' '&&buf_l>0)) { - node->adj[node->adj_l++] = find_or_create(&nodes, buf); + node->adj[node->adj_l++] = find_or_create(nodes, buf); buf_l = 0; if (c=='\n') node = NULL; } } - int p1 = bfs1(&nodes); - printf("p1: %d\n", p1); + int p1 = bfs(nodes); + int p2 = 0;//dfs(nodes); + printf("p1: %d\np2: %d\n", p1, p2); return 0; }