네코동 AI 챌린지: Five!

넥슨 프로그래밍 동호회 네코동에서 AI 챌린지를 엽니다. 간단한 게임 AI를 만들고, 다른 AI를 이기기 위한 전략을 구상해서, 다른 사람들과 붙어볼 수 있는 AI 대회를 준비해보았습니다.

직접 플레이해보면서 룰을 익혀본 다음, 좋은 결과를 낼 수 있는 AI를 제출해 주세요!
바로 해보려면 이 사이트를 참고해 주세요.

프로그래밍을 엄청 잘하지 않으시더라도 만드는 걸 시도해볼 수 있을 정도로 간단한 게임을 준비해보았습니다. 더 잘하기 위해 고민하고, 구현하고, 다시 더 나아지기 위해 고민하면서 AI를 만드는 것 자체가 엄청 재밌는 일이에요. 1등하면 닌텐도 스위치가 기다리고 있습니다! 많은 참여 부탁드립니다.

게임 한 판을 이기기 위한 게임 룰과 대회에서 어떻게 AI를 평가하게 될지에 대한 대회 룰을 설명합니다.

게임 룰

대회 룰 (8강 결정까지)

대회 룰의 예

A, B, C가 AI를 제출했다고 해봅시다.
A:B, B:C, C:A 상대로 11판 6선승제로 대전을 합니다.
A:B = 6승 3패로 A가 대전을 승리
B:C = 6승 1패로 B가 대전을 승리
C:A = 5승 5패 1무로 대전 무승부

위와 같이 결과가 나온 경우, 대전 결과를 종합하면
A: 1승 1무로 4점
B: 1승 1패로 3점
C: 1무 1패로 1점

A, B, C 순서대로 1, 2, 3등이 됩니다. 만약 점수가 같았다면 제출 순서를 따져 먼저 제출한 AI가 상위 등수를 차지합니다.

대회 룰 (8강)

직접 게임 경험해보기

PC나 폰으로 아래 주소로 접속하여 사람들과 붙어볼 수 있습니다.

necodong.com/five

참가하는 방법

AI 함수를 작성한 후 압축해서 첨부파일로 메일로 necodong@gmail.com으로 전송하시면 됩니다! (자세한 제출방법을 참고 해주세요)

심사의 편의를 위해 참가 가능한 언어는 Python3와 Javascript로 제한합니다. 불필요한 동작을 하는 코드의 경우 실격처리할 수 있습니다(파일 오픈, 외부와 통신, 해킹 시도, 특수한 기법으로 룰을 우회하는 등).
라이브러리, 모듈 등의 사용은 허용하지 않습니다. python은 import를 해선 안되며, __builtins__모듈에 포함된 것은 __import__, exec eval를 제외하고 사용할 수 있습니다. javascript의 Math, Date 등도 금지됩니다. 언어에서 모듈없이 사용할 수 있는 [ ], { } 등과 일반적으로 같이 사용할 꺼라 기대되는 append, push 등의 메서드들은 사용해도 괜찮습니다. 일반적이지 않은 사용의 예를 들자면, python에서 object.__subclasses__()[93].read.__globals__['open']('other_ai.py').read() 와 같은 코드로 특정 파일을 읽어들이는 건 "일반적인 사용"이 아닙니다. (04/17 추가)
알고리즘 경쟁을 위해 언어에 제공되는 랜덤의 사용을 금지합니다. 좀더 정확히는, 제출한 think 함수는 같은 인자가 들어오면, 항상 같은 카드를 고르는 결정론적 알고리즘이어야 합니다. 아래 랜덤 금지 섹션을 참고해주세요. (04/13 추가)

다음 형태의 함수를 작성하시면 됩니다. 인자 설명은 아래에…
만약 구현상 다른 함수를 추가해야할 경우 자유롭게 추가해서 구현해 주세요. 프로그래밍 초보이신 경우 아래의 return 부분을 수정하여 특정 순서로 내는 AI를 쉽게 만드실 수 있습니다.

# Python3
# 5 4 3 2 1 ! 순서대로 내는 AI 예제입니다.
def think(hands, history, old_games):
    if len(history) == 0:
        return '5'
    if len(history) == 1:
        return '4'
    if len(history) == 2:
        return '3'
    if len(history) == 3:
        return '2'
    if len(history) == 4:
        return '1'
    if len(history) == 5:
        return '!'
// Javascript
// 5 4 3 2 1 ! 순서대로 내는 AI 예제입니다.
function think(hands, history, old_games) {
	if (history.length == 0)
		return '5';
	if (history.length == 1)
		return '4';
	if (history.length == 2)
		return '3';
	if (history.length == 3)
		return '2';
	if (history.length == 4)
		return '1';
	if (history.length == 5)
		return '!';
}

think가 호출될 때 인자의 예

내가 3을 내고 상대가 4, 내가 4를 내고 상대가 1을 내어 0점인 상태입니다. (상대 남은 카드는 2, 3, 5, ! 겠죠). 상대가 1을 내 버렸으므로 내 5를 안전하게 내거나, 1을 내고 상대 5를 잡는 시도를 해보거나(성공하면 엄청 유리해집니다), old_games를 살펴서 어떤 수가 더 유리할지 더 고민해 볼 수 있습니다.

AI 테스트하기

아래 사이트에서 제작한 AI를 54321! 순서로 내는 AI와 대전 해볼 수 있습니다. 제출 전에 동작하는지 테스트 용으로 사용하실 수 있습니다.

예제 AI나 제출시 공개 하기로 결정한 AI 와 대전해 볼 수 있습니다. 콤보 박스에서 선택 후 공개 AI 와 겨뤄보기를 눌러보세요. (4/17 추가)

http://necodong.com/test

브라우저용 파이썬을 사용해서 일부 기능이 동작하지 않을 수 있습니다. 휴대폰 보단 PC로 접속해주세요. 크롬 최신버전을 사용하시는 것을 추전드립니다. 코드가 동작하지 않는 경우 개발자 도구를 열어 콘솔을 확인하면 관련 메시지가 출력되어 있는 경우가 있습니다. 버그가 있으면 문의주세요.

제출 방법

제출은 necodong@gmail.com 으로 “[AI대회] AI이름” 제목으로 메일을 보내주세요. 작성한 AI 코드를 zip으로 압축하여 첨부파일로 제출하시면 됩니다.

제출은 4월 13일부터 4월 22일까지 받습니다.

압축파일에 포함되어야할 내용은 아래와 같습니다. 확장자를 기준으로 판단하므로 파일이름은 아래와 달라도 괜찮습니다.

필수

옵션: 8강에 진출한 경우 중계할 때 사용합니다. 8강에 진출했는데 설명이나 이미지가 없는 경우 다시 요청드릴 수도 있습니다.

만약 제출한 AI를 공개하여 웹에서 테스트로 겨루게하고 싶은 경우, 제목에 “- 공개” 라고 붙여주세요. 코드가 공개되지는 않습니다.
제출하는 코드는 16384 바이트 이하여야합니다.

예)
[AI대회] BigHead
[AI대회] LazyThinker - 공개

상품

1등 - 닌텐도 스위치
2등 - 애플 에어팟
3~4등 - AI 스피커 (네이버 웨이브, 카카오 미니) (3등이 먼저 선택합니다.)
5~8등 - 라즈베리 파이

8등까지 제출하신 코드가 공개됩니다. 추가적인 소감이나 알고리즘 설명을 요청드릴 수 있습니다.

중간 집계

2018. 04. 13.

이름 승점
(예제)당신의 패턴을 파악했다 9
MJFool 6
매직AI 3
(예제)알파고가 되고 싶은 AI고 0

총 2분이 제출해 주셨습니다. AI를 비교해 볼 수 있게 간단한 전략을 구현한 예제 AI를 몇 개 넣어보았습니다. 예제 AI들은 최종 등수를 평가할 때 제외됩니다.

2018. 04. 14.

이름 승점 비고
(예제)당신의 패턴을 파악했다 15
킹갓제너럴엠페러충무공마제스티멘사미스터최 12
MJFool 9
매직AI 6
(예제)알파고가 되고 싶은 AI고 3
123 0 손에 없는 카드를 제출하는 경우가 있습니다. 버그를 수정하세요.

총 4분이 제출해 주셨습니다.

2018. 04. 16

이름 승점 비고
킹갓제너럴엠페러충무공마제스티멘사미스터최 24
(예제)당신의 패턴을 파악했다 24
류몬부치 21
MJFool 15
매직AI 12
DarkFlameDragon 12 손에 없는 카드를 내는 경우가 있습니다.
미래가제트 28호기 12 손에 없는 카드를 내는 경우가 있습니다.
(예제)알파고가 되고 싶은 AI고 9
123 6
IDIOT - 모듈 사용은 허용되지않습니다.

2018. 04. 17

이름 승점 비고
젤다가하고싶어요 38
킹갓제너럴엠페러충무공마제스티멘사미스터최 37
당신의 패턴을 파악한 당신을 파악했다 37
발로짜도가는8강 35
류몬부치 34
어떤AI 34
넥슨은 다람쥐를 뿌려라 29
(예제)당신의 패턴을 파악했다 27
DarkFlameDragon 25
바른생각 24
MJFool 22
매직AI 18
123 13
킹갓제너럴엠페러충무공마제스티멘사미스터원 12 잘못된 카드를 제출하는 경우가 있습니다.
(예제)알파고가 되고 싶은 AI고 12
IDIOT - 익셉션 발생: string index out of range
미래가제트 28호기 - 파일 사이즈 제한 초과

코드 크기 제한 조건 검사가 이번부터 적용됩니다.

2018. 04. 18

이름 승점 비고
미래가제트 28호기 60
류몬부치 59
킹갓제너럴엠페러충무공마제스티멘사미스터최 59
킹갓제너럴엠페러충무공마제스티멘사미스터원 57
어떤AI 54
발로짜도가는8강 53
젤다가하고싶어요 51
항상 1만 내는 AI 50
(예제)당신의 패턴을 파악했다 46
당신의 패턴을 파악한 당신을 파악했다 45
확률놀이꾼 45
넥슨은 다람쥐를 뿌려라 (공개) 43
야생의숨결오디세이스타얼라이즈 42
I∀ 36
바른생각 35
킹갓제너럴엠페러충무공마제스티멘사미스터영 34
AI조류인플루엔자 34
구경왔어요 30
매직AI 29
MJFool 26
전투력측정기 23
123 19
(예제)알파고가 되고 싶은 AI고 17
IDIOT - IndexError: string index out of range
DarkFlameDragon - SyntaxError
1Q86 - UnicodeDecodeError

업데이트가 늦어 죄송합니다. 일별 중간 집계는 해당날짜 자정까지 제출된 것을 기준으로 합니다.

2018. 04. 19

이름 승점 비고
류몬부치 82
미래가제트 28호기 78
젤다가하고싶어요 75
킹갓제너럴엠페러충무공마제스티멘사미스터최 73
어떤AI 70
항상 1만 내는 AI 70
운빨X망겜 69
넥슨은 다람쥐를 뿌려라 (공개) 64
발로짜도가는8강 63
확률놀이꾼 63
:thinking_face: 60
(예제)당신의 패턴을 파악했다 60
AI조류인플루엔자 55
방제가 있어야 봇쏴짐 54
IDIOT 52
I∀ 49
바른생각 44
아무거나 43
구경왔어요 (재 제출) 42
기흥역지웰푸르지오 41
매직AI 37
킹갓제너럴엠페러충무공마제스티멘사미스터영 37
MJFool 32
(예제)알파고가 되고 싶은 AI고 32
123 31
Snow 31 *
전투력측정기 26
야생의숨결오디세이스타얼라이즈 - *
킹갓제너럴엠페러충무공마제스티멘사미스터원 - *
GetJinxed - *
DarkFlameDragon - *
1Q86 - *

*: 잘못된 카드를 내거나 익셉션이 발생하거나 1초 시간 제한을 초과하거나 실행할 수 없는 문제가 발생했습니다.

2018. 04. 20

이름 승점 비고
킹갓제너럴엠페러충무공마제스티멘사미스터원 87
젤다가하고싶어요 85
I∀ 78
류몬부치 77
킹갓제너럴엠페러충무공마제스티멘사미스터최 76
미래가제트 28호기 75
구경왔어요 (재재제출) 67
안녕하세요 게임기획자입니다. 65
넥슨은 다람쥐를 뿌려라 64
KAKASHKA 64
어떤AI 63
1Q86 63 *
AI조류인플루엔자 62
발로짜도가는8강 61
방제가 있어야 봇쏴짐 60
항상 1만 내는 AI 57
(예제)당신의 패턴을 파악했다 56
확률놀이꾼 55
DarkFlameDragon 55
머호봇 53
:thinking_face: 48
야생의숨결오디세이스타얼라이즈 47 *
DoomGuy 46
기흥역지웰푸르지오 46
바른생각 39
차 한잔의 여유 (다시 제출) 37
매직AI 36
MJFool 34
123 34
킹갓제너럴엠페러충무공마제스티멘사미스터영 34
아무거나 32
전투력측정기 31
리듬!파워!집중력! 24
(예제)알파고가 되고 싶은 AI고 22
Snow 8 *
GetJinxed 0 *

2018. 04. 21

이름 승점 비고
류몬부치 105
킹갓제너럴엠페러충무공마제스티멘사미스터원 103
Hard_Coded_AI 97
젤다가하고싶어요 95
킹갓제너럴엠페러충무공마제스티멘사미스터최 91
1Q86 90
I∀ 90
미래가제트 28호기 89
구경왔어요 (째재재재재제출) 85
방제가 있어야 봇쏴짐 84
넥슨은 다람쥐를 뿌려라 83
어떤AI 79
발로짜도가는8강 79
안녕하세요 게임기획자입니다. 79
KAKASHKA 78
AI조류인플루엔자 74
DoomGuy 72
(예제)당신의 패턴을 파악했다 71
항상 1만 내는 AI 70 *
DarkFlameDragon 68
:thinking_face: 65
머호봇 63
야생의숨결오디세이스타얼라이즈 63 *
기흥역지웰푸르지오 4.0 62
확률놀이꾼 60
tEST 57
바른생각 49
킹갓제너럴엠페러충무공마제스티멘사미스터영 49
느긋하게있어! 48
매직AI 47
한놈만조진다 47
MJFool 44
아무거나 43
차 한잔의 여유 (다시 다시 제출) 43
Stupe.py 41
리듬!파워!집중력! 37
123 36
전투력측정기 30
(예제)알파고가 되고 싶은 AI고 30
Snow0421 21 *
여러분의 AI와 규칙을 분석하여 시험기간에 뭐하는 거지 15 *
Snow 11 *
GetJinxed - *

마지막 중간 집계 공개 입니다.
*: 잘못된 카드를 내거나 익셉션이 발생하거나 1초 시간 제한을 초과하거나 실행할 수 없는 문제가 발생했습니다.

랜덤 금지

random 모듈이나 Math.random 등의 사용이 금지됩니다. int(time.time()%1*10)같은 시간을 이용한 랜덤도 금지됩니다. 하지만 완전히 "랜덤을 금지"한다고 말할 수는 없는데, 예를 들어 몇 번째 게임의 몇 번째 턴에서 어떤 카드를 낼지 66개의 if문으로 AI를 만든 경우 완전히 랜덤한 AI를 작성할 수 있기 때문입니다.
따라서 이번 대회에서 정확한 제약 사항은 같은 인자가 주어졌을 때 think 함수가 항상 같은 카드를 골라야 한다는 것입니다. 이 조건만 만족한다면 Linear congruential generator나 Mersenne Twister로 랜덤을 구현하여 사용하셔도 괜찮습니다. 단 time이나 Date 사용도 금지되므로 시간으로 seed를 설정하는 것은 룰 위반입니다.

성능 측정

클라우드 서비스를 제공하는 서버에서 테스트를 진행하고 있어, 정확한 CPU 속도를 제공하기 어렵습니다. 아래 코드를 참고해서 성능 비교에 사용해주세요. (4/18 추가)

python:

>>> def f():
...     i = 0
...     t = time.time()
...     while 1:
...             i += 1
...             if time.time() - t > 1:
...                     break
...     return i
...
>>> sum(f() for i in range(10))/10.
3650210.7
>>> def g(n):
...     t = time.time()
...     i = 0
...     while i < n:
...              i += 1
...     return time.time() - t
...
>>> g(f())
0.23052167892456055

javascript:

let f = () => {
  const t = Date.now();
  i = 0;
  while(1) {
    i ++;
    if (Date.now()-t > 1000)
      break;
  }
  return i
};

let s = 0;
for(let i = 0; i < 10; i ++) {
  s += f();
}
console.log(s/10);

let g = (n) => {
  const t = Date.now();
  i = 0;
  while(i < n)
    i++;
  return Date.now() - t;
}

console.log(g(f())/1000);

실행결과:

12043876.3
0.044

개인정보 수집 이용과 관련된 안내

AI 챌린지 코드 제출을 위해 보내주신 이메일은 대회 운영 목적으로만 이용하며, 대회 종료 후 30일 이내에 모두 삭제합니다.

문의

대회와 관련된 문의는 ipknhama@gmail.com 으로 보내주십시오. 이 페이지는 문의에 따라 내용 수정이 일어날 수 있습니다. 변경 사항은 아래 버전을 확인하세요.

버전 12

2018-04-21:20일 중간 집계 업데이트.
2018-04-20:19일 중간 집계에 버그로 빠진 AI가 있어 랭킹 다시 계산 및 업데이트.
2018-04-20:19일 중간 집계 업데이트.
2018-04-19:18일 중간 집계 업데이트.
2018-04-18: 17일 중간 집계 업데이트. 성능 측정 관련 정보 업데이트.
2018-04-17: 공개 AI와 test 페이지에서 대전해볼 수 있게 되었습니다.
2018-04-17: 16일 중간 집계 업데이트. 빌트인 모듈에 대한 설명 보강.
2018-04-15: 14일 중간 집계 업데이트.
2018-04-14: 13일 중간 집계 업데이트.
2018-04-13: 대회 룰의 예에 있던 설명 버그 수정.
2018-04-13: 랜덤 금지에 대한 설명 추가, think는 결정론적 알고리즘이어야 한다는 설명 추가, .js는 .j로 확장자 변경 후 압축.
2018-04-12: 공개