Саперник


34

Ми вже генерували поля міночистача , але хтось дійсно повинен змітати ці згенеровані міни, перш ніж PCG підірветься!

Ваше завдання полягає в тому, щоб написати міночислювач, сумісний із дещо зміненою версією прийнятого рішення "Робочий тральщик" (дії розділені пробілами, щоб мати можливість отримати більші поля).

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

  • x: Недоторканий
  • !: Прапор
  • Цифра: кількість мін навколо цього поля

Приклад:

10
0 0 1 x x x x x
0 0 2 x x x x x
0 0 2 ! x x x x
0 0 1 2 x x x x
0 0 0 1 x x x x
1 1 0 2 x x x x
x 1 0 2 x x x x
1 1 0 1 x x x x

Вихід: Ваш наступний крок у форматі action row column(починаючи з нуля)

Дійсні дії:

  • 0: Відкрий це
  • 1: Поставте прапор

Приклад:

0 1 2

Правила:

  • Ви пишете повну програму, яка приймає одне поле як вхідне (або STDIN, або аргументи командного рядка) і виводить одну дію (STDOUT). Таким чином, ви не можете зберегти стану, за винятком !.
  • Ваш вибір повинен відповідати найкращим шансам на виживання. (тобто, якщо є 100% безпечний хід, прийміть це)
  • Це ; виграє найкоротше рішення (у байтах UTF-8)

Тести:

Ці тести служать метою тестування на поширені чіткі ситуації; Ваша програма повинна працювати для кожного тестового поля.

В:

4
x x x x
1 2 x x
0 1 2 x
0 0 1 x

Вихід (будь-який із них):

1 1 2
0 0 2
0 1 3

В:

2
x x x
1 ! x
1 1 x

Вихід (будь-який із них):

0 0 0
0 0 1
0 1 2
0 2 2
1 0 2

В:

10
x x x x x x x x
1 3 3 x x x x x
0 1 ! 3 3 4 x x
0 2 3 ! 2 3 x x
0 1 ! 2 2 ! x x

Вихід (будь-який із них):

1 1 5
1 0 2

В:

2
x x x
2 3 1
! 1 0

Вихід (будь-який із них):

0 0 1
1 0 0
1 0 2

Приємно! 1) Можливо, для тестування хтось повинен написати тестовий джгут: даючи поле, він друкує кожен зроблений крок і перемагає програма. Програма повинна вигравати на картах без будь-якої двозначності. 2) Цікаво, чи хтось буде використовувати прапор. Здається, це ніколи не повинно бути необхідним.
Клавдіу

Для першого тесту. Чому ви можете переїхати до 0 0 2або 0 1 3. Я не бачу, як будь-який із них вважатиметься безпечним. (Я не повинен бути досить хорошим на тральщику ...)
FDinoff

1
Можливо, Fабо Pпрапор виглядає краще, ніж !:)
VisioN

1
@JonathanVanMatre Поле порожнє, але гарантовано, що ваше перше відкриття не є шахтою, оскільки міни розміщуються після першого клацання :)
TimWolla

2
Факт забави: Є лише обмежена кількість дощок (принаймні у версії XP, яка є канонічною у конкурентній сцені). Дошка зміщується навколо, коли ви клацаєте перше місце, щоб переконатися, що ви не клацаєте шахту, але крім того, що вже вирішено, яку дошку ви будете використовувати.
підземниймонорельс

Відповіді:


17

Математика

Досі не в гольф. Потрібно ще трохи працювати над форматами вводу / виводу.

t = {{0, 0, 1, x, x, x, x, x}, {0, 0, 2, x, x, x, x, x}, {0, 0, 2, F, x, x, x, x}, 
     {0, 0, 1, 2, x, x, x, x}, {0, 0, 0, 1, x, x, x, x}, {1, 1, 0, 2, x, x, x, x}, 
     {x, 1, 0, 2, x, x, x, x}, {1, 1, 0, 1, x, x, x, x}};
(*Sqrt[2] is  1.5*)
c = Sequence; p = Position;
nums = p[t, _?NumberQ];
fx = Nearest[p[t, x]];
flagMinus[flag_] := If[Norm[# - flag] < 1.5, t[[c @@ #]]--] & /@ nums
flagMinus /@ p[t, F];
g@x_List := Tr[q[#] & /@ x]
eqs = MapIndexed[t[[c @@ (nums[[#2]][[1]])]] == g[#1] &, (fx[#, {8, 1.5}] & /@nums)];
vars = Union@Cases[eqs, _q, 4];
s = Solve[Join[eqs, Thread[0 <= vars < 2]], vars, Integers];
res = (Transpose@s)[[All, All, 2]];
i = 1; plays = Select[{i++, #[[1]], Equal @@ #} & /@ res, #[[3]] &];
Flatten /@ ({#[[2]] /. 1 -> F, List @@ vars[[#[[1]]]] - 1} & /@ plays)

(*
{{0, 0, 3}, {F, 1, 3}, {F, 2, 4}, {0, 3, 4}, {0, 4, 4}, 
 {F, 5, 4}, {F, 6, 0}, {F, 6, 4}, {0, 7, 4}}
*)

Редагування: Бонусна доріжка

Я створив інтерактивний майданчик, який обчислює ймовірність бомби, обчислюючи всі можливі рішення для заданої конфігурації:

Графіка математики

Інструкції з її тестування без встановлення Mathematica:

  1. Завантажте http://pastebin.com/asLC47BW і збережіть його як * .CDF
  2. Завантажте вільне середовище CDF з Wolfram Research за адресою https://www.wolfram.com/cdf-player/ (не маленький файл)

Слайдер змінює розміри дошки. Це просто схематична програма, не повністю перевірена, повідомляйте про помилки. Я не реалізував функцію "загальна кількість доступних бомб на борту". Це вважається нескінченним.

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