#include "common.h" #include namespace aoc2022 { struct crate { static crate* cs[9]; char value; crate* prev = nullptr; crate* next = nullptr; static void init() { for (int i = 0; i < 9; i++) { cs[i] = new crate; cs[i]->value = 0; cs[i]->prev = cs[i]; cs[i]->next = cs[i]; } } static crate* make(line_view lv) { crate* c = new crate; c->value = *(lv.line + 1); return c; } static crate* take(int i) { crate* c = cs[i]->next; c->next->prev = cs[i]; cs[i]->next = c->next; return c; } static void print(int i) { printf("%d: \"",i); crate* c = cs[i]->prev; while (c != cs[i]) { printf("%c", c->value); c = c->prev; } printf("\""); // c = cs[i]->next; // while (c != cs[i]) { // printf("%c", c->value); // c = c->next; // } printf("\n"); } static void add(crate* c, int i) { if (c->value >= 'A' && c->value <= 'Z') { cs[i]->prev->next = c; c->prev = cs[i]->prev; c->next = cs[i]; cs[i]->prev = c; // printf("add %c on %d\n", c->value, i); } } static void put(crate* c, int i) { if (c->value >= 'A' && c->value <= 'Z') { cs[i]->next->prev = c; c->next = cs[i]->next; c->prev = cs[i]; cs[i]->next = c; } } static void message(char *m) { for (int i = 0; i < 9; i++) { *m = cs[i]->next->value; m++; } } static void move(line_view lv, int mode) { int d[3] = {0}; int* p = d; const char *p0 = lv.line + 5; while (p0 < lv.line + lv.length) { if (*p0 >= '0' && *p0 <= '9') { *p = *p * 10 + *p0 - '0'; } else { char c = *(p0 - 1); if (c >= '0' && c <= '9') { p++; } } p0++; } d[1] -= 1; d[2] -= 1; if (mode == 1) { while (d[0]-- > 0) { crate* c = take(d[1]); put(c, d[2]); } } if (mode == 2) { std::stack dx; while(d[0]-- > 0) { dx.push(take(d[1])); } while(!dx.empty()) { put(dx.top(), d[2]); dx.pop(); } } } }; void day5(line_view file, char* msg, int mode); }