From feca43e796fbe8bde441f017f4c94642392bc40f Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Thu, 2 Dec 2021 14:34:48 +0100 Subject: Add day 23 solutions --- 2015/23/Makefile | 9 +++++ 2015/23/input | 48 +++++++++++++++++++++++++ 2015/23/puzzles.l | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 2015/23/Makefile create mode 100644 2015/23/input create mode 100644 2015/23/puzzles.l diff --git a/2015/23/Makefile b/2015/23/Makefile new file mode 100644 index 0000000..8779ec0 --- /dev/null +++ b/2015/23/Makefile @@ -0,0 +1,9 @@ +all: + flex -f -DYY_NO_INPUT --nounput puzzles.l + ${CC} ${CFLAGS} -lfl -DPROGLEN=`wc -l +#include +#include +#include + +/* Shut up the compiler */ +int fileno(FILE *); + +struct Instr { + enum { + HLF, + INC, + JIE, + JIO, + JMP, + TPL + } type; + enum { + A, + B + } reg; + int imm; +}; + +int i = 0; +struct Instr *program; + +#ifdef PART2 +unsigned long long registers[2] = {1, 0}; +#else +unsigned long long registers[2]; +#endif +%} + +%x ARGS + +%% + +hlf { program[i].type = HLF; BEGIN(ARGS); } +inc { program[i].type = INC; BEGIN(ARGS); } +jie { program[i].type = JIE; BEGIN(ARGS); } +jio { program[i].type = JIO; BEGIN(ARGS); } +jmp { program[i].type = JMP; BEGIN(ARGS); } +tpl { program[i].type = TPL; BEGIN(ARGS); } + +[ab] { program[i].reg = *yytext - 'a'; } +[+\-][0-9]+ { program[i].imm = atoi(yytext); } +[ ,]+ { ; } +\n { i++; BEGIN(INITIAL); } + +%% + +static unsigned long long +execute(void) +{ + for (i = 0; i < PROGLEN; i++) { + switch (program[i].type) { + case HLF: + registers[program[i].reg] /= 2; + break; + case INC: + registers[program[i].reg]++; + break; + case JIE: + if (!(registers[program[i].reg] & 1)) + i += program[i].imm - 1; + break; + case JIO: + if (registers[program[i].reg] == 1) + i += program[i].imm - 1; + break; + case JMP: + i += program[i].imm - 1; + break; + case TPL: + registers[program[i].reg] *= 3; + break; + } + } + + return registers[B]; +} + +int +main(void) +{ + FILE *fp; + + if (!(program = calloc(PROGLEN, sizeof(struct Instr)))) + err(EXIT_FAILURE, "calloc"); + + if (!(fp = fopen("input", "r"))) + err(EXIT_FAILURE, "fopen"); + + yyrestart(fp); + yylex(); + fclose(fp); + + printf("%llu\n", execute()); + return EXIT_SUCCESS; +} -- cgit v1.2.3