Connect 4의 당첨자 결정


19

부분적으로 채워진 Connect 4 그리드 (7x6)가 제공됩니다.

O X             
O X          
X O X O     O
X O X O   X X
O X X X O O X
O O O X X O X

(입력은 1D 또는 2D 배열 및 문자 또는 숫자 등으로 제공 될 수 있습니다.)

그 가정

  • X는 게임을 시작했다.
  • 아직 아무도 이겼습니다.
  • 플레이어는 지금까지 잘 플레이하지 않았지만 이제는 최적의 전략을 사용합니다.
  • 입력 그리드에 결함이 없습니다.

어떤 플레이어가 이길 지 (또는 무승부)를 나타내는 단일 값을 출력해야합니다

코드 골프 도전; 가장 짧은 코드가 승리합니다. 프로그램은 합리적인 시간 내에 출력을 실제로 계산할 필요는 없지만, 한정된 시간 내에 출력이 올바르게 얻을 수 있음을 증명할 수 있어야합니다.



@ MartinBüttner 그것은 내가 다운 투표를 받겠다는 것을 의미합니까, 아니면 내 질문을 여기에 남겨도 괜찮습니까?
ghosts_in_the_code

4
그것은 단지 질문이 관련되어 있다는 것을 의미합니다. 링크를 게시하는 목적은 서로의 "링크 된"사이드 바에 문제가 나타나기 때문에 사람들이 관련 문제를보다 쉽게 ​​찾을 수 있습니다. 귀하의 질문을 중복으로 간주했다면 그렇게 말했거나 방금 닫았을 것이므로 걱정하지 마십시오. :)
Martin Ender

2
"최적의 놀이"가 잘 정의되어 있습니까? 그렇다면 최적의 재생을위한 알고리즘을 설명하는 링크를 제공 할 수 있습니까?
Rainbolt

2
@Rainbolt 그것은 해결 되었고 완벽한 알고리즘 도 존재합니다 . 자세한 내용은 Wikipedia 를 참조하십시오.
ghosts_in_the_code

답변:


16

119 118 117 바이트

에 +4 포함 -0p

STDIN에 공백으로 채워진 회전 보드 제공 (중력은 돌을 오른쪽으로 당깁니다)

connect4.pl
  OXXX
   XOO
    OX
  OOXX
  XXXO
XXOOXO
OOXXOO
^D

connect4.pl:

#!/usr/bin/perl -p0
y/XO/OX/if$^S|y/X//>y/O//;$_=$$_||=/Z@{[map"|O".".{$_}O"x3,0,5..7]}/sx||s% (?! )%$_="$`X$'";do$0%eg?/1/?3:1+/2/:2

3움직일 플레이어가 이기고, 움직일 1플레이어가 패한 경우에 인쇄 합니다 2.

오래된 펄에서는 리터럴 ^S을 사용하여 1 바이트를 얻을 수 있습니다 . 극도의 비 효율성을 염두에 두지 않으면 $$_||=(조옮김 테이블)을 제외하고 6 바이트를 더 얻을 수 있습니다. 당신이 밖으로 나가면 $_=결과 대신에 플레이 할 곳을 보여줍니다 (플레이어가 1있다면 플레이 하고 승리하십시오. 플레이어 2가 있거나 플레이하면 무승부 3)

완전한 minimax 트리를 빌드하고 평가합니다. 보드가 이미 충분히 채워져 있지 않으면 메모리와 시간이 부족합니다.


2
왜 지구상에서 누군가가 공감 했습니까? 골프를 정말 놀랍습니다 (펄와 나는 골프와 같은 해결책을 얻는 것은 이며 매우 하드 - 나는 확실히 다른 펄 내가 그 코드를 가지고 올 수 있었다 알고 골프를 치는 사람이 아니에요). 그리고 코드에는 필요한 동작이 있습니다.
Dada

이로 인해 뇌가 아프다. +1!
levelonehuman

@Dada이 답변이 다운 투표되었다는 것을 어떻게 알 수 있습니까? 3을 투표로
보았습니다

@RosLuP이 게시물을 처음봤을 때 1 개의 downvote가있었습니다. 또한 충분한 담당자가 있으면 게시물의 투표 수와 투표 수를 확인할 수 있습니다.이 경우 이제 4 상승과 1 하락이 있습니다.
Dada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.