Грайте в ідеальну гру 4x4 Hex


10

Фон

Hex - це абстрактна стратегічна гра для двох гравців, що грається на K×Kромбі шестикутної плитки. Дві протилежні сторони ромба забарвлені в білий колір, а інші два чорні, а два гравці, чорно-білі, по черзі розміщують маркер свого кольору на незайнятій плитці. Гравець, якому вперше вдається побудувати шлях між протилежними сторонами їх кольору, є переможцем. Відомо, що гра не може закінчитися внічию, і що перший гравець має виграшну стратегію незалежно від розміру дошки (детальніше див. На сторінці Вікіпедії).

Завдання

У цьому виклику ми фіксуємо розмір плати на K = 4і представляємо дошку як наступну сітку. Товсті лінії позначають сусідні плитки.

Сітка 4x4.

Ваше завдання - створити виграшну стратегію для першого гравця, яку ви можете вибрати як чорного, так і білого. Це означає, що який би законний хід не робив противник, ваша гра повинна призвести до перемоги. Ваш вхід - це ігрова позиція (розташування жетонів на дошці), а ваш вихід - законний хід у форматі, зазначеному нижче. Якщо ви хочете знайти стратегію виграшу самостійно, не читайте цей спойлер:

Окреслити одну з можливих стратегій виграшу, якщо припустити, що білі мають перше місце. Спочатку виберіть 5. Після цього, якщо у вас є шлях від 5 до нижнього рядка АБО чорний колір вибирає 0 або 1 в будь-якій точці, відповідь, вибравши те, що 0 або 1 є вакантним. Якщо чорний колір обирає 9 або 13, виберіть 10, а потім вільний від 14 або 15 розмір. Якщо чорний колір не вибирає 9, 13 або 14, виберіть 9 і наступне, що з 13 або 14 є вакантним. Якщо чорний колір вибирає 14, відповідайте, вибравши 15. Далі виберіть 10, якщо він є вакантним; якщо чорний вибирає 10, відповідайте 11. Якщо чорний, то вибирає 6, відповідайте 7, а наступне, що з 2 або 3 є вакантним. Якщо чорний колір не вибирає 6, виберіть його, щоб у вас був шлях від 5 до нижнього ряду.

Вхід і вихід

Ваш вхід - це рядок з 16 символів WBE, які означають білий, чорний і порожній. Вони представляють плитку дошки, як перераховано вище. Ви можете вибрати метод введення (який також визначає спосіб виведення) з наступного:

  1. Вхід з STDIN, вихід на STDOUT.
  2. Введіть як один аргумент командного рядка, виведіть в STDOUT.
  3. Введіть як 16 односимвольних аргументів командного рядка, виведіть в STDOUT.
  4. Введіть як аргумент названої функції, виведіть як зворотне значення.

Ваш вихід представляє плитку, на яку ви розміщуєте свій наступний маркер, оскільки настає ваша черга рухатися. Ви можете вибрати наступні вихідні формати:

  1. Нульовий індекс (як використовується на малюнку вище).
  2. Єдиний індекс.
  3. Вхідна рядок з одного Eзамінюється який з Wабо Bви вибрали для вашого плеєра.

Правила

Ваша стратегія повинна бути детермінованою. Від вас не потрібно правильно обробляти ігрові позиції, недоступні на порожній дошці, використовуючи стратегію, або позиції, які вже виграють для будь-якого гравця, і ви можете вийти з ладу на них. І навпаки, на дошках, доступних за допомогою вашої стратегії, ви повинні повернути законний крок.

Це код-гольф, тому виграє найменший байт. Стандартні лазівки заборонені.

Тестування

Я написав контролер Python 3 для перевірки записів, оскільки це було б надзвичайно нудно робити вручну. Ви можете знайти його тут . Він підтримує перші три вхідні формати та функції Python 3 (функції інших мов повинні бути загорнуті в програми), усі три вихідні формати та обидва плеєри. Якщо стратегія не виграє, вона виведе програшну гру, яку вона знайшла, тож ви зможете налаштувати програму.


Цей виклик нагадує мені, що я намагався стиснути AI з тичним носком, коли я писав програми для калькулятора. ticalc.org/archives/files/fileinfo/354/35408.html
Sparr

2
Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.Я мав би давно виграти, чи я помиляюся?
Себастьян Хьоффнер

@ SebastianHöffner Це схоже на помилку в контролері. Я спробую це виправити, коли матиму час.
Zgarb

@ SebastianHöffner Тепер помилку слід виправити.
Згарб

Відповіді:


6

Marbelous, 973b

Це наївна реалізація натяканої стратегії у питанні. Він очікує, що дошка буде надана як 16 параметрів командної лінії / материнської плати, hex.mbl B W E E E W E E E B E E E E E Eі вона виведе позицію нульового індексації наступного руху.

00 }1 }0
&G B? W!
&0 &G &G
!!
00 }0 }1
&H B? W!
&1 &H &H
!!
.. }D .. }9 }9 }D }E }A }D }9 }A .. }E }F }5
}9 B! }E E? W? E? .. E? B? B? W? .. E? .. E?
B! ?0 B! &M &N &O E? &I \\ .. &J .. &K E? &5
?0 ++ ?0 &9 .. &D &P &A &I /\ &J .. &E &L !!
++ .. ++ !! .. !! &E !! \/ &L /\ &K !! &F
\\ .. // .. .. .. !! .. .. \/ .. \/ .. !!
.. =3 \/
&M /\ &N
\/ &O /\ &P
}0 }1 }6 .. }6 .. }7 &7 }2 }3 }A }A }B }E }F
..
..
..
..
..
..
..
..
..
.. .. .. .. .. .. .. .. .. .. .. .. .. B? W!
.. .. .. .. .. .. .. .. .. .. .. .. .. &Q &Q
.. .. .. .. B? .. E? W? E? .. E? B? E? &F \/
.. .. .. &S /\ &T &S &T &U E? &A &R &R !!
.. .. .. &7 .. .. \/ .. &2 &V !! &B \/
.. .. .. !! .. .. &U /\ &V &3 .. !!
.. .. .. .. .. .. .. .. .. !!
.. .. ..
.. .. E?
E? .. &6
&X E? !!
!! &Y
.. !!
}4 }8 }C
\/ \/ \/
30 30 31 31 32 33 35 36 37 39 31 30 31 31 31 33 31 34 31 35
&0 &X &1 &Y &2 &3 &5 &6 &7 &9 &A &A &B &B &D &D &E &E &F &F
:W?
}0
^4
=1
{0
:B?
}0
^0
=0
{0
:E?
}0
^1
=0
{0
:W!
}0
^4
=0
{0
:B!
}0
^0
>0
{0

Я думаю, що я, мабуть, можу зіграти близько 200 символів із цього, покращивши розгалуження та усунення повторного використання коду.


Я додав опцію для аргументу 16 командного рядка та оновив скрипт перевірки, тому це рішення можна перевірити.
Згарб

Marbelous +1 (PPCG думає, що додавання цих персонажів покращило коментар)
Rohan Jhunjhunwala

1

Пітон 3, 100б

b=input()
i=b.find('B')
if b[i]in'BW'and'E'in b:i-=1+(b[i-1]is'W')*4
print((b[:i]+'B'+b[i+1:])[:16])
  • Гравець: ЧОРНИЙ
  • Метод: STDIN / STDOUT, MODIFIED_BOARD

Стратегія полягає в тому, щоб спочатку шукати Bна дошці. Якщо немає, це повертається -1, що в python те саме, що last index. Таким чином, на порожній дошці буде мій перший індекс index=-1, саме там я починаю рухатись.

Якщо поле зліва ( index-1) вільне, наступний мій хід йде туди. Якщо його прийнято, я піднімаюсь вліво. Мені ніколи не потрібно рухатись вгору: якщо я це роблю, я втрачаю темп і програю гру.

На повному пансіонаті ( Eніде) я не рухаюся.

Спочатку printздається трохи дивним: мені потрібно побудувати нову дошку (що я роблю за допомогою нарізки), але потім мені потрібно вирізати 16 символів. Це релікт, оскільки я працюю з негативними показниками і b[i+1:], таким чином, повертаю дошку з дірками та інше, що я очікую, що робить важливим обрізати залишок. Іншим способом було б працювати з позитивними показниками, наприклад, беручи (b.find('B')+16)%16, але (+16)%16це на один байт більше ()[:16].

Безголівки:

board = input()
index = board.find('B')
if board[index] in 'BW' and 'E' in board:
    index -= 1 + (board[index-1] is 'W') * 4
print((board[:index] + 'B' + board[index+1:])[:16])

Тест

Під час запуску тестового набору шестигранних контролерів я зіткнувся з дивним поведінкою:

OUT: EEEEEEEEEEEEEEEB
OUT: WEEEEEEEEEEEEEBB
OUT: WWEEEEEEEEEEEBBB
OUT: WWWEEEEEEEEEBBBB
OUT: WWWWEEEEEEEBBBBB
OUT: WWWWWEEEEEBBBBBB
OUT: WWWWWWEEEBBBBBBB
OUT: WWWWWWWEBBBBBBBB
OUT: WWWWWWWWBBBBBBBB

Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.

Я думаю, що я або мав би виграти після 4-го розвороту, або відповідь тієї ж дошкою на повну дошку має бути правильною відповіддю. Не впевнений, що там піде не так, не занурився набагато глибше - я просто хотів перевірити, чи вкриваються всі "особливі" справи. Але оскільки мені не потрібно приховувати ситуації, коли хтось починає пробіл 4 або близько того, це все одно не має значення.

85б

Однак, якщо я дозволю собі не перевіряти повний пансіон (тобто виходжу з нього, 'E' in bя можу додатково спростити код, щоб використовувати лише 85 байт:

b=input();i=b.find('B')
if i!=-1:i-=1+(b[i-1]is'W')*4
print((b[:i]+'B'+b[i+1:])[:16])

Це призведе до наступного:

Incorrect response 'WWWBWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.

Це можна чи не можна вважати, і оскільки я виявив, що це не дійсний крок, я вирішив піти на більш довгу, але більш правильну відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.