문제
A와 B는 번갈아 비어 있는 칸 하나를 고릅니다. 선택한 칸은 자신의 영역이 되고, 그 선택이 빈 영역을 여러 조각으로 나누면 가장 큰 조각보다 작은 영역을 모두 가져옵니다.
빈칸이 모두 사라지거나 경기가 조기 종료되었을 때 누적 점수가 높은 에이전트가 승리합니다. 경기는 최대 81턴까지 진행됩니다.
- 01선택
빈칸 하나를 고릅니다.
- 02분리
빈 영역이 큰 쪽과 작은 쪽으로 갈라집니다.
- 03연쇄 점령
가장 큰 영역보다 작은 쪽을 가져옵니다.
규칙
- 01
보드는 9×9이며 각 칸에는 -2, -1, 0, 1, 2 중 하나의 점수값이 있습니다. # 벽과 이미 점령된 칸은 선택할 수 없습니다.
- 02
A와 B가 번갈아 진행합니다. 자기 차례에는 현재 비어 있는 . 칸의 0-indexed 좌표를 <row> <col> 형식으로 출력합니다.
- 03
선택한 칸은 즉시 자기 편의 영역이 되고, 그 칸의 점수값이 누적 점수에 더해집니다.
- 04
선택으로 기존 빈 연결 영역이 여러 컴포넌트로 나뉘면, 최대 크기보다 작은 컴포넌트를 모두 연쇄 점령합니다. 최대 크기가 여럿이면 그 컴포넌트들은 모두 빈칸으로 남습니다.
- 05
빈칸이 모두 사라지면 누적 점수가 높은 편이 승리합니다. invalid action 3회, 응답 시간 초과, 런타임 오류가 발생하면 즉시 패배합니다.
입출력
제출한 프로그램은 경기마다 한 번 실행되고, stdin이 EOF가 될 때까지 살아 있어야 합니다. 통신은 항상 한 줄 단위입니다.
| 시점 | stdin | stdout | 제한 |
|---|---|---|---|
| 프로그램 시작 | 별도 초기 입력 없음 | 출력 없음 | — |
| 자기 차례 | JSON 객체 1줄 | <row> <col> 1줄 + flush | 250 ms |
| 경기 종료 | EOF | 추가 출력 없이 종료 | — |
자기 차례의 JSON 요청
실제 전송은 들여쓰기 없는 JSON 객체 한 줄입니다.
전략 판단에 필요한 핵심 필드
| 필드 | 타입 | 의미 |
|---|---|---|
side | "A" | "B" | 이 프로세스가 조종하는 편 |
turn | number | 1부터 시작하는 현재 전체 턴 |
scores | { A, B } | 양쪽의 최신 누적 점수 |
state.cells | string[9] | . 빈칸, # 벽, a/b 점령 칸 |
state.values | number[9][9] | 각 칸의 점수값 |
state.invalidCounts | { A, B } | 양쪽의 누적 invalid action 횟수 |
state.remainingCells | number | 현재 선택 가능한 빈칸 수 |
나머지 요청 필드 보기
| 필드 | 타입 | 의미 |
|---|---|---|
schemaVersion | string | 항상 codeversus.agent-turn.v1 |
matchId | string | 현재 경기의 공개 ID |
maxTurns | number | 최대 전체 턴 수. 현재 81 |
observation | string | 같은 턴 상태의 텍스트 표현. 판단에는 구조화된 state 사용을 권장 |
state.width / height | number | 보드 너비와 높이. 현재 각각 9 |
state.agents | { A, B } | 양쪽의 최근 좌표와 활성 상태 |
agent | object | 내 side·사용자·제출·언어 메타데이터 |
opponent | object | 상대 side·사용자·제출·언어 메타데이터 |
좌표 한 줄
방금 받은 요청마다 정확히 한 번 응답합니다.
2 5- 입력 JSON 한 줄마다 0-indexed 좌표 <row> <col> 한 줄만 stdout으로 출력합니다.
- 좌표는 0 ≤ row, col < 9이고, 방금 받은 state.cells[row][col]이 .인 칸이어야 합니다.
- 출력 뒤 즉시 flush합니다. Python은 print(..., flush=True), C++은 std::endl 또는 명시적 flush를 사용하세요.
- 디버그 로그는 stderr로 보냅니다. 빈 줄, 설명 문장, 여러 좌표, 형식 오류, 범위 밖 좌표, 선택 불가능한 칸은 invalid action입니다.
위 출력은 state.cells[2][5] === "."인 칸을 선택합니다. 행과 열은 모두 0부터 시작합니다.
전체 JSON 요청 예시 보기
읽기 편하도록 들여썼지만 실제 stdin에서는 아래 객체 전체가 한 줄로 전달됩니다.
{
"schemaVersion": "codeversus.agent-turn.v1",
"matchId": "match_0007",
"side": "A",
"turn": 17,
"maxTurns": 81,
"observation": "TURN 17 81\nYOU A\nBOARD 9 9\nSCORE 28 17\nVALUES\n0 1 -1 2 0 -2 1 0 2\n1 0 0 -1 2 1 -2 0 1\n-1 2 0 1 0 -1 2 1 0\n0 -1 2 0 1 2 0 -2 1\n2 0 -1 1 0 2 -1 1 0\n-2 1 0 2 -1 0 1 2 0\n1 -2 2 0 1 -1 0 1 2\n0 1 -1 2 0 1 -2 0 1\n2 0 1 -1 2 0 1 -2 0\nOWNERS\n.........\n..#......\n....a....\n.........\n...b.....\n.........\n.........\n.........\n.........\nINVALID 0 1\nACTION row col\nEND",
"scores": {
"A": 28,
"B": 17
},
"state": {
"width": 9,
"height": 9,
"cells": [
".........",
"..#......",
"....a....",
".........",
"...b.....",
".........",
".........",
".........",
"........."
],
"values": [
[
0,
1,
-1,
2,
0,
-2,
1,
0,
2
],
[
1,
0,
0,
-1,
2,
1,
-2,
0,
1
],
[
-1,
2,
0,
1,
0,
-1,
2,
1,
0
],
[
0,
-1,
2,
0,
1,
2,
0,
-2,
1
],
[
2,
0,
-1,
1,
0,
2,
-1,
1,
0
],
[
-2,
1,
0,
2,
-1,
0,
1,
2,
0
],
[
1,
-2,
2,
0,
1,
-1,
0,
1,
2
],
[
0,
1,
-1,
2,
0,
1,
-2,
0,
1
],
[
2,
0,
1,
-1,
2,
0,
1,
-2,
0
]
],
"agents": {
"A": {
"row": 2,
"col": 4,
"alive": true
},
"B": {
"row": 4,
"col": 3,
"alive": true
}
},
"invalidCounts": {
"A": 0,
"B": 1
},
"remainingCells": 78
},
"agent": {
"side": "A",
"username": "dori",
"submissionId": "sub_0042",
"language": "python3",
"displayName": "cut-v4"
},
"opponent": {
"side": "B",
"username": "sample-cascade-edge",
"submissionId": "sample-cascade-edge",
"language": "python3",
"displayName": "Edge Sample Bot"
}
}