버섯 게임

NYPC CODE BATTLE · 온라인 라운드 연습문제

문제 설명

메이플 월드의 평화로운 숲속, 예티와 핑크빈은 오늘도 사이좋게 버섯 밭을 가꾸고 있었습니다.
그러던 어느 날, 버섯마다 숫자가 적혀 있다는 사실을 발견한 두 친구는 이 숫자를 활용해 새로운 게임을 만들기로 했습니다.
그들은 버섯 밭의 일부를 점령하며 경쟁하는 게임을 고안했고, 아래의 규칙에 따라 번갈아 가며 영역을 선택해 나갑니다.

게임 규칙

예티 또는 핑크빈 중 한 명이 되어, 버섯 밭에서 더 많은 칸을 점령할 수 있는 프로그램을 작성하세요.

입/출력 형식

참가자의 프로그램은 한 줄씩 입력을 받아 각 명령에 따라 동작해야 합니다. 출력이 필요한 명령은 아래 표에서 빨간색으로 표시되어 있습니다.

커맨드입력 형식설명
READYREADY (FIRST|SECOND)플레이어의 선공/후공 정보를 알려주는 명령입니다. 입력 준비 완료를 의미하는 OK 를 3초 이내에 출력해야 합니다.
INITINIT ...게임 보드 정보를 초기화하는 명령입니다. ...에는 1010개의 문자열이 주어지며, 각 문자열은 1717자리 숫자로 구성되어 있습니다.
각 숫자는 11이상 99이하의 정수이며, 해당 위치의 버섯에 적힌 숫자를 의미합니다. 출력은 필요하지 않습니다.
각 숫자는 11이상 99이하의 정수가 동일한 확률로 서로 독립적으로 주어집니다.
TIMETIME t₁ t₂현재까지 각 플레이어의 남은 시간을 알려주는 명령입니다. t1t_1은 내 프로그램의 남은 시간이고, t2t_2는 상대 프로그램의 남은 시간입니다.
이 명령을 받으면, 플레이어가 이번 턴에 선택할 직사각형의 좌표를 r1r_1 c1c_1 r2r_2 c2c_2 형식으로 출력해야 합니다.
게임 보드의 왼쪽 위 좌표는 (r,c)=(0,0)(r, c) = (0, 0)이고, 오른쪽 아래 좌표는 (9,16)(9, 16) 입니다.
패스할 경우 r1=c1=r2=c2=1r_1 = c_1 = r_2 = c_2 = -1을 출력하며, 출력 값은 다음 조건을 만족해야 합니다.

1r1r29-1 \le r_1 \le r_2 \le 9
1c1c216-1 \le c_1 \le c_2 \le 16
처음 t1,t2t_1, t_2로 주어지는 시간은 READY 명령어에 사용한 시간과 관련 없이 1000010\,000입니다.
OPPOPP x₁ y₁ x₂ y₂ t상대방의 선택 정보를 알려주는 명령입니다. 상대방이 선택한 직사각형 좌표 r1r_1 c1c_1 r2r_2 c2c_2 와 해당 턴에 사용한 시간 tt 가 주어집니다.
상대가 패스한 경우에는 r1=c1=r2=c2=1r_1 = c_1 = r_2 = c_2 = -1이 주어집니다. 출력은 필요하지 않습니다.
FINISHFINISH게임 종료를 알리는 명령입니다. 이 명령을 받으면 프로그램은 정상적으로 종료되어야 하며, 출력은 필요하지 않습니다.

모든 출력 이후에는 버퍼를 flush해야 합니다. 버퍼를 flush하지 않은 경우 출력이 제대로 되지 않아 TLE가 발생할 수 있습니다. 언어별로 버퍼를 flush하는 방법에 대해서는 각 언어의 공식 레퍼런스 문서와 예제 코드를 참고해 주세요.

예제 코드

다음은 각 언어별로 작성한 예제 코드입니다.

예제 코드는 올바른 조건의 직사각형 중 (r1,c1,r2,c2)(r_1, c_1, r_2, c_2)가 사전순으로 가장 작은, 즉 가능한 가장 왼쪽 위의 직사각형을 골라서 출력합니다. 선택 가능한 직사각형이 없을 경우에는 턴을 넘깁니다.

샘플 AI와의 대결

제출된 코드가 컴파일에 성공하면, 총 7개의 샘플 AI와 대결을 진행하게 됩니다.
각 샘플 AI와는 선공/후공을 번갈아 가며 2번의 대결을 치릅니다. 승패에 따른 점수는 다음과 같습니다.

샘플 AI의 전략은 아래와 같습니다.

배틀 번호설명
1 / 2자기의 턴에 항상 "패스"만 합니다.
3 / 4제공된 예제 코드와 같은 동작을 수행합니다.
5 / 6게임 시뮬레이터 샘플 AI 핑크빈의 전략을 사용합니다.
7 / 8중간 난이도의 방어형 전략을 사용합니다.
9 / 10중간 난이도의 공격형 전략을 사용합니다.
11 / 12어려운 난이도의 방어형 전략을 사용합니다.
13 / 14어려운 난이도의 공격형 전략을 사용합니다.

시각화 도구 (샘플 AI / 번갈아 플레이하기 / 로그 분석)

게임을 샘플 AI와 플레이, 두 명이 번갈아가면서 플레이 해 볼 수 있고, 게임의 시뮬레이터 및 테스팅 툴이 출력한 로그를 시각화하는 시각화 도구를 사용할 수 있습니다.

샘플 AI의 대결에서 각 배틀의 로그 파일을 다운받을 수 있습니다. 로그 시각화 도구를 활용하여 게임이 어떻게 진행되었는지 살펴보고 전략을 수정하세요.

테스팅 툴 (GUI)

참가자가 작성한 프로그램을 테스팅하기 위한 테스팅 툴인 testing-tool-mushroom이 제공됩니다. 참가자의 환경에서 컴파일한 실행 파일 혹은 참가자의 실행 환경의 python, java, node, lua 환경과 스크립트를 이용하여 로컬에서 문제를 테스트해 볼 수 있습니다.

테스팅 툴 (커맨드라인, 파이썬 스크립트)

참가자가 작성한 프로그램을 테스팅하기 위한 테스팅 툴인 testing_tool.py (다운로드) 가 주어집니다. 테스팅 툴은 Python 3.12로 작성된 프로그램입니다. 이 프로그램의 실행에 관해서는 [파이썬 설정 및 사용법]을 참고하세요.

테스팅 툴을 사용하기 위해서는 testing_tool.py 와 같은 위치에 setting.ini를 작성합니다. 내용은 다음과 같습니다.

INPUT=<입력 파일 경로>
LOG=<로그 파일 경로>
EXEC1=<선공 유저의 프로그램 실행 커맨드>
EXEC2=<후공 유저의 프로그램 실행 커맨드>

예를 들어, 같은 폴더에 있는 input.txt를 입력으로, 로그를 log.txt에 출력하고, 선공 유저의 프로그램 실행 커맨드를 ./Main.exe, 후공 유저의 프로그램 실행 커맨드를 python3 main.py --test라고 하면, 다음과 같이 작성합니다.

INPUT=./input.txt
LOG=./log.txt
EXEC1=./Main.exe
EXEC2=python3 main.py --test

테스팅 툴 입력 형식 및 로그 해석

테스팅 툴의 입력 파일은 보드의 초기 상태를 나타냅니다. 보드는 1010개의 줄로 이루어져있어야 하며, 각 줄은 1717개의 11 이상 99 이하의 숫자로 이루어져야 합니다. 이후 testing_tool.py를 실행합니다. 실행한 이후에는 로그 파일로 지정한 ./log.txt에 로그가 출력됩니다.

로그는 다음과 같은 정보를 출력합니다.

testing_tool.py를 수정하는 것은 자유이지만, 수정된 testing_tool.py 혹은 테스팅 툴의 로그 파일 등을 팀원 이외의 사람과 공유하거나, 이와 관해 토론해서는 안됩니다.

채점 결과에서는 테스팅 툴이 출력한 로그와 같은 형식의 실행 로그를 받아볼 수 있습니다. 단, 실제 채점 프로그램은 테스팅 툴과 다르게 구현되어있으므로, 테스팅 툴에서의 작동이 채점 서버에서의 정상 작동을 의미하지는 않습니다.

예시

예시 입력 (테스팅 툴에 사용됨)

52466443835422223
13254826938785712
87598398564241564
72722154162442227
43968227685821641
27727492381231148
56138649164249527
36281415328768234
62682694189422313
62269566965435457

예시 인터랙션

아래의 INIT ...로 쓰인 문자열은 보드의 입력을 나타내며, 다음과 같이 주어집니다.

INIT 52466443835422223 13254826938785712 87598398564241564 72722154162442227 43968227685821641 27727492381231148 56138649164249527 36281415328768234 62682694189422313 62269566965435457
선공 입력선공 출력후공 입력후공 출력로그
READY FIRSTREADY SECOND
OKOK
INIT ...INIT ...INIT ...
TIME 10000 10000
(70ms 소요)0 11 0 14
OPP 0 11 0 14 70FIRST 0 11 0 14 70
TIME 10000 9930
(40ms 소요)1 13 5 13
OPP 1 13 5 13 40SECOND 1 13 5 13 40
TIME 9930 9960
(20ms 소요)-1 -1 -1 -1
OPP -1 -1 -1 -1 20FIRST -1 -1 -1 -1 20
TIME 9960 9910
(10ms 소요)-1 -1 -1 -1
OPP -1 -1 -1 -1 10SECOND -1 -1 -1 -1 10
FINISH(프로그램 종료)FINISH(프로그램 종료)FINISH
SCOREFIRST 4
SCORESECOND 5