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


18

Всі знають стару гру тральщика, що постачається з Windows XP. Це проста сітка з матрицею 9х9 комірок, яка містить або число (вказує, скільки мін прилягає до неї), або шахту.

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

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

Приклад виведення: комірки містять або цифри 0-8, або * для мін

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

Найкоротший код у байтах виграє .. стандартні правила тощо тощо.


3
Ви повинні вказати, що означають цифри :)
Натан Меррілл

4
Майкрософт Майкрософт набагато старший за XP, а ігри, схожі на тральщиків, сягають принаймні 60-х років.
AdmBorkBork

11
Крім того, я не встигаю грати тральщиком під час роботи - я занадто зайнятий на PPCG. ;-)
AdmBorkBork

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

1
@TimmyD Але версія XP - це перша версія, яка мала сітку 9x9. Усі старші використовують сітку 8x8 для початківців. #outnerded;)
mbomb007

Відповіді:


3

Діалог APL, 40 байт

⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81

(припускає ⎕io←0)

то 1в ⎕rl←1насіння

справа наліво:

?⍨81 те саме, що 81?81 - випадкова перестановка

9≥ призводить до отримання бітової маски, яка містить десять 1 у випадкових положеннях, решта - 0

a←9 9⍴ змінити форму на квадрат 9 на 9 і назвати його "a"

{ }⍣2 зробіть наступне двічі:

⍉3+/0,⍵,0 сума ковзаючого вікна з 3 стовпців (припустимо 0 с), а потім перемістіть

(1,¨a)⍕¨є формат (перетворити в рядок) кожен. Лівий аргумент вказує загальну кількість символів та дробових символів у результаті. Якщо не вдається відформатувати відповідно до цієї специфікації, це виводить *- щасливий збіг для цієї проблеми. aбуде 1 там, де є міни - намагатися помістити цілу і дробову частину в одну таблицю неможливо, тому вони з'являться як *s.


Чи можете ви пояснити ⎕io←0припущення? Я не знайомий з Dyalog APL ...
Аарон

1
Індекси масивів у Dyalog за замовчуванням базуються на 1. Якщо встановити ⎕io(" Походження індексу ") на 0, це робить їх на основі 0 і відповідно змінює деякі примітиви, наприклад, ⍳3буде 0 1 2, ні 1 2 3. Це можна зробити або програмно ( ⎕io←0), або з налаштувань GUI. Наявність цього вибору - це 50-річна помилка, яка все ще розбиває крихітну спільноту APL сьогодні.
ngn

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 бомб. Я можу спробувати виправити це пізніше.

Також повинен бути більш простий / коротший спосіб обробки чека "поза бортом" (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.


Для чого саме використовується "випадковий"?
клісмік

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

збережіть 2 байти, змішавши відступи вкладки всередині for a in z:блоку (лише python 2.x)
Аарон,

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 до x у випадку сусідньої бомби.


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.