Сапер - игра-головоломка, в которой мины спрятаны вокруг доски с неописуемыми тайлами с целью определения местоположения всех мин. Нажатие на мину проигрывает игру, но нажатие на любую другую плитку покажет число от 0 до 8, которое указывает, сколько мин непосредственно окружает ее.
Для данного числа вы должны отобразить случайную * возможную комбинацию пустых тайлов и мин, окружающих его. Это должно быть в виде массива 3х3. Центральная плитка должна быть числом мин, взятых в качестве входных данных.
* Должен иметь ненулевой шанс для всех комбинаций.
Примеры
_ = blank square
X = mine
0
___
_0_
___
1
_X_
_1_
___
1
___
_1_
X__
___
_1_
__X
4
_X_
X4X
_X_
4
X_X
_4_
X_X
4
___
X4X
X_X
8
XXX
X8X
XXX
вход
- Количество мин, окружающих центр плитки (0-8)
Выход
- Любая разумная форма вывода, которая отображает массив плиток 3х3
Другие правила
- Каждая комбинация не должна иметь равные шансы на успех. Просто должна быть ненулевая вероятность того, что каждая комбинация произойдет при выполнении вашей программы.
- Любые 2 символа могут быть выбраны для шахты и пустой плитки.
- Это код гольф, программа с наименьшим количеством байтов выигрывает.
code-golf
random
minesweeper
aoemica
источник
источник
1
и0
?Ответы:
Желе , 9 байт
Попробуйте онлайн!
пустой =
1
мой =
0
Обратите внимание, что
1
и0
являются целыми числами.Еще одно замечание: это несколько похоже на 10-байтовый ответ Джонатана Аллана, но на него это никак не влияет, и механизм, если вы обратите пристальное внимание, на самом деле более отличается, чем на первый взгляд.
источник
APL (Dyalog Unicode) ,
2815 байт-13 байт благодаря ngn!
Объяснение:
{...}
Прямая функция (D-Fn)⍵
является ее правильным аргументом.8?8
Раздайте 8 случайных чисел из списка 1..8:⍵≥
аргумент больше или равен каждому из них?⍵,
добавьте аргумент в логический список:5⌽
поверните список на 5 позиций влево, чтобы аргумент находился в центре:3 3⍴
измените список в матрицу 3x3:Попробуйте онлайн!
J 15 байт
Также много байтов благодаря ngn!
Попробуйте онлайн!
источник
(8↑1⍴⍨⍵)[8?8]
->⍵>8?8
(при условии⎕io←0
)3 3⍴1↓,⍵,2 4⍴
->3 3⍴5⌽⍵,
JavaScript (ES6), 67 байт
Более короткая версия, предложенная @tsh
Пустые слоты есть
0
, мины есть1
.Попробуйте онлайн!
Оригинальная пробная версия, 78 байт
Пустые слоты есть
_
, мины есть7
.Попробуйте онлайн!
комментарии
источник
Желе ,
1310 байтВозвращенный список списков имеет отображаемое целое число в центре, окруженное 0 и 1, представляющими мины и пробелы соответственно.
Попробуйте онлайн! (нижний колонтитул довольно печатает массив)
Как?
источник
ŒH
также работает вместоs4
.Pyth,
1614 байтовСохранено 2 байта благодаря isaacg.
Использует места для безопасных мест и цитаты для мин.
Попробуй здесь
объяснение
источник
.[d8
вместо>8+*8d
Oracle 18 SQL, 230 байт
Не язык игры в гольф, но ...
Входное значение находится в таблице
n
со столбцомn
:Попробуйте онлайн - войдите на https://livesql.oracle.com и вставьте его в рабочий лист.
Выход:
Чтобы получить все возможные комбинации (183 байта):
Выход:
источник
Japt, 13 байт
Попытайся
объяснение
источник
QBasic 1.1 ,
206186 байт-20 благодаря DLosc (недавно опубликованная игра в гольф).
Пусто =
0
Мой =
1
Обратите внимание, что
0
и1
являются целыми числами, но я все равно использую STDOUT, так что ...Вывод выглядит так:
Где AH - 0/1, а x - вход.
источник
Древесный уголь , 19 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Используется
0
для шахты,1
для пустого пространства. Объяснение:Peek
возвращает массив строк, которыйSum
просто объединяется, поэтому сначала мы должны привести к целому числу. (Sum(Sum(PeekAll()))
также работает.)Sum
возвращаетсяNone
для пустого массива (первый контур), поэтому единственное безопасное сравнениеNot(Equals(...))
.Random
всегда возвращается0
, хотя в ее документации сказано иначе.Альтернативное решение, было 19 байт, теперь 17 байт после исправления Charcoal:
Попробуйте онлайн! Ссылка на подробную версию кода. Использует
0
для шахты,1
для пустого пространства. Объяснение:Распечатайте исходные данные.
Печать
9
влево. Это перемещает курсор назад к исходному вводу, а также инициирует хотя бы одну итерацию цикла while (в противном случае ввод8
ничего не будет делать).Повторите, пока разница между суммой всех цифр на холсте и 8 не равна нулю:
Замените каждого из окружающих символов случайным образом на
0
или1
.источник
R ,
67 63 6259 байтПопробуйте онлайн!
Использует
1
и0
. Создайтеn* 1 +(8-n)* 0
вектор, перемешайте его, добавьтеn
, создайте большую матрицу, показанную ниже (гдеa...i
обозначены элементы исходного вектора), и извлеките правильную подматрицу, показанную в верхнем регистре:источник
matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Python 2 , 93 байта
Попробуйте онлайн!
0
для пустых;1
для шахты; иn
для себя.источник
iter
умно!Атташе , 51 байт
Попробуйте онлайн!
объяснение
Аналогично ответу Галена на J / APL , основной метод состоит в том, чтобы сгенерировать массив из 1 и 0 с правильным числом мин, вставить вход, добавив его в конец, вращая массив так, чтобы вход находился в центре, а затем преобразование в матрицу 3х3.
Часть 1: генерация двоичного массива
Есть много способов сделать это, но я в основном сталкивался с двумя типами: грубая сила и отбор.
Основной метод грубой силы выглядит следующим образом:
Это генерирует случайные массивы из 8 двоичных цифр (
Random[8&2]
), в то время как их суммы не равны входным{Sum@_/=_2}&_
. Это немного многословно, так как следующие выделенные части кода «просто для того, чтобы он работал»:И я отбросил эту идею.
Выбор интереснее. Основная концепция заключается в использовании
BaseBelow[b, n]
встроенной функции, которая генерирует список всех базовыхb
целых чисел шириныn
(в виде числовых массивов), от0
доb^n-1
. Например,BaseBelow[3, 2]
генерирует все троичные целые числа ширины 2:Мы специально используем
BaseBelow[2, 8]
все двоичные целые числа ширины 8. Они представляют все возможные минные поля любой длины. Это первый шаг.Вторым шагом является выбор всех таких массивов только с
N
1, гдеN
ввод. Моя первая идея состояла в том, чтобы перевести это английское утверждение непосредственно в Attache:Тем не менее, он не только оказался на 1 байт длиннее, чем вышеупомянутый подход, но и очень повторяется - и даже не рандомизирован! Конечно, я мог бы сэкономить 1 байт, реорганизовав
BaseBelow
метод вызова, но этот подход просто не стоит использовать.Поэтому я решил убить двух зайцев одним выстрелом и использовать
Shuffle
основанный подход. Ниже приведены все допустимые минные поля длиныN
в случайном порядке:Затем все, что нужно сделать, это выбрать первое. Но я могу сделать лучше - конечно, было бы лучше просто
Sample
отфильтровать массив? Этот подход выглядит примерно так:Мне пришлось вернуть
BaseBelow&8!2
гольф, потому что\
приоритет слишком высок. В остальном, довольный, я продолжил отрубать байт этого:(Я обнаружил другой способ краткого вызова двоичной функции здесь:
x&f@y
это выражение с высоким приоритетом, которое оцениваетf[x, y]
.)Однако, несмотря на это, я вспомнил , что, все вместе, псевдоним
2&BaseBelow
существует:BinBelow
. Итак, я использовал это:Это создает желаемое минное поле. Я убежден, что это почти оптимально.
Часть 2: Формирование массива
Как уже говорилось ранее, техника формирования, которую я использовал, похожа на ответ J / APL, поэтому я не буду вдаваться в подробности. Предположим,
MINEFIELD
это результат из последнего раздела. Функция тогда становится:MINEFIELD'_
объединяет минное поле с исходным вводом_
, давая нам что-то вроде этого:Затем
Rotate[MINEFIELD'_,4]
поверните этот список4
раз влево, поместив центр:Последний шаг используется
[3,3]&
для преобразования списка в матрицу 3х3:источник
Java 10,
165157141 байтПустые тайлы есть
_
(любой символ со значением Юникода выше 58 вполне подойдет) и мины есть0
.Попробуйте онлайн.
Объяснение:
источник
PowerShell , 77 байт
Попробуйте онлайн!
источник
PHP ,
135134123117122121 байтЗацикливание на str для печати вместо этого экономит 1 байт
str_split и implode для вставки центрального номера экономит 11 байт
Больше не нужно присваивать строку $ s, сохраняя 6 байтов.Да, вы делаете. В противном случае строка перетасовывается после каждого эха ...
Удаление пробела после эха экономит 1 байт
Замена "\ n" обычным переводом строки экономит 1 байт
Попробуйте онлайн!
источник
Алиса , 24 байта
Попробуйте онлайн!
Пустые слоты есть
9
, а мины есть0
.Я также создал 27-байтовую программу
1
для шахт и0
для пустых слотов:Попробуйте онлайн!
источник
PowerShell ,
9186 байт-5 байт благодаря маззи
Попробуйте онлайн!
Shuffles генерируемой строки в диапазоне от
________
доXXXXXXXX
(замены слева). Затем он разрезает его несколько раз, вставляя$n
в середину, чтобы создать строку вывода. Эта последняя часть, вероятно, может быть значительно оптимизирована, поскольку каждый индекс стоит минимум 5 байтов.источник
Рубин , 59 байт
Возвращает список строк (по одной на каждую строку).
Попробуйте онлайн!
источник
C (gcc) , 81 байт
Попробуйте онлайн!
источник
Perl 5
-pa
,105101 байтПопробуйте онлайн!
источник
05AB1E , 12 байтов
Использует
0
для шахт, пространства для пустых квадратов. Выводит список строк, который довольно распечатан в TIO ниже, соединяясь с разделителем строк (»
).Попробуйте онлайн или проверьте еще несколько тестовых случаев одновременно .
Объяснение:
12 байтов альтернатива:
Использует
1
для шахт,0
для пустых квадратов. Выводит матрицу цифр, которая довольно печатается в TIO ниже, соединяя каждую строку, а затем эти строки с разделителем новой строки (J»
).Попробуйте онлайн или проверьте еще несколько тестовых случаев одновременно .
Объяснение:
источник