배경
위협 ( M achine E ducable N은 oughts ND C 로시스 E ngine) 1960 년 영국 컴퓨터 과학자 도날드 미치에 의해 생성 된 게임 삼목위한 기초 얕은 기계 학습 알고리즘이다. 원래는 보드 위치로 레이블이 지정되고 색깔의 구슬이 포함 된 304 개의 성냥갑으로 구현되었습니다 (9 가지 색상 중 하나를 사용하여 가능한 움직임을 나타냄). Michie는이 304 개의 성냥갑이 보드의 모든 움직임 조합에 충분하다고 계산했습니다.
더 수학적으로 N & C 보드에 19,683 개의 Noughts, Crosses and Blanks 조합이 있다는 것을 알 수 있습니다. 그러나 그는이 숫자를 줄이는 방법을 계산했습니다 (알고리즘의 속도를 높이고 성냥갑을 줄이는 것입니다!). 첫째, 그는 다음과 같이 불가능한 모든 동작을 제거했습니다.
-------
|X|0|X|
| |0| |
|X|X| |
-------
(2 개의 삼목과 4 개의 십자가)
다음으로, 그는 회전을 보상했습니다. 예를 들어 성냥갑에 다음이 표시됩니다.
-------
| |0|0|
|X| |X|
| |0| |
-------
우리는 같은 상자를 사용할 수 있습니다
-------
| |X| |
|0| |0|
| |X|0|
-------
따라서, 상기 착색 된 비드는 절대적인 것이 아니라 상대적인 위치를 나타낸다. 예를 들어, 빨간색 구슬이 왼쪽 상단을 의미한다고 말하면 상자 상단의 이미지를보고 다음을 참조하십시오.
-------
| |0|0|
|X| |X|
| |0| |
-------
그래서 우리는 이것이 보드라면 빨간 구슬은 다음을 의미합니다.
-------
|R|0|0|
|X| |X|
| |0| |
-------
그러나 이것이 보드라면 :
-------
| |X| |
|0| |0|
| |X|0|
-------
빨간 구슬은
-------
| |X|R|
|0| |0|
| |X|0|
-------
이러한 변환은 회전 및 반전에 적용됩니다 (대각선을 포함한 모든 방향으로). 다시 한번,이 방법으로 각 성냥갑 만 저장하면됩니다. 각 변환마다 별도의 가상 상자를 만들지 마십시오!
Michie의 또 다른 단순화는 컴퓨터가 먼저 작동하도록하는 것입니다. 이런 식으로 그는 모든 첫 번째 레벨의 움직임을 제거하고 나머지 상자의 약 5 분의 1을 제거 할 수있었습니다. 마지막으로 그는 모든 게임 종료 상자를 제거했습니다 (이 단계에서 더 이상 '콘텐츠'또는 이동이 필요하지 않기 때문에).
이제 알고리즘 자체에 대해 매우 간단합니다.
- 먼저 구슬의 색이 무엇을 나타내는 지 결정하십시오. 보드의 각 공간을 나타내려면 9 가지 색상이 필요합니다.
- 게임을 시작할 때, 304 개의 성냥갑 각각에 구슬이 들어 있습니다. 구슬은 임의의 색상이지만 (복제물은 괜찮습니다) 이동할 수 있어야합니다 (보드 상태 이미지가 오른쪽 가운데에 'O'를 표시하면 가운데를 나타내는 구슬을 사용할 수 없습니다- 권리).
- MENACE (X) 턴일 때마다 현재 보드 위치 (또는 일부 변형)가 인쇄 된 성냥갑을 찾습니다.
- 성냥갑을 열고 무작위로 구슬을 선택하십시오.
- 성냥갑의 이미지를 얻기 위해 보드 상태가 어떻게 바뀌 었는지 확인하십시오 (예 : 시계 반대 방향으로 90도 회전). 그런 다음 해당 변형을 비드에 적용합니다 (예 : 왼쪽 상단이 왼쪽이 됨).
- 해당 사각형에 X를 놓습니다. 성냥갑에서 선택한 구슬을 제거합니다. 결과적으로 상자가 비어있는 경우 상자에 3 개의 임의 (가능한) 구슬을 넣고 이동을 위해 그 중 하나를 선택하십시오.
- 게임이 끝날 때까지 3-6을 반복하십시오.
- MENACE가 게임에서 이겼다면 MENACE가 가져간 모든 성냥갑으로 돌아갑니다. 그런 다음 해당 이동에 사용한 색상 비드를 추적하십시오. 박스에 그 비드의 두 가지 색상을 넣으십시오.
- MENACE가 게임을 잃어버린 경우, 아무 것도 하지 마십시오 ( 제거한 구슬을 교체 하지 마십시오 ).
- MENACE가 게임을 그렸다면 각각의 움직임에 사용 된 구슬을 교체하되 추가로 추가하지 마십시오.
이것은 우리에게 매우 간단하지만 구현하기 어려운 알고리즘을 남깁니다. 이것은 당신의 도전의 기초를 형성합니다.
여전히 혼란 스러우면 http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/을 참조하십시오 . 이 알고리즘에 대해 처음 알게되었을 때 읽은 내용입니다
도전
컴퓨터와 함께 틱택 토 게임을하십시오. 각 단계에서 모든 성냥갑의 내용을 출력하십시오.
입력
- 프로그램 시작시 MENACE에 대해 몇 개의 게임을하고 싶은지 알려주는 숫자
- 그런 다음 MENACE의 첫 번째 회전 후 이동을 두 개의 문자열로 입력합니다. 첫 번째 문자는 Y 축을 참조하는 "L", "R"또는 "M"(왼쪽, 오른쪽 또는 가운데)입니다. 그런 다음 X 축을 참조하여 다른 문자 (다시 "L", "R"또는 "M")를 입력합니다. 모든 움직임과 게임에 대해 반복하십시오.
출력
- 새로운 게임이 시작될 때마다 "새로운 게임"이 출력됩니다.
- 플레이어가 움직일 때마다 보드를 적절한 형식으로 출력하십시오. 예쁘게 보일 필요는 없습니다 (예를 들어 보드의 위치를 나타내는 배열의 배열이 좋습니다).
- 플레이어가 움직일 때마다 MENACE가 움직입니다. MENACE 이동 후 보드 출력
- 각 게임 후에 모든 304 성냥갑의 내용을 출력하십시오. 구슬은 문자, 색상 이름, 문자 또는 원하는 문자열 또는 정수 (포인터, 익명 함수 등)로 표시 될 수 있습니다.
규칙
- 이것은 code-golf 이므로 바이트 단위의 최단 답변이 이깁니다.
- MENACE의 응답을 본 후 동작을 입력 할 수 있어야합니다. '이 기능으로 모든 움직임을 전달하고 게임이 어떻게 진행되는지 지켜보십시오'.
- 게임 사이에 보드를 비워야합니다.
- 게임간에 성냥갑을 비워서는 안됩니다 (기계 학습이 재설정됩니다).
- 304 개의 성냥갑이 있어야합니다. 누구나 19,683 개의 모든 성냥갑으로이 알고리즘을 구현할 수 있지만 학습 속도는 느립니다 ( 유용한 내용으로 모든 게임을 얻으 려면 많은 게임이 필요 하기 때문에).
- 출력은 합리적인 형식으로 될 수 있으며 PPCG 표준에 따라 입력 할 수 있습니다 (규칙 2를 준수하는 한). 입력 형식을 조정해야하는 경우 ( ' 입력 '섹션에 설명 된대로 ) 의미가있는 한 괜찮습니다.
- 플레이어가이기거나 (세로, 가로 또는 세로로 3 개씩 획득) 또는 무승부가있는 경우 (보드가 꽉 차서 승자가없는 경우) 게임이 종료됩니다.
- MENACE는 가능한 이동을해야하고 (각 성냥갑 안에 가능한 구슬 만 있어야 함), 도전을 위해 사용자의 입력을 확인할 필요는 없습니다. 그들이 잘못 입력하면 프로그램은 무엇이든 할 수 있습니다 (완전히 미쳤거나 오류가 발생하는 등)-입력이 올바른 것으로 가정 할 수 있습니다.
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.