>>107136883
https://godbolt.org/z/45PbsTd1x
int putchar(int);
void put(const char* s) { while (*s) putchar(*s++); }
void print(int board) {
for (char a[] = " XO.", i = 0; i < 9;) {
const int c = (board >> i & 1) + (board >> (i + 8) & 2);
*a = '1' + i;
putchar(" ["[!c]), putchar(a[c]), putchar(" ]"[!c]);
putchar(" \n"[i++ % 3 == 2]);
}
}
int victory(int board) {
const int base = board >> 18;
const int lines[] = {0111, 0222, 0444, 0700, 070, 07, 0124, 0421, 0};
for (const int* line = lines; *line; ++line)
if ((board >> base & *line) == *line) {
print(~(*line << (base ^ 9)));
put("Player "), putchar("OX"[!base]), put(" Wins!\n");
return 1;
}
return 0;
}
int tied(int board) {
print(board);
if (((board | board >> 9) & 0x1FF) != 0x1FF) return 0;
return put("Tied game!\n"), 1;
}
int getInput(int* board) {
int getchar();
const int base = *board >> 18;
for (;;) {
put("Player "), putchar("OX"[!base]), put(" [1..9]:\n");
for (;;) {
const int c = getchar();
if (c < 0) return put("Bye!\n"), 0;
const unsigned d = c - '1';
if (d >= 9) continue;
if ((*board | *board >> 9) >> d & 1) {
put("Position "), putchar(c), put(" is not empty!\n");
break;
}
return *board |= 1 << (base + d);
}
}
}
int main() {
for (int board = (print(0), 0);
getInput(&board) && !victory(board) && !tied(board);
board ^= 9 << 18);
}