काम पर Minesweeper


18

हर कोई पुराने खानसामे के खेल को जानता है जिसे विंडोज एक्सपी के साथ भेज दिया गया है। यह 9x9 मैट्रिक्स वाली एक साधारण ग्रिड है जिसमें या तो एक संख्या होती है (यह दर्शाता है कि कितनी खदानें इसके निकट हैं) या एक खदान।

यहाँ छवि विवरण दर्ज करें

यदि आप PRNG को लागू करते हैं तो ब्राउनी पॉइंट्स के साथ किसी भी पूर्णांक बीज (जो भी आपकी मशीन / भाषा का सबसे बड़ा int है) तक दिए गए 10 बमों के साथ एक यादृच्छिक 9x9 ग्रिड उत्पन्न करने की चुनौती है

उदाहरण आउटपुट: कोशिकाओं में खानों के लिए या तो अंक 0-8 या * होते हैं

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

बाइट्स जीत में सबसे छोटा कोड .. मानक नियम आदि, आदि।


3
आपको इंगित करना चाहिए कि संख्याओं का क्या मतलब है :)
नाथन मेरिल

4
Microsoft माइनस्वीपर XP और माइन्सवेपर जैसे गेम से बहुत पुराना है जो कम से कम 60 के दशक की है।
AdmBorkBork

11
इसके अलावा, मेरे पास काम के समय माइनस्वीपर खेलने का समय नहीं है - मैं पीपीसीजी पर बहुत व्यस्त हूं। ;-)
AdmBorkBork

1
क्या एक PRNG के रूप में मायने रखता है, बिल्कुल? कितने अलग विन्यास का उत्पादन करने में सक्षम होना चाहिए? क्या हम बीज का उपयोग नहीं कर सकते हैं और हर बार एक अलग विन्यास उत्पन्न कर सकते हैं, अगर हमारी भाषा में एक PRNG है जो स्वचालित रूप से एक "यादृच्छिक" बीज के लिए initallized है?
लुइस मेन्डो

1
@TimmyD लेकिन XP का संस्करण पहला संस्करण है जिसमें 9x9 ग्रिड था। कुछ भी पुराने शुरुआत के लिए एक 8x8 ग्रिड का उपयोग करता है। #outnerded;)
mbomb007

जवाबों:


3

दिल्लोग एपीएल, 40 बाइट्स

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

(मान लिया गया ⎕io←0)

1में ⎕rl←1बीज है

दांये से बांये तक:

?⍨81 के समान है 81?81 - एक यादृच्छिक क्रमपरिवर्तन

9≥ यादृच्छिक स्थितियों में दस 1s वाले बिटमास्क में परिणाम, शेष 0s हैं

a←9 9⍴ 9-बाय-9 वर्ग को फिर से खोलें और इसे "ए" कहें

{ }⍣2 निम्नलिखित दो बार करें:

⍉3+/0,⍵,0 3 कॉलमों की विंडो योग (मानें 0s बाहर), फिर स्थानांतरित करें

(1,¨a)⍕¨प्रारूप (स्ट्रिंग में कनवर्ट करें) प्रत्येक है। परिणाम में वर्णों और भिन्नात्मक वर्णों की कुल संख्या को निर्दिष्ट करने के लिए बायाँ तर्क । अगर उस युक्ति के अनुसार प्रारूपित नहीं किया जा सकता है तो यह *इस समस्या के लिए एक भाग्यशाली संयोग है। a1 होगा जहां खदानें हैं - एक पूरे और भिन्नात्मक भाग को एक चार में फिट करने की कोशिश करना असंभव है, इसलिए वे *एस के रूप में दिखाई देंगे ।


क्या आप ⎕io←0धारणा समझा सकते हैं ? मैं Dyalog APL से परिचित नहीं हूँ ...
हारून

1
Dyalog में सरणी सूचकांक डिफ़ॉल्ट रूप से 1-आधारित हैं। सेटिंग ⎕io(" इंडेक्स ओरिजिन ") 0 से उन्हें 0-आधारित बनाता है और तदनुसार कुछ आदिम बदलता है, जैसे ⍳3होगा 0 1 2, नहीं 1 2 3। यह या तो प्रोग्रामेटिक रूप से ( ⎕io←0) या GUI में प्राथमिकताओं से किया जा सकता है । इस विकल्प का होना 50 साल पुरानी गलती है जो आज भी छोटे एपीएल समुदाय को विभाजित करती है।
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)x0

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

प्रदान करती है 1(autoomatically तार्किक करने के लिए डाली 1, या trueकरने के लिए) 10की 81की प्रविष्टियों x, प्रतिस्थापन के बिना अनियमित रूप से चुने। ये प्रविष्टियाँ वे हैं जिनमें बम हैं।

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

का संक्षिप्त नाम है conv2(+x,ones(3),'same')। यह मैट्रिक्स convolves x(जो करने के लिए डाली जा करने की जरूरत है double, का उपयोग कर +एक 3 × 3 पड़ोस युक्त के साथ) 1। यह गिनता है कि प्रत्येक प्रविष्टि में कितने बम हैं। ऐसी प्रविष्टियों के लिए जिनमें बम होता है, उसमें वह बम भी शामिल होता है, लेकिन बाद में उसका मूल्य समाप्त हो जाएगा।

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

संख्या से ASCII कोड में बदलने के लिए, मूल्य में 48 जोड़ता है। खाली मैट्रिक्स के साथ संबंध इन ASCII कोड को वर्णों में डालते हैं।

y(x)=42;

'*'बमों के पदों के लिए 42 (ASCII कोड ) प्रदान करता है । इन पदों द्वारा दिए गए हैं x, जो यहाँ एक तार्किक सूचकांक के रूप में उपयोग किया जाता है।

disp(y)

परिणाम प्रदर्शित करता है।


4

जावास्क्रिप्ट (ईएस 6), 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(यह बोरलैंड C / C ++ कार्यान्वयन है) के साथ एक रैखिक बधाई जनरेटर का उपयोग कर रहा है ।

अपने वार्मअप चरण के दौरान PRNG की खराब दक्षता के कारण, मुझे प्रति पंक्ति एक बम (शुरुआत में 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()जाना चाहिए और काम नहीं करेगा।
Arnauld

उफ़, मैं हालांकि इसे निष्पादित किया जाएगा ...('**********'+0).repeat(71)। माफ़ करना।
पॉल शमित्ज़

3

पायथन 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 बाइट्स बचाए।

सबसे अधिक संभावना अभी भी गोल्फ है।

व्याख्या

randomseedPRNG के बीज का उपयोग करने के लिए और sampleयादृच्छिक रूप से दस बम स्थानों का चयन करने के लिए आयात किया जाता है। mबोर्ड को बचाने वाला ९ x ९ मैट्रिक्स है। प्रत्येक बम स्थानों के लिए, इसी प्रविष्टि में mसेट हो जाता है -9और सभी पड़ोसी प्रविष्टियाँ बढ़ जाती हैं। यह तरीका mगैर-बम कोशिकाओं के लिए आसन्न बमों की गिनती और बम कोशिकाओं के लिए एक नकारात्मक संख्या से युक्त होता है। अंतिम में और सभी कोशिकाओं में printसभी लाइनों के माध्यम से पुनरावृत्ति करके पूरे बोर्ड को प्रिंट करता है ।lmcl


क्या वास्तव में 'यादृच्छिक' के लिए इस्तेमाल किया जाता है, बिल्कुल?
१२:१६

@ Qwerp-Derp शायद यादृच्छिक संख्या जनरेटर को अप्रत्यक्ष रूप से उपयोग करने के लिएsample()
पैट्रिक रॉबर्ट्स

for a in z:ब्लॉक के अंदर टैब इंडेंट को मिलाकर 2 बाइट्स बचाएं (केवल अजगर 2.x)
हारून

3

आर, 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() एक बीज बीज लें।

x 11 * 11 मैट्रिक्स का सूचकांक है

y 11 * 11 मैट्रिक्स में 9 * 9 मैट्रिक्स का सूचकांक है

z बम का सूचकांक है

x=x*0 मैट्रिक्स वैल्यू को इनिशियलाइज़ करें

आसन्न बम के मामले में लूप 1 से x जोड़ता है।


1
मुझे लगता है कि आपको इनपुट के रूप में set.seed () को तर्क देना होगा।
बीएलटी

2

जावास्क्रिप्ट ईएस 6, 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 बाइट्स लंबी होनी चाहिए, फिर न्यूलाइन और `चरित्र है।
नील

1

रूबी , 181 194 183 + 1 = 184 बाइट्स

वास्तव में बीज सेट करना भूल गया, वूप्स। -nझंडे का उपयोग करता है ।

इसे ऑनलाइन आज़माएं!

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.