#include #include #include enum pt { P_NONE = 0, P_K, P_Q, P_R, P_B, P_N, P_P }; struct piece { enum pt c; char row, col; }; struct side { struct piece p[64]; size_t num; }; struct side black, white; static int upper; static int cmp_piece (const void *xa, const void *xb) { const struct piece *a, *b; a = xa; b = xb; if (a->c > b->c) return 1; if (a->c < b->c) return -1; if (a->row != b->row) return (a->row - b->row) * (upper ? 1 : -1); return a->col - b->col; } static void out (const char *prefix, struct side *side) { size_t i; qsort (side->p, side->num, sizeof (*side->p), cmp_piece); fputs (prefix, stdout); for (i = 0; i < side->num; i++) { const struct piece *p; if (i != 0) putchar (','); p = side->p + i; if (p->c != P_P) putchar ("KQRBN"[p->c - 1]); putchar (p->col); putchar (p->row); } putchar ('\n'); } int main (void) { static const char line[] = " +---+---+---+---+---+---+---+---+"; char row; scanf (line); for (row = '8'; row >= '1'; row--) { char col; scanf (" |"); for (col = 'a'; col <= 'h'; col++) { char c; enum pt p; scanf("%*c%c%*c|", &c); switch (tolower(c)) { case 'k': p = P_K; break; case 'q': p = P_Q; break; case 'r': p = P_R; break; case 'b': p = P_B; break; case 'n': p = P_N; break; case 'p': p = P_P; break; default: p = P_NONE; break; } if (p != P_NONE) { struct side *side; side = isupper (c) ? &white : &black; side->p[side->num].c = p; side->p[side->num].row = row; side->p[side->num].col = col; side->num++; } } scanf (line); } upper = 1; out ("White: ", &white); upper = 0; out ("Black: ", &black); return EXIT_SUCCESS; }