बबल-रैप सिम्युलेटर बनाएं


23

बबल-रैप्स अधिकतम-स्तरीय मनोरंजन हैं। हर कोई इससे सहमत हो सकता है।

अब, आप कंप्यूटर को बबल-रैप का आनंद भी देंगे।

चश्मा

आपको दो पूर्णांक, w और h दिए जाएंगे। (प्रत्येक उत्तरोत्तर चौड़ाई और ऊंचाई के हैं)

आपके प्रोग्राम को सभी w * h चरणों का उत्पादन करना चाहिए और प्रत्येक के बीच 1 सेकंड का इंतजार करना चाहिए।

हर बुलबुले-आवरण की शुरुआत सभी कोशिकाओं से होती है।

उदाहरण के लिए, एक 4 * 6 बुलबुला लपेटो शुरू होता है:

O_O_
_O_O
O_O_
_O_O
O_O_
_O_O

और प्रत्येक चरण, एक यादृच्छिक गैर-पॉप्ड सेल पॉपअप किया जाता है। उदाहरण के लिए,

O_O_
_O_O
O_X_
_O_O
O_O_
_O_O

जब सभी कोशिकाओं को पॉपअप किया जाता है, तो कार्यक्रम को समाप्त करना चाहिए। उर्फ।

X_X_
_X_X
X_X_
_X_X
X_X_
_X_X

उदाहरण

(4,6)
(5,5)
(6,2)
(10,10)
(7,9)

हम का उपयोग कर सकते हैं 1और के 0बजाय Oऔर X?
पावेल

1
NEEDZ BUBBLEZ pls मदद भेजें
क्रिस्टोफर

3
क्या यह एक (1,1)बुलबुले (जैसे शीर्ष-बाएं "सेल" हमेशा एक अंडरस्कोर है) के लिए स्वीकार्य है ?
जोनाथन एलन

1
@JonathanAllan हाँ।
मैथ्यू रो

1
@ केविनक्रूजसेन यह एक पूर्ण कार्यक्रम होना जरूरी नहीं है।
मैथ्यू रो

जवाबों:


7

सी (विंडोज), 260 248 बाइट्स

#import<windows.h>
i,j,l,r;b(w,h){char*s=malloc(l=w*h+h);for(i=h;i--;*s++=10)for(j=w;j--;*s++=i%2^j%2?79:45);*(s-1)=0;s-=l;for(srand(time(0));j>system("cls")+puts(s)-2;j>-1?s[j]=88:0)for(Sleep(1000),r=rand(),j=-2,i=r+l*2;--i-r;j=s[i%l]==79?i%l:j);}

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


ध्यान दें कि थ्रेड लाइब्रेरी में एक नींद समारोह है, जो C ++ 11 में शामिल है।
मैथ्यू रो

@MatthewRoh हां, लेकिन यह कम है, और system("cls")यह विंडोज-विशिष्ट भी है, इसलिए कोड या तो थ्रेड लाइब्रेरी के साथ अधिक पोर्टेबल नहीं होगा। और C ++ के साथ मुझे भी शामिल करना होगा iostreamया cstdio
स्टेडीबॉक्स

btw आपको स्क्रीन को रीसेट करने की आवश्यकता नहीं है। यह कम कर देगा।
मैथ्यू रो

5

पायथन 3 , 222 220 बाइट्स

यह मेरा पहली बार जवाब दे रहा है, इसलिए कृपया सौम्य रहें (और गलतियों को इंगित करें जो मैंने किए हैं)।

import time,random as t
def f(c,r):
 p=print;a='0_'*c;d=((a[:c]+'\n'+a[1:c+1]+'\n')*r)[:-~c*r]
 for i in[1]*((r*c+r%2*c%2)//2):
  p(d);k=1
  while d[k]!='0':k=t.randrange(len(d))
  d=d[:k]+'X'+d[k+1:];time.sleep(1)
 p(d)

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

यह काम किस प्रकार करता है:

  1. एक साथ बहुत सारे '0 _' की श्रृंखला
  2. '0_0 _... \ n' और '_0_0 ... \ n' भागों में भाग लें और संक्षिप्त करें
  3. सूचकांक पर चार '0' है जब तक यादृच्छिक सूचकांक उत्पन्न
  4. जेनरेट किए गए इंडेक्स में चार के साथ नया स्ट्रिंग बनाएं, इसे 'X' से बदला जाएगा (लानत है कि आप नॉन-टायरेबल स्ट्रिंग्स के लिए अजगर हैं!)
  5. दोहराएं r*c+r%2*c%2समय: r*cपैटर्न में बुलबुले होते हैं , जब तक कि आर और सी दोनों विषम नहीं होते हैं, जिस स्थिति में होते हैं r*c+1

1
PPCG में आपका स्वागत है!
AdmBorkBork

1
यह बल्कि मामूली है, लेकिन आपकी चौड़ाई और ऊंचाई उलट है। हालांकि महान जवाब! (बस इसे बदलें f(c,r)और आप ठीक हो जाएंगे)।
रासर

@rassar Woops, शुक्रिया!
नील

4

MATL , 37 बाइट्स

:!i:+o`T&Xxt3:q'_OX'XEcD2y1=ft&v1Zr(T

ऊपरी-बाएँ कोने में हमेशा एक अंडरस्कोर होता है (चुनौती द्वारा अनुमत)।

स्क्रीन को चरणों के बीच साफ़ किया जाता है। मैं स्क्रीन को साफ नहीं करके एक बाइट को बचा सकता था, लेकिन यह इस तरह से बेहतर दिखता है।

कार्यक्रम सभी चरणों को प्रदर्शित करने के बाद एक त्रुटि ( डिफ़ॉल्ट रूप से अनुमत ) के साथ बाहर निकलता है ।

MATL ऑनलाइन पर यह कोशिश करो ! (यदि यह कुछ सेकंड के बाद काम नहीं करता है, तो कृपया पृष्ठ को रीफ्रेश करें और पुन: प्रयास करें)।


4

गणितज्ञ (145 बाइट्स)

बेनामी फ़ंक्शन, इनपुट के रूप में ऊंचाई और चौड़ाई लेता है (उस क्रम में - यदि यह समस्या है, तो इसके {##}साथ बदलें{#2,#} एक अतिरिक्त 2 बाइट्स के लिए कोड के बीच में)।

कोड:

Monitor[Do[Pause@1,{i,NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,""<>Riffle["_"["O"][[Mod[#+#2,2]]]&~Array~{##},"
"],Floor[##/2]]}],i]&

स्पष्टीकरण:

  • ""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"] "_" s और "O" s की एक सरणी बनाकर और फिर उन्हें नईलाइन्स के बीच StringJoining करके प्रारंभिक, बिना कटा हुआ बबल-रैप बनाता है।
  • NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]बार-बार "O" के एक "X" को बदलने के लिए चुनता है, क्योंकि कई बार "O" s (जो कि फर्श [चौड़ाई * ऊँचाई / 2/2]) है - "_ डालने के विचार के लिए @JonathanAllan का धन्यवाद "ऊपरी बाएं कोने में" O "के बजाय, अन्यथा यह Ceilingइसके बजाय होगा और इस प्रकार 2 बाइट्स अधिक)।
  • Monitor[Do[Pause@1,{i,...}],i]बनाता है i, 1 सेकंड प्रत्येक के लिए प्रिंट सूची हम सिर्फ गणना में मान लेते हैं, और गतिशील i

उदाहरण आउटपुट:

Mathematica popping बुलबुला लपेटो


3

जेली , 30 29 बाइट्स

=”OTX
+þ⁹++µị⁾_OYµṄœS1”XǦµÐL

उदाहरण चलाते हैं

लिंक को प्रोग्राम तर्कों के साथ एक डेड के रूप में कॉल करता है और फिर एक संदेश के साथ क्विट करता है (जिसके लिए कोड है çṛ“\'=ṙMḋḌẓ(ėo»)

Nuance: नीचे-दाएं "सेल" हमेशा एक बुलबुला होगा (सवाल में उदाहरण की तरह शीर्ष-बाएं की तुलना में), यह सुनिश्चित करना है कि जब सभी बुलबुले यादृच्छिक विकल्प रिटर्न पॉप कर रहे हैं 0 जो कि सबसे "X"कम होगा सूची का अंत - इसकी जगह फिर मूल्य में कोई बदलाव नहीं होता है और लूप टूट जाता है।

नोट: स्क्रीन साफ़ नहीं करता है (निर्दिष्ट नहीं किया गया था, और मुझे यकीन नहीं है कि ऐसा कैसे करना है)।

कैसे?

=”OTX - Link 1, choose a random O index or 0: string   e.g. "_O_\nX_O"
 ”O   - "O"
=     - equals (vectorises over the string)            e.g. [0,1,0,0,0,0,1]
   T  - truthy indexes                                 e.g. [2,7]
    X - random choice (if empty this returns 0)

+þ⁹++µị⁾_OYµṄœS1”XǦµÐL - Main link: w, h              e.g. 3, 2
                        - left argument (implicit), w  e.g. 3
  ⁹                     - right argument, h            e.g. 2
 þ                      - outer product with
+                       -     addition                 e.g. [[2,3,4],[3,4,5]]
                        - left argument (implicit), w  e.g. 3
   +                    - add                          e.g. [[5,6,7],[6,7,8]]
                        - right argument (implicit), h e.g. 2
    +                   - add                          e.g. [[7,8,9],[8,9,10]]
     µ                  - monadic chain separation
       ⁾_O              - "_O"
      ị                 - index into (1-based & mod)   e.g. [['_','O','_'],['O','_','O']]
                        -     note: the additions above assure the last entry is an 'O'.
          Y             - join with line feeds         e.g. ['_','O','_','\n','O','_','O']
           µ        µ   - monadic chain separations
                     ÐL - loop until the results are no longer unique:
            Ṅ           -     print with a trailing line feed and yield
             œS1        -     sleep for 1 second and yield
                   ¦    -     apply to index
                  Ç     -         given by calling the last link (1) as a monad 
                        -                 (a random O index or 0 if none exists)
                ”X      -         an "X"  (      ... which will be an X already)

@ ГригорийПерельман ने इसे लिखा था।
जोनाथन एलन

2

स्काला , 764 बाइट्स

object B{
  def main(a: Array[String]):Unit={
    val v=false
    val (m,l,k,r,n)=(()=>print("\033[H\033[2J\n"),a(0)toInt,a(1)toInt,scala.util.Random,print _)
    val e=Seq.fill(k, l)(v)
    m()
    (0 to (l*k)/2-(l*k+1)%2).foldLeft(e){(q,_)=>
      val a=q.zipWithIndex.map(r => r._1.zipWithIndex.filter(c=>
        if(((r._2 % 2) + c._2)%2==0)!c._1 else v)).zipWithIndex.filter(_._1.length > 0)
      val f=r.nextInt(a.length)
      val s=r.nextInt(a(f)._1.length)
      val i=(a(f)._2,a(f)._1(s)._2)
      Thread.sleep(1000)
      m()
      val b=q.updated(i._1, q(i._1).updated(i._2, !v))
      b.zipWithIndex.map{r=>
        r._1.zipWithIndex.map(c=>if(c._1)n("X")else if(((r._2 % 2)+c._2)%2==0)n("O")else n("_"))
        n("\n")
      }
      b
    }
  }
}

यह काम किस प्रकार करता है

एल्गोरिथ्म पहले गलत मूल्यों के साथ एक 2 डी अनुक्रम भरता है। यह निर्धारित करता है कि कमांड लाइन के तर्कों के आधार पर कितने पुनरावृत्तियों (खुले बक्से) मौजूद हैं। यह ऊपरी सीमा के रूप में इस मान के साथ एक गुना बनाता है। तह के पूर्णांक मान का उपयोग केवल इस बात के लिए किया जाता है कि एल्गोरिथ्म के लिए कितने पुनरावृत्तियों को गिनना चाहिए। भरा हुआ अनुक्रम जो हमने पहले बनाया था वह गुना के लिए शुरुआती अनुक्रम है। इसका उपयोग उनके सह-कार्यशील अनिर्णय के साथ झूठे मूल्यों के एक नए 2 डी अनुक्रम को उत्पन्न करने में किया जाता है।

उदाहरण के लिए,

[[false, true],
 [true, false],
 [true, true]]

में बदल दिया जाएगा

[[(false, 0)], [(false, 1)]]

ध्यान दें कि सभी सूची जो पूरी तरह से सच हैं (0 की लंबाई है) को परिणाम सूची से छोड़ दिया गया है। एल्गोरिथ्म तब इस सूची को लेता है और सबसे बाहरी सूची में एक यादृच्छिक सूची चुनता है। यादृच्छिक सूची को हमारे द्वारा चुनी गई यादृच्छिक पंक्ति चुना जाता है। उस यादृच्छिक पंक्ति से, हम फिर से एक यादृच्छिक संख्या, एक कॉलम इंडेक्स पाते हैं। एक बार जब हम इन दो यादृच्छिक सूचकांकों को पा लेते हैं, तो हम उस धागे को सोते हैं जो हम 1000 मील की दूरी पर हैं।

नींद पूरी होने के बाद, हम स्क्रीन को साफ करते हैं और trueहमारे द्वारा बनाए गए यादृच्छिक सूचकांकों में अद्यतन मूल्य के साथ एक नया बोर्ड बनाते हैं ।

इसे ठीक से प्रिंट करने के लिए, हम mapइसे मैप के इंडेक्स के साथ उपयोग और ज़िप करते हैं ताकि हमारे संदर्भ में ऐसा हो। हम करने के लिए है कि क्या हम एक प्रिंट चाहिए के रूप में अनुक्रम की सच्चाई मान का उपयोग Xया तो एक Oया _। उत्तरार्द्ध को चुनने के लिए, हम अपने गाइड के रूप में सूचकांक मूल्य का उपयोग करते हैं।

ध्यान देने योग्य बातें

यह पता लगाने के लिए कि क्या इसे एक Oया एक प्रिंट करना चाहिए _, सशर्त ((r._2 % 2) + c._2) % 2 == 0का उपयोग किया जाता है। वर्तमान कॉलम r._2इंडेक्स को c._2संदर्भित करता है जबकि वर्तमान कॉलम को संदर्भित करता है। यदि कोई एक विषम पंक्ति पर है, r._2 % 2तो 1 होगा, इसलिए c._2सशर्त में एक से ऑफसेट करना । यह सुनिश्चित करता है कि विषम पंक्तियों पर, स्तंभ 1 से अधिक के रूप में ले जाया जाता है।

स्ट्रिंग को प्रिंट करना "\033[H\033[2J\n" , कुछ Stackoverflow जवाब के अनुसार मैं पढ़ता हूं, स्क्रीन को साफ करता है। यह टर्मिनल को बाइट्स लिख रहा है और कुछ फंकी चीजें कर रहा हूं जो मुझे वास्तव में समझ नहीं आ रही हैं। लेकिन मैंने इसे इसके बारे में सबसे आसान तरीका माना है। यह Intellij IDEA के कंसोल एमुलेटर पर काम नहीं करता है, हालांकि। आपको इसे नियमित टर्मिनल का उपयोग करके चलाना होगा।

एक और समीकरण देखने में अजीब लग सकता है जब पहली बार इस कोड को देख रहा हो (l * k) / 2 - (l * k + 1) % 2। सबसे पहले, चर नामों को नष्ट करते हैं। lकार्यक्रम में पारित पहले तर्कों को kसंदर्भित करता है जबकि दूसरे को संदर्भित करता है। इसका अनुवाद करने के लिए, (first * second) / 2 - (first * second + 1) % 2। इस समीकरण का लक्ष्य सभी एक्स के अनुक्रम प्राप्त करने के लिए आवश्यक पुनरावृत्तियों की सटीक मात्रा के साथ आना है। पहली बार जब मैंने ऐसा किया, तो मैंने ऐसा ही किया (first * second) / 2nप्रत्येक सबलिस्ट में प्रत्येक तत्वों के लिए , ऐसे n / 2बुलबुले हैं जिन्हें हम पॉप कर सकते हैं। हालाँकि, इनपुट्स से निपटने के दौरान यह टूट जाता है(11 13) । हमें दो नंबरों के उत्पाद की गणना करने की आवश्यकता है, अगर यह विषम है, और भले ही यह विषम है, तो इसे 2 से माप लें। 2. यह काम करता है क्योंकि पंक्तियां और स्तंभ जो विषम हैं उन्हें एक कम पुनरावृत्ति की आवश्यकता होती है अंतिम परिणाम के लिए।

mapइसके बजाय इसका उपयोग किया जाता है forEachक्योंकि इसमें कम वर्ण होते हैं।

चीजें जो शायद बेहतर हो सकती हैं

एक चीज जो वास्तव में मुझे इस समाधान के बारे में बताती है वह है लगातार उपयोग zipWithIndex। यह बहुत सारे पात्रों को उठा रहा है। मैंने इसे बनाने की कोशिश की ताकि मैं अपने स्वयं के एक चरित्र फ़ंक्शन को परिभाषित कर सकूं जो कि केवल zipWithIndexपारित मूल्य के साथ प्रदर्शन करेगा । लेकिन यह पता चला है कि स्काला एक अनाम फ़ंक्शन को टाइप पैरामीटर के लिए अनुमति नहीं देता है। वहाँ शायद एक और तरीका है जो मैं उपयोग किए बिना कर रहा हूं, zipWithIndexलेकिन मैंने इसे करने के लिए एक चतुर तरीके के बारे में बहुत अधिक नहीं सोचा है।

वर्तमान में, कोड दो पास में चलता है। पहला नया बोर्ड बनाता है जबकि दूसरा पास प्रिंट करता है। मुझे लगता है कि अगर इन दोनों में से किसी एक को पास कर दिया जाए, तो इससे एक-दो बाइट बच जाएंगी।

यह पहला कोड गोल्फ है जो मैंने किया है इसलिए मुझे यकीन है कि सुधार के लिए बहुत जगह है। यदि आप बाइट्स के लिए अनुकूलित करने से पहले कोड देखना चाहते हैं, तो यहां है।


1

जावास्क्रिप्ट (ईएस 6), 246 229 बाइट्स

document.write(`<pre id=o></pre>`)
setInterval(_=>{(a=o.innerHTML.split(/(O)/))[1]?a[Math.random()*~-a.length|1]=`X`:0;o.innerHTML=a.join``},1e3)
f=(w,h)=>o.innerHTML=[...Array(h)].map((_,i)=>`O_`.repeat(w+h).substr(i,w)).join`
`
<div oninput=f(+w.value,+h.value)><input id=w type=number min=1><input id=h type=number min=1>


चौड़ाई कोशिकाओं के संदर्भ में नहीं थी, लेकिन रिक्त (अंडरलाइन) रिक्त स्थान सहित।
मैथ्यू रो

@MatthewRoh क्षमा करें, मुझे ऊंचाई के लिए इसे ठीक करना याद है लेकिन मैं चौड़ाई की जांच करना भूल गया था।
नील

हम्म .. यह हिस्सा नहीं `${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}हो सकता : किसी भी तरह संयुक्त हो? शायद पहली बार के लिए एक बूलियन-ध्वज का निर्धारण _Oया O_, और उसके बाद करना .repeat(w).slice(w)?
केविन क्रूज़सेन

1
@ केविनक्रूजसेन मैं एक त्वरित बगफिक्स के कारण 16 बाइट्स खो चुका था, जो उस समय मेरे पास गोल्फ के लिए नहीं था। मैंने तब से एक और रूप ले लिया है और 17 बाइट की बचत के साथ आता हूं,
नील

1

पायथन - 290 बाइट्स

मैंने इनमें से एक भी पहले नहीं किया है - इसलिए किसी भी रचनात्मक आलोचना की सराहना की जाएगी :)

यहाँ मुख्य ट्रिक बस नेस्ट्रेस्टेड नेस्टेड लिस्ट की समझ है। मैं चबूतरे के बीच एक नई रेखा नहीं होने से कुछ पात्रों को बचा सकता था लेकिन यह सिर्फ बदसूरत दिखता है।

r=range
q=print
import random as n,time
def f(H,W):
    def p(b):
        q("\n".join(["".join(["O"if(i,j)in b else"X"if(i,j)in X else"_"for j in r(H)])for i in r(W)]));time.sleep(1);q()
    b=[(i,h)for h in r(H)for i in r(h%2,W,2)];n.shuffle(b);X=[]
    while len(b)>0:
        p(b);X+=[b.pop()]
    p(b)

नमस्ते, PPCG में आपका स्वागत है! चुनौती लेने के लिए wऔर hके बजाय एक hardcoded रहा है, (STDIN के माध्यम से, एक समारोह इनपुट, या कुछ इसी तरह के रूप में) इनपुट के रूप में H=4 W=6। इसके अलावा, हालांकि मैंने कभी पायथन में प्रोग्राम नहीं किया है, मुझे लगता है कि आप अपने वर्तमान कोड में कुछ रिक्त स्थान देख सकते हैं। पायथन में गोल्फिंग के लिए सुझाव भी दिलचस्प हो सकते हैं कि कैसे आप इसे और नीचे ले जाएं। यहां रहने का आनंद! :)
केविन क्रूज़सेन

इसके अलावा, आपकी टिप्पणी के बारे में: " मैं चबूतरे के बीच एक नई रेखा नहीं होने से कुछ पात्रों को बचा सकता था, लेकिन यह सिर्फ बदसूरत दिखता है। वास्तविक जीवन की प्रोग्रामिंग में कोई फर्क नहीं पड़ता कि यह कितना बदसूरत या नहीं किया गया है, कोडगुल्फ़ के रूप में सहेजने के बारे में है" जितना संभव हो उतना बाइट्स। छोटा और बदसूरत, बेहतर। ;)
केविन क्रूज़सेन

@KevinCruijssen पायथन 3 मेरे ऊपर सिर्फ यह w, h के कार्य के रूप में है, क्या इसकी अनुमति है?
आर्य


1
ठीक है - मैंने इसे अब एच और डब्ल्यू का एक समारोह बना दिया है।
आर्य

1

चारकोल , ४ ९ ४६ ३ ९ बाइट्स (नॉनकमेटिंग)

UONNO_¶_OAKAαA№αOβHWψβ«A§α§⌕AαO‽βXA№αOβ

वाचाल

Oblong(InputNumber(), InputNumber(), "O_\n_O")
Assign(PeekAll(), a)
Assign(Count(a, "O"), b)
RefreshWhile (k, b) {
    AssignAtIndex(a, AtIndex(FindAll(a, "O"), Random(b)), "X")
    Assign(Count(a, "O"), b)
}

1

APL (Dyalog) , 61 59 बाइट्स

⎕←m'O_'[2|-/¨⍳⎕]
(b/,m)[?+/b'O'=,m]←'X'
DL 1
2/⍨'O'∊⎕←m

⎕← आउटपुट
m←m , जहाँ m है
'O_'[... ] इन वर्णों को अनुक्रमित किया गया ...  प्रत्येक के बीच अंतर
2| के विभाजन-शेष-जब-विभाजित-दो
-/¨से
 आकार के
 इनपुट के एक सरणी (सभी पंक्तियों और स्तंभों की संख्या ) में सभी निर्देशांक (सूचक) के )

(... )[... ]←'X' से एक के लिए आवंटित चरित्र एक्स ...
b/ फ़िल्टर्ड-दर- (परिभाषित किया जाना)
,m raveled मीटर, विशेष रूप से ... के तत्वों
? को सीमा से एक में एक यादृच्छिक तत्व (साहित्य संख्या)
+/ की राशि
b← , जहां है
'O'= बूलियन जहाँ पत्र बराबर होता है
,mm raveled

⎕DL 1D e l ay एक सेकंड

→2 पंक्ति 2 पर जाएँ
/⍨ यदि (द्वारा फ़िल्टर किया गया)
'O'∊  क्या पत्र
⎕←m आउटपुट मान का सदस्य है , जहाँ आउटपुट वैल्यू m है

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


संस्करण 16.0 से यह छोटा होगा:

{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]


1

पायथन 3, 195 188 बाइट्स

import time,random
def f(w,h):
 a=bytearray(b'0-'*w*h);b=[*range(0,w*h,2)];random.shuffle(b);
 while 1:print(*(a.decode()[w*i:w*i+w]for i in range(h)),sep='\n');a[b.pop()]=88;time.sleep(1)

का उपयोग करना bytearrayऔर decodeलगता है कि यह कताई से कम है और एक स्ट्रिंग ला को आश्वस्त करता है a[:i]+'X'+a[i+1:]

import time,random
def f(w,h):
 x=[*range(1,h*w,2)];random.shuffle(x)
 while 1:
  for i in range(w*h):
   print('-X0'[(i%w%2!=i//w%2)+(i in x)],end='\n'[i%w<w-1:])
  print();time.sleep(1);x.pop()

0

जावा 7, 317 बाइट्स

void c(int w,int h)throws Exception{String r="";int x=0,j=0,i;for(;j++<h;x^=1,r+="\n")for(i=0;i<w;r+=(i+++x)%2<1?"_":"O");for(System.out.println(r);r.contains("O");System.out.println(r=r.substring(0,x)+'X'+r.substring(x+1))){Thread.sleep(1000);for(x=0;r.charAt(x)!='O';x=new java.util.Random().nextInt(r.length()));}}

स्पष्टीकरण:

void c(int w, int h) throws Exception{                     // Method with two integer parameters (throws Exception is required for the Thread.sleep)
  String r = "";                                           //  String we build to print
  int x=0, j=0, i;                                         //  Some temp values and indexes we use
  for(; j++<h;                                             //  Loop over the height 
      x^=1,                                                //    After every iteration change the flag `x` every iteration from 0 to 1, or vice-versa
      r += "\n")                                           //    And append the String with a new-line
    for(i=0; i<w;                                          //   Inner loop over the width
        r += (i++ + x)%2 < 1 ? "_" : "O")                  //    Append the String with either '_' or 'O' based on the row and flag-integer
    ;                                                      //   End inner width-loop (implicit / no body)
                                                           //  End height-loop (implicit / single-line body)
  for(                                                     //  Loop
    System.out.println(r);                                 //   Start by printing the starting wrap
    r.contains("O");                                       //   Continue loop as long as the String contains an 'O'
    System.out.println(r=                                  //   Print the changed String after every iteration
        r.substring(0,x)+'X'+r.substring(x+1))){           //    After we've replaced a random 'O' with 'X'
      Thread.sleep(1000);                                  //   Wait 1 second
      for(x=0; r.charAt(x) != 'O';                         //   Loop until we've found a random index containing still containing an 'O'
          x = new java.util.Random().nextInt(r.length()))  //    Select a random index in the String
      ;                                                    //   End loop that determines random index containing 'O' (implicit / no body)
  }                                                        //  End loop
}                                                          // End method

टेस्ट जिफ़ (4,6)

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


0

पर्ल, 148 बाइट्स

कोड + -plझंडे के 146 बाइट्स ।

$_=O x($x=$_+1);s/O\K./_/g;for$i(1..($y=<>)){$b.=($i%2?$_:_.s/.$//r).$/}}print$_="\e[H$b";while(/O/){$r=0|rand$y*$x+3;s/.{$r}\KO/X/s||redo;sleep 1

इसे चलाने के लिए:

perl -ple '$_=O x($x=$_+1);s/O\K./_/g;for$i(1..($y=<>)){$b.=($i%2?$_:_.s/.$//r).$/}}print$_="\e[H$b";while(/O/){$r=0|rand$y*$x+3;s/.{$r}\KO/X/s||redo;sleep 1' <<< "6
4"

0

MATLAB (R2016b), 172 बाइट्स

कोड:

x=input('');m=[eye(x(2),x(1)) ''];m(:)='O';m(1:2:end,2:2:end)='_';m(2:2:end,1:2:end)='_';o=find(m=='O');r=o(randperm(nnz(o)));disp(m);for i=r';pause(1);m(i)='X';disp(m);end

सिफारिशों का हमेशा स्वागत है! इसे ऑनलाइन आज़माएं!

कार्यक्रम का आउटपुट:

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

स्पष्टीकरण:

x = input( '' );                    % Input
m = [ eye( x( 2 ), x( 1 ) ) '' ];   % Character Matrix
m( : ) = 'O';                       % Fill Matrix with "Bubbles"

m( 1:2:end, 2:2:end ) = '_';        % Alternate Spaces Between Bubbles (Part 1)
m( 2:2:end, 1:2:end ) = '_';        % Alternate Spaces Between Bubbles (Part 2)

o = find( m == 'O' );               % Index Bubble Locations
r = o( randperm( nnz( o ) ) );      % Randomize Bubble Locations

disp( m );                          % Display Initial Bubble Wrap Phase

for i = r'
    pause( 1 );                     % Pause for 1 Second
    m( i ) = 'X';                   % Pop Bubble
    disp( m );                      % Display Subsequent Bubble Wrap Phase
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.