/* b01902062 èĉşç */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "xwrap.h" #include <errno.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <time.h> #include <unistd.h> int main (int argc, char* argv[]) { if (argc < 4) { fprintf (stderr, "Usage: %s judge_id player_index random_key\n", argv[0]); return 1; } char* judge_id = argv[1]; char* player_index = argv[2]; char* random_key = argv[3]; pid_t mypid = getpid(); srandom (mypid + argv[3][0] + argv[3][0] != '\0' ? argv[3][1] : '0'); FILE* rf = NULL; FILE* wf = NULL; char* fifoname; int oth[4] = { 0, 0, 0, 0 }; int cnt[3] = { 0, 0, 0 }; int i = 0; do { if (wf == NULL) { wf = fopen (fifoname = xstrcat ("judge", judge_id, ".FIFO", (char*)NULL), "wb"); if (wf == NULL) { fprintf (stderr, "%s: Cannot open `%s\': %s\n", argv[0], fifoname, strerror (errno)); return 1; } free (fifoname); } const char* val = "135"; if (!i) { fprintf (wf, "%s %s %c\n", player_index, random_key, val[random () % 3]); } else { int hismin = INT_MAX; int choice = 0; for (int j = 0; j < 4; j++) { switch (oth[j]) { case 1: cnt[0]++; break; case 3: cnt[1]++; break; case 5: cnt[2]++; break; } } for (int j = 0; j < 3; j++) { if (cnt[j] < hismin) { choice = j; hismin = cnt[j]; } } fprintf (wf, "%s %s %c\n", player_index, random_key, val[choice]); } fflush (wf); if (rf == NULL) { rf = fopen (fifoname = xstrcat ("judge", judge_id, "_", player_index, ".FIFO", (char*)NULL), "rb"); if (rf == NULL) { fprintf (stderr, "%s: Cannot open `%s\': %s\n", argv[0], fifoname, strerror (errno)); return 1; } free (fifoname); } } while (++i < 20 && fscanf (rf, "%d %d %d %d", &oth[0], &oth[1], &oth[2], &oth[3]) == 4); fclose (rf); fclose (wf); return 0; }