Сапер Солвер


34

Мы уже создали поля Минного тральщика , но кто-то действительно должен смести эти сгенерированные мины, прежде чем взорвется ПКГ!

Ваша задача - написать Солитер, который будет совместим со слегка измененной версией принятого решения «Рабочий сапер» (действия разделены пробелами, чтобы можно было увеличить поля).

Входные данные: поле Сапер, поля разделены пробелами. Первая строка обозначает общее количество мин.

  • 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

Out (любой из них):

1 1 2
0 0 2
0 1 3

В:

2
x x x
1 ! x
1 1 x

Out (любой из них):

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

Out (любой из них):

1 1 5
1 0 2

В:

2
x x x
2 3 1
! 1 0

Out (любой из них):

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

Mathematica

Все еще не играли в гольф. Требуется еще немного поработать над форматами ввода / вывода.

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.