ทำโปรแกรมจำลองการพันด้วยฟอง


23

Bubble-wraps เป็นความบันเทิงระดับสูงสุด ทุกคนสามารถเห็นด้วยกับที่

ตอนนี้คุณจะทำให้คอมพิวเตอร์ของคุณเพลิดเพลินไปกับการตัดฟอง

รายละเอียด

คุณจะได้รับจำนวนเต็มสองจำนวนคือ 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หรือไม่
Pavel

1
NEEDZ BUBBLEZ กรุณาส่งความช่วยเหลือ
Christopher

3
เป็นที่ยอมรับหรือ(1,1)ไม่ที่จะไม่มีฟอง (เช่น "เซลล์" ด้านซ้ายบนเป็นขีดล่างเสมอ)?
Jonathan Allan

1
@JanathanAllan ใช่
Matthew Roh

1
@KevinCruijssen ไม่จำเป็นต้องเป็นโปรแกรมแบบเต็ม
Matthew Roh

คำตอบ:


7

C (Windows) 260 2608 ไบต์

#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
Matthew Roh

@MatthewRoh Yep แต่นี่จะสั้นกว่าและsystem("cls")มันก็เป็นแบบเฉพาะ Windows ดังนั้นรหัสจะไม่สามารถพกพาได้มากขึ้นเมื่อใช้ไลบรารีเธรด และด้วย C ++ ฉันยังจะต้องรวมหรือiostream cstdio
Steadybox

btw คุณไม่จำเป็นต้องรีเซ็ตหน้าจอ ที่จะทำให้สั้นลง
Matthew Roh

5

Python 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' (Damn you python สำหรับสตริงที่ไม่สามารถเปลี่ยนแปลงได้!)
  5. ทำซ้ำr*c+r%2*c%2ครั้ง: มีr*cฟองอากาศในรูปแบบเว้นแต่ R และ C r*c+1มีทั้งแปลกซึ่งในกรณีที่มี

1
ยินดีต้อนรับสู่ PPCG!
AdmBorkBork

1
สิ่งนี้ค่อนข้างน้อย แต่ความกว้างและความสูงของคุณกลับด้าน คำตอบที่ดีแม้ว่า! (เพียงแค่เปลี่ยนเป็นf(c,r)และคุณจะสบายดี)
rassar

@rassar Woops ขอบคุณ!
แม่น้ำไนล์

4

MATL , 37 ไบต์

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

มุมซ้ายบนเป็นขีดล่างเสมอ (อนุญาตโดยการท้าทาย)

หน้าจอจะถูกล้างระหว่างเฟส ฉันสามารถบันทึกไบต์ด้วยการไม่ล้างหน้าจอ แต่ดูดีขึ้นด้วยวิธีนี้

โปรแกรมออกจากพร้อมข้อผิดพลาด ( อนุญาตโดยค่าเริ่มต้น ) หลังจากแสดงเฟสทั้งหมด

ลองที่MATL Online! (หากไม่ได้ผลภายในสองสามวินาทีโปรดรีเฟรชหน้าเว็บแล้วลองอีกครั้ง)


4

Mathematica (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"] สร้างบับเบิ้ลแรปเริ่มต้นที่ไม่แตกโดยสร้างอาร์เรย์ของ "_" และ "O" s จากนั้น StringJoining พวกมันระหว่างบรรทัดใหม่
  • NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]เลือกหนึ่งใน "O" s ซ้ำ ๆ เพื่อแทนที่ด้วย "X" หลาย ๆ ครั้งที่มี "O" s (ซึ่งคือ Floor [width * height / 2] - ขอบคุณ @JonathanAllan สำหรับแนวคิดของการวาง "_ "แทนที่จะเป็น" O "ที่มุมซ้ายบนมิฉะนั้นจะเป็นแบบนี้Ceilingแทนและจะเพิ่มอีก 2 ไบต์)
  • Monitor[Do[Pause@1,{i,...}],i]ทำให้iใช้ค่าในรายการเราก็คำนวณเวลา 1 iวินาทีในแต่ละครั้งและพิมพ์แบบไดนามิก

ตัวอย่างผลลัพธ์:

GIF ของ Mathematica popping บับเบิ้ลแรป


3

เจลลี่ , 30 29 ไบต์

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

ตัวอย่างการวิ่ง

เรียกลิงก์เป็น dyad พร้อมกับอาร์กิวเมนต์ของโปรแกรมจากนั้นออกจากข้อความ (โค้ดที่เป็นçṛ“\'=ṙMḋḌẓ(ėo»)

ความแตกต่างกันนิดหน่อย: "เซลล์" ด้านล่างขวาจะเป็นฟอง (แทนที่จะเป็นมุมบนซ้ายเหมือนตัวอย่างในคำถาม) นี่คือเพื่อให้แน่ใจว่าเมื่อฟองอากาศทั้งหมดถูกผุดตัวเลือกสุ่มจะส่งกลับ 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)

@ ГригорийПерельманเขียนขึ้น
Jonathan Allan

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

มันทำงานอย่างไร

อัลกอริทึมแรกเติมลำดับ 2D ด้วยค่าเท็จ มันกำหนดจำนวนซ้ำ (กล่องเปิด) อยู่บนพื้นฐานของอาร์กิวเมนต์บรรทัดคำสั่งใส่มันจะสร้างเท่าที่มีค่านี้เป็นขอบเขตบน ค่าจำนวนเต็มของการพับนั้นใช้โดยนัยเป็นวิธีการนับจำนวนการวนซ้ำที่อัลกอริทึมควรใช้ ลำดับที่เราเติมไว้ก่อนหน้านี้คือลำดับเริ่มต้นของการพับ สิ่งนี้ใช้ในการสร้างลำดับ 2 มิติใหม่ของค่าเท็จด้วยดัชนีที่ไม่สอดคล้องกัน

ตัวอย่างเช่น,

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

จะกลายเป็น

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

โปรดทราบว่ารายการทั้งหมดที่เป็นจริงอย่างสมบูรณ์ (มีความยาวเท่ากับ 0) จะถูกตัดออกจากรายการผลลัพธ์ อัลกอริทึมจะใช้รายการนี้และเลือกรายการสุ่มในรายการนอกสุด รายการแบบสุ่มถูกเลือกให้เป็นแถวแบบสุ่มที่เราเลือก จากแถวสุ่มนั้นเราจะพบตัวเลขสุ่มดัชนีคอลัมน์อีกครั้ง เมื่อเราพบดัชนีสุ่มสองตัวนี้แล้วเราจะนอนด้ายที่เราใช้เป็นเวลา 1,000 มิลลิวินาที

หลังจากที่เรานอนหลับเสร็จแล้วเราจะล้างหน้าจอและสร้างบอร์ดใหม่ที่มีtrueค่าอัปเดตในดัชนีสุ่มที่เราสร้าง

ในการพิมพ์ออกมาอย่างถูกต้องเราใช้mapและ zip ด้วยดัชนีของแผนที่เพื่อให้เรามีในบริบทของเรา เราใช้ค่าความจริงของลำดับเป็นไปได้ว่าเราควรจะพิมพ์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. เป้าหมายของสมการนี้คือหาจำนวนที่แน่นอนของการวนซ้ำที่จำเป็นเพื่อให้ได้ลำดับของ X ทั้งหมด ครั้งแรกที่ฉันทำสิ่งนี้ฉันทำ(first * second) / 2ตามที่สมเหตุสมผล สำหรับทุกnองค์ประกอบในแต่ละรายการย่อยมีn / 2ฟองอากาศที่เราสามารถป๊อปได้ อย่างไรก็ตามสิ่งนี้จะแตกเมื่อจัดการกับอินพุตเช่น(11 13). เราต้องคำนวณผลคูณของตัวเลขสองตัวทำให้มันแปลกถ้ามันเป็นเลขคู่และแม้ว่ามันจะเป็นเลขคี่และจากนั้นก็หาค่า mod ของมันด้วย 2 มันใช้ได้เพราะแถวและคอลัมน์ที่คี่จะต้องใช้การวนซ้ำน้อยกว่า เพื่อรับผลสุดท้าย

mapถูกใช้แทน a forEachเนื่องจากมีอักขระน้อยกว่า

สิ่งที่อาจปรับปรุงได้

zipWithIndexสิ่งหนึ่งที่เป็นโรคจิตจริงๆฉันเกี่ยวกับการแก้ปัญหานี้คือการใช้บ่อย มันใช้ตัวละครมากมาย ฉันพยายามที่จะทำให้มันเพื่อที่ฉันจะสามารถกำหนดฟังก์ชั่นตัวละครตัวหนึ่งของตัวเองที่จะดำเนินการzipWithIndexกับค่าที่ส่งผ่านแต่ปรากฎว่า Scala ไม่อนุญาตให้ฟังก์ชั่นที่ไม่ระบุชื่อมีพารามิเตอร์ประเภท อาจมีวิธีอื่นในการทำสิ่งที่ฉันทำโดยไม่ใช้zipWithIndexแต่ฉันไม่ได้คิดมากเกี่ยวกับวิธีที่ชาญฉลาดในการทำ

ขณะนี้รหัสทำงานในสองรอบ บอร์ดแรกสร้างบอร์ดใหม่ในขณะที่พาสที่สองพิมพ์ออกมา ฉันคิดว่าหากมีการรวมสองผ่านเหล่านี้เป็นหนึ่งผ่านที่จะบันทึกสองสามไบต์

นี่เป็นกอล์ฟรหัสแรกที่ฉันได้ทำดังนั้นฉันมั่นใจว่ามีพื้นที่มากมายสำหรับการปรับปรุง หากคุณต้องการที่จะเห็นรหัสก่อนที่ฉันจะเพิ่มประสิทธิภาพสำหรับไบต์ให้มากที่สุดที่นี่เป็น


1

JavaScript (ES6), 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>


ความกว้างไม่ได้อยู่ในรูปของเซลล์ - แต่รวมถึงช่องว่าง (ขีดเส้นใต้)
Matthew Roh

@ MatthewRoh ขออภัยฉันจำได้ว่าต้องแก้ไขความสูง แต่ฉันลืมตรวจสอบความกว้าง
Neil

อืม .. ไม่สามารถรวมส่วนนี้`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}เข้าด้วยกันได้? อาจเป็นบูลีน - ธงเพื่อกำหนด_OหรือO_ก่อนแล้วจึงทำ.repeat(w).slice(w)?
Kevin Cruijssen

1
@KevinCruijssen ฉันเสีย 16 ไบต์เพราะข้อผิดพลาดอย่างรวดเร็วซึ่งฉันไม่มีเวลาเล่นกอล์ฟในเวลานั้น ฉันได้ดูอีกครั้งแล้วเกิดการประหยัด 17 ไบต์
Neil

1

Python - 290 ไบต์

ฉันไม่เคยทำสิ่งเหล่านี้มาก่อน - ดังนั้นคำวิจารณ์เชิงสร้างสรรค์ใด ๆ จะได้รับการชื่นชม :)

เคล็ดลับหลักที่นี่เป็นเพียงความเข้าใจในรายการที่ซ้อนกันอย่างน่ารำคาญ ฉันสามารถบันทึกตัวละครไม่กี่ตัวโดยไม่ต้องมีการขึ้นบรรทัดใหม่ระหว่าง pops แต่นั่นดูน่าเกลียด

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เป็น input (ผ่าน STDIN เช่นใส่ฟังก์ชั่นหรือสิ่งที่คล้ายกัน) แทนที่จะมี H=4 W=6hardcoded นอกจากนี้แม้ว่าฉันจะไม่เคยตั้งโปรแกรมใน Python แต่ฉันคิดว่าคุณสามารถเล่นกอล์ฟในช่องว่างในรหัสปัจจุบันของคุณได้ เคล็ดลับสำหรับการเล่นกอล์ฟใน Pythonอาจเป็นเรื่องที่น่าสนใจในการอ่านเพื่อให้แนวคิดเกี่ยวกับวิธีการตีกอล์ฟต่อไป เพลิดเพลินไปกับการพักผ่อนของคุณ! :)
Kevin Cruijssen

นอกจากนี้เกี่ยวกับความคิดเห็นของคุณ: " ฉันสามารถบันทึกตัวละครไม่กี่ตัวโดยไม่ต้องมีการขึ้นบรรทัดใหม่ระหว่าง pops แต่มันก็ดูน่าเกลียด " ไม่ว่าจะน่าเกลียดหรือไม่ได้ทำในการเขียนโปรแกรมในชีวิตจริง codegolf เป็นเรื่องการบันทึก ไบต์มากที่สุด ยิ่งสั้นและน่าเกลียดก็ยิ่งดี ;)
Kevin Cruijssen

@KevinCruijssen Python3 ที่อยู่เหนือฉันเพียงแค่มีฟังก์ชั่นของ w, h, ที่ได้รับอนุญาต?
Arya


1
โอเค - ฉันได้ทำหน้าที่ของ H และ W ตอนนี้
Arya

1

ถ่าน , 49 46 39 ไบต์ (ไม่ใช่การแข่งขัน)

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' กำหนดตัวอักษร X ให้เป็นหนึ่งใน ...
b/ กรองทีละ (ที่จะกำหนด)
,m องค์ประกอบของม. โดยเฉพาะ ... raveled
? องค์ประกอบสุ่ม (หมายเลขสว่าง) ในช่วงหนึ่งเพื่อ
+/ ผลรวมของ
b←ที่เป็น
'O'= บูลีน เพราะที่จดหมายเท่ากับ
,mm raveled

⎕DL 1D E L Ay หนึ่งวินาที

→2 ไปที่บรรทัด 2
/⍨ ถ้า (lit. กรองโดย)
'O'∊ ว่าตัวอักษรเป็นสมาชิกของ
⎕←m ค่าเอาท์พุทโดยที่ค่าเอาท์พุทเป็นm

ลองออนไลน์!


จากเวอร์ชัน 16.0 มันจะสั้นกว่า:

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


1

Python 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

Java 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

ทดสอบ gif (4,6)

ป้อนคำอธิบายรูปภาพที่นี่


0

Perl, 148 ไบต์

146 ไบต์ของรหัสเมือง + -plธง

$_=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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.