adventofcode2024/day17/sol2.c

89 lines
1000 B
C
Raw Permalink Normal View History

2024-12-17 06:43:51 +00:00
#include <stdio.h>
int prog[] = {2,4,1,1,7,5,4,4,1,4,0,3,5,5,3,0};
int plen = sizeof(prog) / sizeof(int);
long reverse(int i, long init) {
long a = init;
// jnz,0
if (i >= plen) {
return init;
}
// in,5
int b = prog[plen-i-1];
// adv,3,
a <<= 3l;
// bxl,4
b ^= 4;
// cdv,5
// bxc,4
long q;
for (q = 0; q < 8; q++) {
if (((q^1) ^ ((((a|q)>>(q^1)))&7)) == b) {
// bst 4
// bxl,1
long x = reverse(i+1, a|q);
if (x >= 0) {
return x;
}
}
}
//error
if (a == 0) {
return -1;
}
return -a;
}
int run(long a) {
int b = 0;
int c = 0;
int i = 0;
// 4:a 5:b 6:c
do {
// bst 4
b = a%8;
//
// bxl,1
b ^= 1;
// cdv,5
c = (a&65535) >> b;
// bxc,4
b ^= c;
// bxl,4
b ^= 4;
// adv,3,
a >>= 3;
// out,5
printf("%d", b%8);
if (i >= plen || (b%8) != prog[i]) {
printf("!");
}
printf(" ");
i++;
// jnz,0
} while (a != 0);
printf("\n");
return 0;
}
int main() {
long a = reverse(0, 0);
printf("%ld\n", a);
run(a);
return 0;
}