Best attempt at part 2. Did not finish.
This commit is contained in:
179
08/08-part2.c
Normal file
179
08/08-part2.c
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define DEFAULT_FILE "input.txt"
|
||||||
|
#define STRBUF_LEN 300
|
||||||
|
#define ISDIGIT(X) (X >= '0' && X <= '9')
|
||||||
|
#define NUM_AS 200
|
||||||
|
|
||||||
|
#define HASHMAP_SIZE 17576 // 26 * 26 * 26
|
||||||
|
|
||||||
|
typedef struct _node
|
||||||
|
{
|
||||||
|
char letters[3];
|
||||||
|
int left;
|
||||||
|
int right;
|
||||||
|
} node;
|
||||||
|
|
||||||
|
int hashnode(char *str)
|
||||||
|
{
|
||||||
|
bool err = false;
|
||||||
|
|
||||||
|
if (str[0] < 'A' || str[0] > 'Z') err = true;
|
||||||
|
if (str[1] < 'A' || str[1] > 'Z') err = true;
|
||||||
|
if (str[2] < 'A' || str[2] > 'Z') err = true;
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
printf("Error in hashnode!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int first = str[0] - 'A';
|
||||||
|
int second = str[1] - 'A';
|
||||||
|
int third = str[2] - 'A';
|
||||||
|
return (first * 26 * 26) + (second * 26) + third;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool all_zs(node *nodes, int *as, int numas)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < numas; i++)
|
||||||
|
{
|
||||||
|
int current_hash = as[i];
|
||||||
|
node current_node = nodes[current_hash];
|
||||||
|
if (current_node.letters[2] != 'Z') return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count_jumps_to_zzz(char *lrbuf, int start, node *nodes)
|
||||||
|
{
|
||||||
|
int instructionidx = 0;
|
||||||
|
int currenthash = start;
|
||||||
|
int numjumps = 0;
|
||||||
|
|
||||||
|
while(currenthash != HASHMAP_SIZE - 1)
|
||||||
|
{
|
||||||
|
if (lrbuf[instructionidx] != 'L' && lrbuf[instructionidx] != 'R') instructionidx = 0;
|
||||||
|
bool is_left = lrbuf[instructionidx] == 'L';
|
||||||
|
instructionidx++;
|
||||||
|
|
||||||
|
currenthash = is_left ? nodes[currenthash].left : nodes[currenthash].right;
|
||||||
|
numjumps++;
|
||||||
|
}
|
||||||
|
return numjumps;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count_jumps_endsin_z(char *lrbuf, int start, node *nodes)
|
||||||
|
{
|
||||||
|
int instructionidx = 0;
|
||||||
|
int currenthash = start;
|
||||||
|
int numjumps = 0;
|
||||||
|
|
||||||
|
while(nodes[currenthash].letters[2] != 'Z')
|
||||||
|
{
|
||||||
|
if (lrbuf[instructionidx] != 'L' && lrbuf[instructionidx] != 'R') instructionidx = 0;
|
||||||
|
bool is_left = lrbuf[instructionidx] == 'L';
|
||||||
|
instructionidx++;
|
||||||
|
|
||||||
|
currenthash = is_left ? nodes[currenthash].left : nodes[currenthash].right;
|
||||||
|
numjumps++;
|
||||||
|
}
|
||||||
|
return numjumps;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count_jumps_to_cycle(char *lrbuf, int start, node *nodes)
|
||||||
|
{
|
||||||
|
int instructionidx = 0;
|
||||||
|
int currenthash = start;
|
||||||
|
int numjumps = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (lrbuf[instructionidx] != 'L' && lrbuf[instructionidx] != 'R') instructionidx = 0;
|
||||||
|
bool is_left = lrbuf[instructionidx] == 'L';
|
||||||
|
instructionidx++;
|
||||||
|
|
||||||
|
currenthash = is_left ? nodes[currenthash].left : nodes[currenthash].right;
|
||||||
|
numjumps++;
|
||||||
|
}
|
||||||
|
while(currenthash != start);
|
||||||
|
|
||||||
|
return numjumps;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
// Get filename as an argument, if there is one
|
||||||
|
char *path = (argc > 1) ? argv[1] : DEFAULT_FILE;
|
||||||
|
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
printf("Requires input file.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *file = fopen(path, "r");
|
||||||
|
char strbuf[STRBUF_LEN] = {0};
|
||||||
|
char lrbuf[STRBUF_LEN] = {0};
|
||||||
|
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
printf("Could not find file.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin Challenge
|
||||||
|
|
||||||
|
node nodes[HASHMAP_SIZE];
|
||||||
|
int start_hashes[NUM_AS];
|
||||||
|
|
||||||
|
fgets(lrbuf, STRBUF_LEN, file);
|
||||||
|
fgets(strbuf, STRBUF_LEN, file);
|
||||||
|
|
||||||
|
while(fgets(strbuf, STRBUF_LEN, file))
|
||||||
|
{
|
||||||
|
node current;
|
||||||
|
int hash = hashnode(strbuf);
|
||||||
|
int left = hashnode(strbuf + 7);
|
||||||
|
int right = hashnode(strbuf + 12);
|
||||||
|
|
||||||
|
memcpy(nodes[hash].letters, strbuf, sizeof(char) * 3);
|
||||||
|
nodes[hash].left = left;
|
||||||
|
nodes[hash].right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
int numas = 0;
|
||||||
|
for (i = 0; i < HASHMAP_SIZE; i += 26)
|
||||||
|
{
|
||||||
|
if (nodes[i].letters[2] != 'A') continue;
|
||||||
|
start_hashes[numas] = i;
|
||||||
|
numas++;
|
||||||
|
printf("Start: %c%c%c\n", nodes[i].letters[0], nodes[i].letters[1], nodes[i].letters[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int instructionidx = 0;
|
||||||
|
uint64_t numjumps = 0;
|
||||||
|
while (!all_zs(nodes, start_hashes, numas))
|
||||||
|
{
|
||||||
|
if (lrbuf[instructionidx] != 'L' && lrbuf[instructionidx] != 'R') instructionidx = 0;
|
||||||
|
bool is_left = lrbuf[instructionidx] == 'L';
|
||||||
|
instructionidx++;
|
||||||
|
|
||||||
|
for (i = 0; i < numas; i++)
|
||||||
|
{
|
||||||
|
int current_hash = start_hashes[i];
|
||||||
|
start_hashes[i] = is_left ? nodes[current_hash].left : nodes[current_hash].right;
|
||||||
|
}
|
||||||
|
numjumps++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Numjumps: %lu\n", numjumps);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
10
08/input4.txt
Normal file
10
08/input4.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
LR
|
||||||
|
|
||||||
|
CCA = (AAB, XXX)
|
||||||
|
AAB = (XXX, AAZ)
|
||||||
|
AAZ = (AAB, XXX)
|
||||||
|
BBA = (BBB, XXX)
|
||||||
|
BBB = (BBC, BBC)
|
||||||
|
BBC = (BBZ, BBZ)
|
||||||
|
BBZ = (BBB, BBB)
|
||||||
|
XXX = (XXX, XXX)
|
||||||
Reference in New Issue
Block a user