Тральщик на работе


18

Всем известна старая игра тральщика, поставляемая с Windows XP. Это простая сетка с матрицей 9x9 ячеек, содержащей либо число (указывающее, сколько мин рядом с ним), либо мина.

введите описание изображения здесь

Задача состоит в том, чтобы сгенерировать случайную сетку 9x9 с 10 бомбами с любым целочисленным начальным числом (вплоть до самого большого целевого числа вашего компьютера / языка) с броуновскими точками, если вы сами внедрите PRNG

пример вывода: ячейки содержат цифры 0-8 или * для мин

*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121

Самый короткий код в байтах выигрывает .. стандартные правила и т. Д. И т. Д.


3
Вы должны указать, что означают цифры :)
Натан Меррилл

4
Microsoft Minesweeper - чертовски много старше XP, а игры типа minesweeper относятся к 60-м годам.
AdmBorkBork

11
Кроме того, у меня нет времени играть в Minesweeper на работе - я слишком занят PPCG. ;-)
AdmBorkBork

1
Что именно считается PRNG? Сколько разных конфигураций должно быть в состоянии произвести? Можем ли мы не использовать начальное число и просто каждый раз генерировать новую конфигурацию, если наш язык имеет PRNG, который автоматически инициализируется в «случайное» начальное число?
Луис Мендо

1
@TimmyD Но версия XP - первая версия с сеткой 9x9. Все, что старше, использует сетку 8x8 для начинающих. #outnerded;)
mbomb007

Ответы:


3

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 ...
Аарон

1
Индексы массивов в Dyalog по умолчанию основаны на 1. Установка ⎕io(в « Индекс Origin ») на 0 делает их 0 на основе и изменяет некоторые примитивы , соответственно, например , ⍳3будет 0 1 2, не 1 2 3. Это можно сделать либо программно ( ⎕io←0), либо из настроек в графическом интерфейсе. Такой выбор - ошибка 50-летней давности, которая до сих пор разделяет крошечное сообщество APL сегодня.
СПП

5

MATLAB, 94 93 байта

rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)

Пример выполнения (первая строка после кода - ввод, введенный пользователем):

>> rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
99
*10001*2*
220001232
*201111*1
*312*1111
12*211000
011211000
0001*1000
000112110
000001*10

объяснение

rng(input(''));

берет целое число и использует его как начальное число. (Это работает в современных версиях MATLAB. В старых версиях может потребоваться другой синтаксис.)

x(9,9)=~1;

присваивает логическую 0или false(полученную путем логического отрицания 1) элемент (9,9)матрицы x. Остальные записи также автоматически инициализируются как логические 0.

x(randperm(81,10))=1; 

правопреемники 1(autoomatically приведения к логическому 1или true) к 10из 81записей x, выбранных случайным образом, без замены. Эти записи содержат бомбы.

conv2(+x,ones(3),'s')

это сокращение от conv2(+x,ones(3),'same'). Он сворачивает матрицу x(которую нужно привести double, используя +) с окрестностью 3 × 3, содержащей 1. Это подсчитывает, сколько бомб находится рядом с каждой записью. Для записей, которые содержат бомбу, она включает эту бомбу, но значение там будет перезаписано позже.

y=[...+48 ''];

добавляет 48 к значению, чтобы преобразовать число в код ASCII. Конкатенация с пустой матрицей переводит эти коды ASCII в символы.

y(x)=42;

присваивает 42 (код ASCII для '*') позициям бомб. Эти позиции задаются с помощью x, который здесь используется в качестве логического индекса.

disp(y)

отображает результат.


4

Javascript (ES6), 204 или 198 байт

Пользовательский PRNG (204 байта)

s=>(p=-1,S=n=>(x=p%9-(n+=p)%9)*x-64&&b[n]=='*',T=n=>S(n)+S(-n),b=[...'*00000000'.repeat(9)]).sort(_=>(s=(22695477*s+1)>>>0)&1||-1).map(c=>(p++,c=='0'?T(1)+T(8)+T(9)+T(10):c)).join``.match(/.{9}/g).join`
`

Этот код использует линейный конгруэнтный генератор с множителем 22695477и приращением 1(это реализация Borland C / C ++).

Из-за низкой эффективности PRNG на этапе разогрева мне пришлось размещать по одной бомбе на ряд (вместо 10 в начале или 10 в конце массива без перемешивания). Итак, всего 9 бомб. Я могу попытаться исправить это позже.

Кроме того, должен быть более простой / короткий способ обработки чека «out of board», (x=p%9-(n+=p)%9)*x-64но я просто не могу понять это прямо сейчас.

Использование Math.random () (198 байт)

s=>(p=-1,S=n=>(x=p%9-(n+=p)%9)*x-64&&b[n]=='*',T=n=>S(n)+S(-n),b=[...'**********'+'0'.repeat(71)]).sort(_=>Math.random()-.5).map(c=>(p++,c=='0'?T(1)+T(8)+T(9)+T(10):c)).join``.match(/.{9}/g).join`
`

Это включает в себя 10 мин по запросу.

демонстрация

let f =
_=>(p=-1,S=n=>(x=p%9-(n+=p)%9)*x-64&&b[n]=='*',T=n=>S(n)+S(-n),b=[...'**********'+'0'.repeat(71)]).sort(_=>Math.random()-.5).map(c=>(p++,c=='0'?T(1)+T(8)+T(9)+T(10):c)).join``.match(/.{9}/g).join`
`
console.log(f())


'**********'+'0'равно '**********'+0; это экономит два байта в версии с 198 байтами.
Пол Шмитц

@PaulSchmitz - К сожалению, это '0'должно повториться и 0.repeat()не сработает.
Арно

Ой, я думал, что это будет выполнено как ...('**********'+0).repeat(71). Сожалею.
Пол Шмитц

3

Python 2, 269 266 264 байта

from random import*
seed(input())
z=1,0,-1
n=range(9)
m=[[0]*9 for _ in n]
for x,y in sample([[x,y]for x in n for y in n],10):
 m[x][y]=-9
 for a in z:
  for b in z:
    if 0<=x+a<9>0<=y+b<9:m[x+a][y+b]+=1 # it gets displayed as 4 spaces, but the beginning of this line is a single tab
print("\n".join("".join([`c`,'*'][c<0]for c in l)for l in m))

Попробуйте это на ideone.com

Сохранено 2 байта благодаря Аарону.

Скорее всего, еще гольф.

объяснение

randomимпортируется для использования seedдля заполнения PRNG и sampleслучайного выбора десяти местоположений бомб. mматрица 9 х 9, сохраняющая доску. Для каждого из мест взрыва, соответствующая запись в mполучает значение -9и все соседние элементы получают приращение. Этот способ в mконечном итоге содержит количество соседних бомб для ячеек без бомб и отрицательное число для ячеек бомб. Итоговые printпечатает все доски перебирая все линии lв mи все клетки cв l.


Для чего конкретно используется «случайный»?
clismique

@ Qwerp-Derp возможно инициализировать генератор случайных чисел косвенно используетсяsample()
Патрик Робертс

сохранить 2 байта путем смешивания отступов табуляции внутри for a in z:блока (только Python 2.x)
Aaron

3

R 187 байт

set.seed();x=1:121;y=x[!(x%%11 %in% 0:1|(x-1)%/%11 %in% c(0,10))];z=sample(y,10);x=x*0;for(t in z){p=t+c(-10:-12,-1,1,10:12);x[p]=x[p]+1};x[z]=9;m=data.frame(matrix(x[y],9));m[m==9]='*';m

Попробуйте это на Ideone

Объяснение:

set.seed() взять семя cst.

x индекс для матрицы 11 * 11

y является индексом матрицы 9 * 9 в матрице 11 * 11

z это индекс бомбы

x=x*0 инициализировать значение матрицы

Цикл добавить 1 к х в случае смежной бомбы.


1
Я думаю, что вы должны принять аргумент для set.seed () в качестве ввода.
BLT

2

JavaScript ES6, 244 байта

f=(a=[...Array(11)].map(_=>Array(11).fill(0)),n=10,r=_=>Math.random()*9|0,x=r(),y=r())=>a[x+1][y+1]>8||[0,1,2].map(i=>[0,1,2].map(j=>a[x+i][y+j]++),a[x+1][y+1]=9)&&--n?f(a,n):a.slice(1,-1).map(a=>a.slice(1,-1).map(n=>n<9?n:`*`).join``).join`
`
;o.textContent=f()
<pre id=o>


Вы можете уточнить, какая часть является вашим кодом.
NoOneIsHere

@NoOneIsHere Первые 244 байта, надеюсь ;-) Первая строка должна быть длиной 242 байта, затем есть новая строка и `символ.
Нил


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.