/* 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;
}