Визначте переможця 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
Це просто означає, що питання пов'язані між собою, нічого більше, нічого менше. Мета опублікування посилання полягає в тому, щоб виклики з'являлися на бічній панелі "Зв'язані" один для одного, щоб люди могли легше знаходити пов'язані проблеми. Якби я вважав ваше запитання дублікатом, я би сказав так (або просто закрив його), тому не хвилюйтеся. :)
Мартін Ендер

2
Чи добре визначена "оптимальна гра"? Якщо так, чи можете ви надати посилання, що описує алгоритм оптимальної гри?
Rainbolt

2
@Rainbolt Це було вирішено і існують також досконалі алгоритми . Докладніше читайте у Вікіпедії .
ghosts_in_the_code

Відповіді:


16

Perl, 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нічия.

Для старих perls ви можете скористатися буквалом, ^Sщоб отримати один байт. Якщо ви не заперечуєте проти надзвичайної неефективності, ви можете залишити $$_||=(таблицю транспозиції) і набрати ще 6 байт. Якщо ви не вийдете, $_=це покаже вам, де грати замість результату (грайте далі 1та вигравайте, якщо такий є, грайте далі 2та малюйте, якщо є такий, або грайте на будь-який 3і програйте)

Створює та оцінює повне мінімакс-дерево. У вас не вистачить пам’яті та часу, якщо дошка вже досить добре заповнена.


2
Чому на землі хтось зголосився? Гольф по-справжньому дивовижний (я гольфу з перлом, і отримати таке рішення надзвичайно важко - я не впевнений, що будь-який інший гольфіст Perl, який я знаю, міг би придумати цей код). І код має необхідну поведінку.
Дада

Це болить мій мозок. +1!
levelonehuman

@Dada, як ти знаєш, ця відповідь знищена? Я бачу 3, як голосують ...
RosLuP

@RosLuP Коли я вперше побачив цю публікацію, вона мала 1 голос. Крім того, коли у вас є достатня кількість представників, ви можете бачити, скільки голосів "за" і "вниз" має публікація: у такому випадку зараз вона має 4 "вгору" і "1".
Дада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.