Всем известна старая игра тральщика, поставляемая с Windows XP. Это простая сетка с матрицей 9x9 ячеек, содержащей либо число (указывающее, сколько мин рядом с ним), либо мина.
Задача состоит в том, чтобы сгенерировать случайную сетку 9x9 с 10 бомбами с любым целочисленным начальным числом (вплоть до самого большого целевого числа вашего компьютера / языка) с броуновскими точками, если вы сами внедрите PRNG
пример вывода: ячейки содержат цифры 0-8 или * для мин
*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121
Самый короткий код в байтах выигрывает .. стандартные правила и т. Д. И т. Д.
code-golf
random
minesweeper
Аарон
источник
источник
Ответы:
Dyalog APL, 40 байт
⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81
(предполагает
⎕io←0
)1
в⎕rl←1
семясправа налево:
?⍨81
так же, как81?81
- случайная перестановка9≥
в результате получается битовая маска, содержащая десять единиц в случайных позициях, остальные равны нулюa←9 9⍴
изменить форму 9 на 9 квадратов и назвать его «а»{ }⍣2
сделайте следующее дважды:⍉3+/0,⍵,0
сумма скользящих окон из 3 столбцов (предположим, 0s снаружи), затем транспонировать(1,¨a)⍕¨
это формат (конвертировать в строку) каждый. Левый аргумент для⍕
указывает общее количество символов и дробных символов в результате. Если⍕
не удается отформатировать в соответствии с этой спецификацией, он выдает*
- счастливое совпадение для этой проблемы.a
будет 1, где мины - попытка поместить целую и дробную часть в один символ невозможна, поэтому они будут отображаться как*
s.источник
⎕io←0
предположение? Я не знаком с Dyalog APL ...⎕io
(в « Индекс Origin ») на 0 делает их 0 на основе и изменяет некоторые примитивы , соответственно, например ,⍳3
будет0 1 2
, не1 2 3
. Это можно сделать либо программно (⎕io←0
), либо из настроек в графическом интерфейсе. Такой выбор - ошибка 50-летней давности, которая до сих пор разделяет крошечное сообщество APL сегодня.MATLAB,
9493 байтаПример выполнения (первая строка после кода - ввод, введенный пользователем):
объяснение
берет целое число и использует его как начальное число. (Это работает в современных версиях MATLAB. В старых версиях может потребоваться другой синтаксис.)
присваивает логическую
0
илиfalse
(полученную путем логического отрицания1
) элемент(9,9)
матрицыx
. Остальные записи также автоматически инициализируются как логические0
.правопреемники
1
(autoomatically приведения к логическому1
илиtrue
) к10
из81
записейx
, выбранных случайным образом, без замены. Эти записи содержат бомбы.это сокращение от
conv2(+x,ones(3),'same')
. Он сворачивает матрицуx
(которую нужно привестиdouble
, используя+
) с окрестностью 3 × 3, содержащей1
. Это подсчитывает, сколько бомб находится рядом с каждой записью. Для записей, которые содержат бомбу, она включает эту бомбу, но значение там будет перезаписано позже.добавляет 48 к значению, чтобы преобразовать число в код ASCII. Конкатенация с пустой матрицей переводит эти коды ASCII в символы.
присваивает 42 (код ASCII для
'*'
) позициям бомб. Эти позиции задаются с помощьюx
, который здесь используется в качестве логического индекса.отображает результат.
источник
Javascript (ES6), 204 или 198 байт
Пользовательский PRNG (204 байта)
Этот код использует линейный конгруэнтный генератор с множителем
22695477
и приращением1
(это реализация Borland C / C ++).Из-за низкой эффективности PRNG на этапе разогрева мне пришлось размещать по одной бомбе на ряд (вместо 10 в начале или 10 в конце массива без перемешивания). Итак, всего 9 бомб. Я могу попытаться исправить это позже.
Кроме того, должен быть более простой / короткий способ обработки чека «out of board»,
(x=p%9-(n+=p)%9)*x-64
но я просто не могу понять это прямо сейчас.Использование Math.random () (198 байт)
Это включает в себя 10 мин по запросу.
демонстрация
источник
'**********'+'0'
равно'**********'+0
; это экономит два байта в версии с 198 байтами.'0'
должно повториться и0.repeat()
не сработает....('**********'+0).repeat(71)
. Сожалею.Python 2,
269266264 байтаПопробуйте это на ideone.com
Сохранено 2 байта благодаря Аарону.
Скорее всего, еще гольф.
объяснение
random
импортируется для использованияseed
для заполнения PRNG иsample
случайного выбора десяти местоположений бомб.m
матрица 9 х 9, сохраняющая доску. Для каждого из мест взрыва, соответствующая запись вm
получает значение-9
и все соседние элементы получают приращение. Этот способ вm
конечном итоге содержит количество соседних бомб для ячеек без бомб и отрицательное число для ячеек бомб. Итоговыеprint
печатает все доски перебирая все линииl
вm
и все клеткиc
вl
.источник
sample()
for a in z:
блока (только Python 2.x)R 187 байт
Попробуйте это на Ideone
Объяснение:
set.seed()
взять семя cst.x
индекс для матрицы 11 * 11y
является индексом матрицы 9 * 9 в матрице 11 * 11z
это индекс бомбыx=x*0
инициализировать значение матрицыЦикл добавить 1 к х в случае смежной бомбы.
источник
JavaScript ES6, 244 байта
источник
`
символ.Рубин ,
181194183 + 1 = 184 байтаЗабыл на самом деле посадить семя, упс. Использует
-n
флаг.Попробуйте онлайн!
источник
Python 2 , 172 байта
Попробуйте онлайн!
источник