Yacht Auction

NYPC CODE BATTLE · 온라인 라운드

문제 설명

버섯 게임을 끝낸 예티와 핑크빈은 이제 그란디스로 넘어와, 럭키 다이스 스킬을 쓰며 주사위를 던지던 과거를 회상하며 Yacht Auction이라는 보드게임을 하기로 했습니다.

경기 규칙

입찰 단계

입찰 단계는 다음과 같이 진행됩니다.

  1. AA묶음 주사위 55개와 BB묶음 주사위 55개를 굴립니다. 각 주사위는 11 이상 66 이하의 정수가 동일한 확률로 서로 독립적으로 나오는 주사위입니다.
  2. 각 사람은 자신이 가져가고 싶은 주사위 묶음 AA 혹은 BB와 입찰에 사용할 00 이상 100000100\,000 이하의 입찰 점수를 제출합니다.
  3. 제출한 주사위 묶음과 입찰 점수를 통해 다음 규칙에 따라 주사위를 가져갑니다.
  1. 이후 다음 규칙에 따라 점수를 계산합니다.

점수 획득 단계

가지고 있는 주사위 1010개(단, 마지막 점수 획득 단계에서는 55개)의 주사위 중 원하는 주사위를 55개 선택합니다. 이후, 다음 점수 규칙중 하나를 정해서 점수를 얻습니다. 한 경기에서 한 종류의 점수 규칙은 최대 한 번만 사용할 수 있습니다.

기본 점수 규칙

또한, 기본 점수 규칙에서 6300063\,000점 이상을 얻은 경우 보너스 점수 35000\mathbf{35\,000}을 추가로 얻게 됩니다.

조합 점수 규칙

최종 점수 및 승리 조건

모든 라운드가 끝난 이후, 총점이 높은 사람이 승리합니다. 총점이 같다면 무승부입니다.

입/출력 형식

참가자의 프로그램은 한 줄씩 입력을 받아 각 명령에 따라 동작해야 합니다. 출력이 필요한 명령은 아래 표에서 빨간색으로 시간 제한과 함께 표시되어 있습니다. 이 시간 제한 안에 출력을 하지 못한 경우 시간 초과 (TLE) 판정을 받게 되며, 해당 게임에서 실격패 처리됩니다.

커맨드입력 형식설명
READYREADY입력 준비 완료를 의미하는 OK3초 이내에 출력해야 합니다.
ROLLROLL a₁a₂a₃a₄a₅ b₁b₂b₃b₄b₅A그룹 주사위에 적힌 눈이 a1,,a5a_1, \cdots, a_5, B그룹 주사위에 적힌 눈이 b1,,b5b_1, \cdots, b_5임을 나타냅니다. 이후 0.5초 이내에 BID g x를 출력해야 합니다. 이는 gg 묶음 주사위에 xx점을 입찰한다는 의미입니다. ggA 혹은 B 이며, xx00 이상 100000100\,000 이하의 정수여야 합니다.
GETGET g g₀ x₀입찰 결과로 gg 묶음 주사위를 가져갔음을 의미합니다. 상대는 g0g_0 묶음에 xx 점을 입찰했다는 의미입니다.
SCORESCORE점수 획득 단계를 시작한다는 의미입니다. 이후 0.5초 이내에 PUT c d₁d₂d₃d₄d₅를 출력해야합니다. 이는 가지고 있는 주사위 중 d1,,d5d_1, \cdots, d_5를 점수 규칙 cc를 사용해서 점수를 획득한다는 의미입니다.
SETSET c d₁d₂d₃d₄d₅상대가 점수 획득 단계에서 가지고 있는 주사위 중 d1,,d5d_1, \cdots, d_5를 점수 규칙 cc를 사용해서 점수를 획득했다는 의미입니다.
FINISHFINISH게임 종료를 알리는 명령입니다. 이 명령을 받으면 게임 진행 상황에 관계 없이 프로그램은 즉시 정상적으로 종료되어야 하며, 출력은 필요하지 않습니다.

모든 명령어는 한 줄에 하나씩 입출력해야 하며, 출력할 때는 개행문자를 출력한 뒤 버퍼를 flush해야 합니다. 언어별로 버퍼를 flush하는 방법에 대해서는 각 언어의 공식 레퍼런스 문서와 예제 코드를 참고해 주세요.

예제 코드

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

예제코드는 다음과 같이 동작합니다.

샘플 AI와의 대결

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

배틀 번호설명코드data.bin
1제공된 예제 코드와 같은 동작을 수행합니다.코드
2입찰 단계: 주사위 그룹의 합이 높은 쪽에 (두 그룹 주사위 합의 차) ×1000\times 1\,000점을 입찰합니다.
점수 획득 단계: 제일 높은 점수를 받을 수 있는 규칙과 조합을 사용합니다.
코드
3입찰 단계: A와 B중 한 그룹을 골라 무작위로 00점을 입찰합니다.
점수 획득 단계: 제일 높은 점수를 받을 수 있는 규칙과 조합을 사용합니다.
코드
4입찰 단계: A와 B중 한 그룹을 골라 무작위로 00점을 입찰합니다.
점수 획득 단계: 점수를 얻기 힘든 조합을 우선 선택합니다.
코드
5입찰 단계: A와 B중 한 그룹을 골라 무작위로 00점을 입찰합니다.
점수 획득 단계: 기본 점수 규칙을 우선 선택합니다.
코드data
6입찰 단계: 더 좋은 조합에 수비적으로 입찰합니다.
점수 획득 단계: 기본 점수 규칙을 우선 선택합니다.
코드data
7입찰 단계: 더 좋은 조합에 공격적으로 입찰합니다.
점수 획득 단계: 기본 점수 규칙을 우선 선택합니다.
코드data
8입찰 단계: A와 B중 한 그룹을 골라 무작위로 00점을 입찰합니다.
점수 획득 단계: 조합 점수 규칙을 우선 선택합니다.
코드data
9입찰 단계: 더 좋은 조합에 수비적으로 입찰합니다.
점수 획득 단계: 조합 점수 규칙을 우선 선택합니다.
코드data
10입찰 단계: 더 좋은 조합에 공격적으로 입찰합니다.
점수 획득 단계: 조합 점수 규칙을 우선 선택합니다.
코드data

샘플 AI 코드와 data.bin 파일은 실제 대회 진행 시에는 제공되지 않았습니다.

테스팅 툴 (GUI)

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

테스팅 툴 (CLI)

참가자가 작성한 프로그램을 테스팅하기 위한 테스팅 툴 패키지인 testing-tool-yacht-cli.zip (다운로드) 가 주어집니다. 자세한 내용은 파일 안에 있는 README.md를 참고하세요.

CLI 테스팅 툴을 수정하는 것은 자유이며, 실행 방법과 관련해서는 다른 사람과 자유롭게 토론할 수 있습니다. 하지만 수정된 테스팅 툴 혹은 테스팅 툴이 출력한 로그 파일 등을 팀원 이외의 사람과 공유하거나, 이와 관해 토론해서는 안됩니다.

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

시각화 도구

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

예시

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

35561 15336 0
31452 33164 0
21464 46146 0
51211 45446 1
62612 34411 1
12421 36431 0
54344 36225 1
13653 32122 0
53644 61453 0
64215 15142 1
35522 44162 1
54111 55424 1

예시 인터랙션

선공 입력선공 출력후공 입력후공 출력로그
READYOKREADYOK
ROLL 35561 15336ROLL 35561 15336

ROUND 1

ROLL 35561 15336

BID A 123BID A 456

BID FIRST A 123

BID SECOND A 456

GET B A 456GET A A 123

GET FIRST B

GET SECOND A

ROLL 31452 33164ROLL 31452 33164

ROUND 2

ROLL 31452 33164

BID A 99BID B 11

BID FIRST A 99

BID SECOND B 11

GET A B 11GET B A 99

GET FIRST A

GET SECOND B

SCORESCORE
PUT ONE 35561PUT THREE 13356

PUT FIRST ONE 35561

PUT SECOND THREE 13356

SET THREE 13356SET ONE 35561
(라운드 3-12 생략)
SCORESCORE

ROUND 13

PUT YACHT 12556PUT FULL_HOUSE 42533

PUT FIRST YACHT 12556

PUT SECOND FULL_HOUSE 42533

SET FULL_HOUSE 42533SET YACHT 12556
FINISH(프로그램 종료)FINISH(프로그램 종료)

FINISH

SCOREFIRST 19000

SCORESECOND 30372