xwMOOC 데이터과학
숫자 맞추기 문제 개요 1
마인크래프트 챗봇이 숫자를 내면 플레이어가 숫자를 맞추는 문제다. 물론 가장 적은 횟수로 문제를 맞춰야 한다.
- 마인크래프트 서버가 1 에서 100 사이 숫자를 난수로 하나 생성시킨다.
- 플레이어가 서버가 낸 숫자를 맞춘다.
- 한번에 맞출 확률이 당근 $\frac {1} {100}$ 확률이기 때문에 서버가 플레이어가 숫자를 맞추도록 추가 정보를 채팅창을 통해 제공한다.
- 채팅창에 플레이어가 숫자를 맞추면 프로그램은 종료된다.
- 숫자가 플레이어가 제시한 숫자보다 큰지 적은지 정보를 채팅창을 통해 제공한다.
R 마인크래프트 코드
균등분포에서 0과 1사이 숫자를 하나 생성하고 이를 number
로 저장하고 chatPost
를 통해 챗팅 숫자 문제 맞추기를 시작한다.
숫자를 맞출 때까지 while
루프를 돌린다. 채팅창에 숫자를 입력하게 되면 입력된 숫자가 서버가 생성시킨 number
와 같은지 확인한다. 만약 맞추지 못한다면 추가적인 정보를 제공하서 다시 채팅창에 숫자를 맞추도록 정보를 제공한다. 그리고 숫자를 맞추게 되면 프로그램을 종료시킨다.
# 0. 환경설정 ------------------------------
library(miner)
mc_connect("127.0.0.1")
# 1. 숫자생성 ------------------------------
number <- ceiling(runif(1) * 100)
chatPost("저는 챗봇입니다. 1 에서 100사이 숫자를 하나 골랐습니다. 그 숫자를 맞춰보세요. t키를 눌러 챗팅 윈도우에 답하세요.")
# 2. 숫자맞추기 ------------------------------
while (TRUE) {
## 가장 최근 챗팅 메시지가 있는지 폴링
msg <- getChatPosts()
## 마지막 폴링이후 메시지가 없다면 아무일도 수행하지 않음.
if (nrow(msg) > 0) {
## 모든 메시지에 대해 반복 돌림.
for (msgi in seq_len(nrow(msg))) {
## 메시지가 숫자인지 확인
numi <- suppressWarnings(as.numeric(as.character(msg[msgi, 'message'])))
if (!is.na(numi)) {
## 숫자 비교
if (number == numi) {
chatPost('훌륭합니다. 맞췄습니다!!!')
} else {
chatPost(sprintf("아니요, 숫자는 %s 보다 %s 다시 맞춰보세요!",
numi, ifelse(numi > number, '작아요.', '큽니다.')))
}
}
}
}
}