Mayın Tarlası İş Başında


18

Herkes Windows XP ile birlikte gelen eski mayın tarama gemisi oyununu biliyor. 9x9 hücre matrisine bir sayı (bitişik kaç mayın olduğunu gösteren) veya bir maden içeren basit bir ızgaradır.

resim açıklamasını buraya girin

Zorluk, PRNG'yi kendiniz uygularsanız, herhangi bir tamsayı tohumu (makinenizin / dilinizin en büyük int'i ne olursa olsun) verilen brownie noktalarıyla verilen 10 bomba ile rastgele bir 9x9 ızgara oluşturmaktır.

örnek çıktı: hücreler mayınlar için 0-8 veya * rakamlarını içerir

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

Baytlardaki en kısa kod kazanır .. standart kurallar vb.


3
Sayıların ne anlama geldiğini belirtmelisiniz :)
Nathan Merrill

4
Microsoft Mayın Tarlası, XP'den çok daha eski bir heck ve mayın tarama gemisi benzeri oyunlar en azından 60'lara dayanıyor.
AdmBorkBork

11
Ayrıca, işteyken Mayın Tarlası oynamak için zamanım yok - PPCG ile çok meşgulüm. ;-)
AdmBorkBork

1
Tam olarak bir PRNG olarak sayılan nedir? Kaç farklı konfigürasyon üretebilmelidir? Biz Can değil tohum kullanmak ve dil bir PRNG varsa sadece farklı bir konfigürasyona her zaman üretmek otomatik "rastgele" tohuma initallized?
Luis Mendo

1
@TimmyD Ancak XP'nin sürümü 9x9 ızgarası olan ilk sürümdür. Daha eski olan her şey, Başlangıç ​​için 8x8 ızgara kullanır. #outnerded;)
mbomb007

Yanıtlar:


3

Dyalog APL, 40 bayt

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

(varsayar ⎕io←0)

1içinde ⎕rl←1tohum

sağdan sola doğru:

?⍨81ile aynıdır 81?81- rastgele bir permütasyon

9≥ rastgele konumlarda on 1'ler içeren bir bitmask ile sonuçlanır, geri kalanı 0s

a←9 9⍴ 9x9 kareye yeniden şekillendirin ve "a" deyin

{ }⍣2 aşağıdakileri iki kez yapın:

⍉3+/0,⍵,0 sürgülü pencere toplamı 3 sütun (0s dışında varsayın), sonra devrik

(1,¨a)⍕¨biçimidir (dizeye dönüştür). Sol bağımsız değişken, sonuçtaki toplam karakter ve kesirli karakter sayısını belirtir. Bu spesifikasyona göre biçimlendirilemezse *, bu sorun için şanslı bir tesadüf ortaya çıkar. aMadenlerin olduğu yerde 1 olacak - bütün ve kesirli bir parçayı tek bir karaktere sığdırmaya çalışmak imkansızdır, bu yüzden bunlar *s olarak görünecektir .


⎕io←0Varsayımı açıklayabilir misiniz ? Dyalog APL'ye aşina değilim ...
Aaron

1
Dyalog'daki dizi indeksleri varsayılan olarak 1 tabanlıdır. Ayar ⎕io( " Index Origin 0'a") onları 0 tabanlı yapar ve buna göre örneğin bazı temelögeye değiştirir ⍳3olacak 0 1 2değil 1 2 3. Bu programlı olarak ( ⎕io←0) veya GUI'deki tercihlerden yapılabilir. Bu seçeneğe sahip olmak, günümüzün küçük APL topluluğunu bölen 50 yıllık bir hatadır.
ngn

5

MATLAB, 94 93 bayt

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

Örnek çalışma (koddan sonraki ilk satır kullanıcı tarafından girilen girdidir):

>> 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

açıklama

rng(input(''));

bir tamsayı alır ve tohum olarak kullanır. (Bu modern MATLAB sürümlerinde çalışır. Eski sürümler farklı bir sözdizimine ihtiyaç duyabilir.)

x(9,9)=~1;

bir matrisin girişine mantıksal 0veya false(mantıksal olarak reddedilerek elde edilen 1) atar . Geri kalan girişler de otomatik olarak mantıksal olarak başlatılır .(9,9)x0

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

atar 1(autoomatically mantıksal döküm 1ya truekadar) 10arasında 81girişlerine xdeğiştirmeden rastgele seçilmiş. Bu girdiler bomba içeren girişlerdir.

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

kısaltmasıdır conv2(+x,ones(3),'same'). Matrisi x( doublekullanılması, kullanılması gereken +) içeren 3 × 3 mahalle ile ikna eder 1. Bu, her girişe kaç bomba bitişik olduğunu sayar. Bir bomba içeren girişler için bu bomba içerir, ancak oradaki değerin üzerine yazılacaktır.

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

sayıdan ASCII koduna dönüştürmek için değere 48 ekler. Boş matrisle birleştirme bu ASCII kodlarını karakterlere çevirir.

y(x)=42;

'*'bombaların pozisyonlarına 42 (ASCII kodu ) atar . Bu konumlar x, burada mantıksal bir dizin olarak kullanılan ile verilir .

disp(y)

sonucu görüntüler.


4

Javascript (ES6), 204 veya 198 bayt

Özel PRNG (204 bayt)

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`
`

Bu kod, çarpan 22695477ve artışlı doğrusal bir kongruratif jeneratör kullanıyor1 (bu Borland C / C ++ uygulamasıdır).

PRNG'nin ısınma aşamasında verimsizliği nedeniyle, her sıraya bir bomba yerleştirmek zorunda kaldım (başında 10 veya karıştırılmamış dizinin sonunda 10 yerine). Yani, sadece 9 bomba var. Bunu daha sonra düzeltmeye çalışabilirim.

Ayrıca, 'devre dışı' çekini işlemenin daha basit / daha kısa bir yolu olmalı (x=p%9-(n+=p)%9)*x-64 ancak şu anda anlayamıyorum.

Math.random () kullanma (198 bayt)

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`
`

Bu talep üzerine 10 maden içerir.

gösteri

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'eşittir '**********'+0; 198 baytlık sürümde iki bayt tasarrufu sağlar.
Paul Schmitz

@PaulSchmitz - Ne yazık ki bunun '0'tekrarlanması gerekiyor ve 0.repeat()işe yaramayacaktı.
Arnauld

Hata! Sanırım idam edilecek gibi ...('**********'+0).repeat(71). Afedersiniz.
Paul Schmitz

3

Python 2, 269 266 264 bayt

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))

İdeone.com adresinde deneyin

Aaron sayesinde 2 bayt tasarruf etti.

Büyük olasılıkla hala golf oynayabilir.

açıklama

randomseedPRNG'yi tohumlamak ve samplerastgele on bomba yeri seçmek için kullanılır . mbir 9 x 9 matris kurulu tasarruf. Bomba konumlarının her biri için, karşılık gelen giriş mayarlanır -9ve tüm komşu girişler artırılır. Bu şekilde mbomba olmayan hücreler için bitişik bomba sayısı ve bomba hücreleri için negatif bir sayı bulunur. Nihai printbaskılar tüm hatları üzerinden yineleme tarafından tüm yönetim kurulu liçinde mve tüm hücrelerde cyer l.


'Rastgele' tam olarak ne için kullanılır?
clismique

@ Qwerp-Derp muhtemelen dolaylı olarak kullanılan rasgele sayı üretecini tohumlamak için sample()
Patrick Roberts

sekme girintilerini for a in z:blok içinde karıştırarak 2 bayt kaydetme (yalnızca python 2.x)
Aaron

3

R, 187 Bayt

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 üzerinde deneyin

Açıklama:

set.seed() bir tohum almak.

x 11 * 11 matrisinin dizinidir

y 11 * 11 matrisindeki 9 * 9 matrisinin dizinidir

z bombanın endeksi

x=x*0 matris değerini başlat

Bitişik bomba durumunda döngü x'e 1 ekler.


1
Bence set.seed () argümanını girdi olarak almalısınız.
BLT

2

JavaScript ES6, 244 bayt

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>


Kodunuzun hangi kısmında olduğunu ayrıntılandırmak isteyebilirsiniz.
NoOneIsHere

@NoOneIsHere İlk 244 bayt, umarım ;-) İlk satır 242 bayt uzunluğunda olmalı, o zaman yeni satır ve `karakter var.
Neil

1

Yakut , 181 194 183 + 1 = 184 bayt

Gerçekten tohum ayarlamayı unuttum. Kullanır-nBayrağı .

Çevrimiçi deneyin!

srand$_.to_i
a=[0]*81
[*0..80].sample(10).map{|i|w=i%9;h=i/9;a[i]=-99
(r=-1..1).map{|x|x+=w
x<0||x>8?0:r.map{|y|y+=h
y<0||y>8?0:a[9*y+x]+=1}}}
puts a.map{|c|c<0??*:c}.join.scan /.{9}/

0

Python 2 , 172 bayt

from random import*
seed(input())
r=range
b=set(sample(r(81),10))
for j in r(9):print''.join([[`len({x-10,x-9,x-8,x-1,x+1,x+8,x+9,x+10}&b)`,'*'][x in b]for x in r(j,81,9)])

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.