Tạo một mô phỏng bong bóng bọc


23

Bong bóng kết thúc là giải trí cấp tối đa. Mọi người có thể đồng ý với điều đó.

Bây giờ, bạn sẽ làm cho ngay cả máy tính thưởng thức kết thúc bong bóng.

Thông số kỹ thuật

Bạn sẽ được cung cấp hai số nguyên, w và h. (Mỗi số có chiều rộng và chiều cao đáp ứng)

Chương trình của bạn sẽ xuất tất cả các giai đoạn w * h chờ 1 giây giữa mỗi giai đoạn và kết thúc.

Mỗi bọc bong bóng bắt đầu với tất cả các ô đầy đủ.

Ví dụ: bọc bong bóng 4 * 6 bắt đầu như sau:

O_O_
_O_O
O_O_
_O_O
O_O_
_O_O

Và mỗi giai đoạn, một ô không xuất hiện ngẫu nhiên được bật lên. Ví dụ:

O_O_
_O_O
O_X_
_O_O
O_O_
_O_O

Chương trình sẽ chấm dứt khi tất cả các ô được bật. aka

X_X_
_X_X
X_X_
_X_X
X_X_
_X_X

Ví dụ

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

Chúng ta có thể sử dụng 10thay vì OX?
Pavel

1
NEEDZ BUBBLEZ vui lòng gửi trợ giúp
Christopher

3
Có thể chấp nhận được việc (1,1)không có bong bóng (ví dụ: "ô" trên cùng bên trái luôn luôn là dấu gạch dưới)?
Jonathan Allan

1
@Jonathan Allan Có.
Matthew Roh

1
@KevinCruijssen Nó không phải là một chương trình đầy đủ.
Matthew Roh

Câu trả lời:


7

C (Windows), 260 248 byte

#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);}

nhập mô tả hình ảnh ở đây


Lưu ý rằng có một hàm ngủ trong thư viện luồng, được bao gồm trong C ++ 11.
Matthew Roh

@MatthewRoh Yep, nhưng cái này ngắn hơn và system("cls")cũng đặc trưng cho Windows, vì vậy mã sẽ không dễ mang theo hơn với thư viện luồng. Và với C ++ tôi cũng cần bao gồm iostreamhoặc cstdio.
Steadybox

btw bạn không cần thiết lập lại màn hình. Điều đó sẽ làm cho nó ngắn hơn.
Matthew Roh

5

Python 3 , 222 220 byte

Đây là lần đầu tiên tôi trả lời, vì vậy hãy nhẹ nhàng (và chỉ ra những sai lầm mà tôi đã mắc phải).

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)

Hãy thử trực tuyến!

Làm thế nào nó hoạt động:

  1. Xâu chuỗi nhiều '0 _' 'với nhau
  2. Cắt thành các phần '0_0 _... \ n' và '_0_0 ... \ n' và nối
  3. Tạo các chỉ số ngẫu nhiên cho đến khi char tại chỉ mục là '0'
  4. Tạo chuỗi mới với char tại chỉ mục được tạo được thay thế bằng 'X' (Chết tiệt bạn trăn cho các chuỗi không thể thay đổi!)
  5. Lặp lại r*c+r%2*c%2thời gian: Có các r*cbong bóng trong mẫu, trừ khi r và c đều lẻ, trong trường hợp này có r*c+1.

1
Chào mừng đến với PPCG!
admBorkBork

1
Điều này là khá nhỏ, nhưng chiều rộng và chiều cao của bạn bị đảo ngược. Câu trả lời tuyệt vời mặc dù! (Chỉ cần thay đổi nó f(c,r)và bạn sẽ ổn thôi).
rassar

@rassar Woops, cảm ơn bạn!
nile

4

MATL , 37 byte

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

Góc trên bên trái luôn là một dấu gạch dưới (được cho phép bởi thử thách).

Màn hình bị xóa giữa các giai đoạn. Tôi có thể lưu một byte bằng cách không xóa màn hình, nhưng nó có vẻ tốt hơn theo cách này.

Chương trình thoát với một lỗi ( được mặc định cho phép ) sau khi hiển thị tất cả các pha.

Hãy thử nó tại MATL Online! (Nếu nó không hoạt động sau vài giây, vui lòng làm mới trang và thử lại).


4

Toán học (145 byte)

Hàm ẩn danh, lấy chiều cao và chiều rộng làm đầu vào (theo thứ tự đó - nếu đó là một vấn đề, thay thế {##}bằng {#2,#}ở giữa mã để có thêm 2 byte).

Mã số:

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

Giải trình:

  • ""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"] tạo ra bọc bong bóng ban đầu, không bị cắt, bằng cách tạo một mảng "_" s và "O" và sau đó StringJoining chúng giữa các dòng mới.
  • NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]liên tục chọn một trong các chữ "O" để thay thế bằng chữ "X", bao nhiêu lần có chữ "O" (đó là Tầng [chiều rộng * chiều cao / 2] - cảm ơn @JonathanAllan vì ý tưởng đặt "_" "Thay vì" O "ở góc trên cùng bên trái, nếu không, điều này sẽ Ceilingthay thế và do đó thêm 2 byte).
  • Monitor[Do[Pause@1,{i,...}],i]thực ihiện lấy các giá trị trong danh sách mà chúng ta vừa tính toán, trong mỗi 1 giây và in động i.

Ví dụ đầu ra:

GIF của Mathicala popping bong bóng bọc


3

Thạch , 30 29 byte

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

Chạy ví dụ

Gọi liên kết dưới dạng dyad với các đối số của chương trình và sau đó thoát ra bằng một thông báo (mã này là çṛ“\'=ṙMḋḌẓ(ėo»)

Nuance: các "tế bào" phía dưới bên phải sẽ luôn là một bong bóng (chứ không phải phía trên bên trái giống như ví dụ trong câu hỏi), điều này là để đảm bảo rằng khi tất cả các bong bóng được popped trở về lựa chọn ngẫu nhiên 0 đó sẽ là "X"tại cuối danh sách - thay thế sau đó sẽ không thay đổi giá trị và phá vỡ vòng lặp.

Lưu ý: không xóa màn hình (không được chỉ định và tôi không chắc làm thế nào để làm như vậy).

Làm sao?

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

Scala , 764 byte

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

Làm thế nào nó hoạt động

Thuật toán trước tiên điền vào Chuỗi 2D với các giá trị sai. Nó xác định có bao nhiêu lần lặp (hộp mở) tồn tại dựa trên các đối số dòng lệnh được đặt vào. Nó tạo ra một nếp gấp với giá trị này là giới hạn trên. Giá trị nguyên của nếp gấp chỉ được sử dụng ngầm như một cách để đếm số lần lặp mà thuật toán nên chạy. Trình tự điền mà chúng ta đã tạo trước đây là trình tự bắt đầu cho nếp gấp. Điều này được sử dụng trong việc tạo ra một chuỗi 2D mới của các giá trị sai với các phân đoạn cooresponding của chúng.

Ví dụ,

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

Sẽ bị biến thành

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

Lưu ý rằng tất cả các danh sách hoàn toàn đúng (có độ dài bằng 0) được bỏ qua khỏi danh sách kết quả. Thuật toán sau đó lấy danh sách này và chọn một danh sách ngẫu nhiên trong danh sách ngoài cùng. Danh sách ngẫu nhiên được chọn là hàng ngẫu nhiên chúng tôi chọn. Từ hàng ngẫu nhiên đó, chúng ta lại tìm thấy một số ngẫu nhiên, một chỉ mục cột. Khi chúng tôi tìm thấy hai chỉ số ngẫu nhiên này, chúng tôi ngủ chuỗi chúng tôi đang ở trong 1000 giây.

Sau khi ngủ xong, chúng tôi xóa màn hình và tạo một bảng mới với truegiá trị được cập nhật trong các chỉ số ngẫu nhiên mà chúng tôi đã tạo.

Để in nó ra một cách chính xác, chúng tôi sử dụng mapvà nén nó với chỉ mục của bản đồ để chúng tôi có nó trong bối cảnh của chúng tôi. Chúng tôi sử dụng giá trị thật của chuỗi để xem chúng tôi nên in một Xhoặc một Ohoặc _. Để chọn cái sau, chúng tôi sử dụng giá trị chỉ mục làm hướng dẫn.

Những điều thú vị cần lưu ý

Để tìm ra nếu nó nên in một Ohoặc một _, điều kiện ((r._2 % 2) + c._2) % 2 == 0được sử dụng. r._2đề cập đến chỉ số hàng hiện tại trong khi c._2đề cập đến cột hiện tại. Nếu một trong một hàng lẻ, r._2 % 2sẽ là 1, do đó bù đắp c._2cho một trong điều kiện. Điều này đảm bảo rằng trên các hàng lẻ, các cột được di chuyển qua 1 như dự định.

In ra chuỗi "\033[H\033[2J\n", theo một số câu trả lời Stackoverflow tôi đọc, xóa màn hình. Đó là viết byte cho thiết bị đầu cuối và làm một số thứ thú vị mà tôi không thực sự hiểu. Nhưng tôi đã tìm thấy nó là cách dễ nhất để đi về nó. Mặc dù vậy, nó không hoạt động trên trình giả lập giao diện điều khiển của Intellij IDEA. Bạn sẽ phải chạy nó bằng thiết bị đầu cuối thông thường.

Một phương trình khác người ta có thể thấy lạ khi lần đầu tiên nhìn vào mã này (l * k) / 2 - (l * k + 1) % 2. Đầu tiên, hãy làm sáng tỏ tên biến. lđề cập đến các đối số đầu tiên được truyền vào chương trình trong khi kđề cập đến đối số thứ hai. Để dịch nó , (first * second) / 2 - (first * second + 1) % 2. Mục tiêu của phương trình này là đưa ra số lần lặp chính xác cần thiết để có được một chuỗi tất cả X. Lần đầu tiên tôi làm điều này, tôi chỉ làm (first * second) / 2điều đó có ý nghĩa. Đối với mỗi nyếu tố trong mỗi danh sách phụ, có những n / 2bong bóng chúng ta có thể bật. Tuy nhiên, điều này bị phá vỡ khi xử lý các đầu vào như(11 13). Chúng ta cần tính toán tích của hai số, làm cho số lẻ thành số chẵn và thậm chí nếu nó là số lẻ, sau đó lấy mod của số đó bằng 2. Điều này hoạt động vì các hàng và cột lẻ sẽ yêu cầu một lần lặp ít hơn để đi đến kết quả cuối cùng.

mapđược sử dụng thay forEachvì bởi vì nó có ít ký tự hơn.

Những điều có lẽ có thể được cải thiện

Một điều thực sự làm tôi khó chịu về giải pháp này là việc sử dụng thường xuyên zipWithIndex. Nó chiếm quá nhiều nhân vật. Tôi đã cố gắng làm cho nó để tôi có thể xác định hàm một ký tự của riêng mình sẽ thực hiện zipWithIndexvới giá trị được truyền vào. Nhưng hóa ra Scala không cho phép một hàm ẩn danh có các tham số loại. Có lẽ có một cách khác để làm những gì tôi đang làm mà không sử dụng zipWithIndexnhưng tôi đã không nghĩ quá nhiều về một cách thông minh để làm điều đó.

Hiện tại, mã chạy trong hai lần. Cái đầu tiên tạo ra một bảng mới trong khi cái thứ hai in nó ra. Tôi nghĩ rằng nếu một người kết hợp hai đường chuyền này thành một đường chuyền, điều đó sẽ tiết kiệm được một vài byte.

Đây là mã golf đầu tiên tôi đã thực hiện nên tôi chắc chắn có rất nhiều chỗ để cải thiện. Nếu bạn muốn xem mã trước khi tôi tối ưu hóa cho byte càng nhiều càng tốt, thì đây là.


1

JavaScript (ES6), 246 229 byte

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>


Chiều rộng không phải là về các ô - mà bao gồm các khoảng trắng (gạch chân).
Matthew Roh

@MatthewRoh Xin lỗi, tôi nhớ sửa nó cho chiều cao nhưng tôi quên kiểm tra chiều rộng.
Neil

Hmm .. không thể phần này: `${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}được kết hợp bằng cách nào đó? Có lẽ một boolean-cờ đầu tiên xác định _Ohoặc O_, và sau đó làm .repeat(w).slice(w)?
Kevin Cruijssen

1
@KevinCruijssen Tôi đã mất 16 byte vì một lỗi nhanh chóng mà tôi không có thời gian để chơi gôn vào thời điểm đó. Kể từ đó, tôi đã có một cái nhìn khác và đưa ra cách tiết kiệm 17 byte,
Neil

1

Python - 290 byte

Tôi chưa bao giờ thực hiện một trong những điều này trước đây - vì vậy mọi lời chỉ trích mang tính xây dựng sẽ được đánh giá cao :)

Thủ thuật chính ở đây chỉ là sự hiểu biết danh sách lồng nhau khó chịu. Tôi có thể cứu một vài nhân vật bằng cách không có một dòng mới giữa các pop nhưng điều đó trông thật xấu xí.

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)

Xin chào, chào mừng đến với PPCG! Thách thức là lấy đầu vào whlàm đầu vào (thông qua STDIN, làm đầu vào chức năng hoặc một cái gì đó tương tự), thay vì có mã hóa cứng H=4 W=6. Ngoài ra, mặc dù tôi chưa bao giờ lập trình bằng Python, tôi nghĩ bạn có thể chơi một số khoảng trắng trong mã hiện tại của mình. Lời khuyên cho việc chơi gôn trong Python cũng có thể thú vị để đọc qua để cung cấp cho bạn ý tưởng về cách đánh gôn xuống hơn nữa. Tận hưởng kì nghỉ của bạn! :)
Kevin Cruijssen

Ngoài ra, liên quan đến nhận xét của bạn: " Tôi có thể cứu một vài nhân vật bằng cách không có một dòng mới giữa các cửa sổ bật lên nhưng điều đó trông thật xấu xí. " Dù nó xấu xí hay không được thực hiện như thế nào trong lập trình thực tế, codegolf vẫn tiết kiệm như càng nhiều byte càng tốt. Càng ngắn và xấu, càng tốt. ;)
Kevin Cruijssen

@KevinCruijssen Python3 ở trên tôi chỉ có chức năng của w, h, điều đó có được phép không?
Arya


1
Ok - Bây giờ tôi đã biến nó thành chức năng của H và W.
Arya

1

Than , 49 46 39 byte (không biên dịch)

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

Rực rỡ

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 byte

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

⎕← sản lượng
m←m , nơi m
'O_'[... ] những nhân vật được lập chỉ mục bởi ...
2| bộ phận-dư-khi-chia-by-hai của
-/¨ sự khác biệt giữa mỗi người trong số
 tất cả các tọa độ (chỉ số) trong một loạt các hình dạng
 đầu vào số (số lượng hàng và cột )

(... )[... ]←'X' gán nhân vật X để một trong những ...
b/ lọc theo từng b (được xác định)
,m raveled yếu tố của m, đặc biệt là ...
? một yếu tố ngẫu nhiên (số lit.) trong một phạm vi để
+/ tổng của
b←b , nơi b
'O'= Boolean cho nơi mà chữ bằng
,mm raveled

⎕DL 1D e l ay một giây

→2 Chuyển đến dòng 2
/⍨ nếu (lit. được lọc bởi)
'O'∊ liệu chữ cái có phải là thành viên của
⎕←m giá trị xuất ra hay không, trong đó giá trị xuất ra là m

Hãy thử trực tuyến!


Từ phiên bản 16.0 sẽ ngắn hơn:

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


1

Python 3, 195 188 byte

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)

Sử dụng bytearraydecodedường như ngắn hơn cắt và ghép lại một chuỗi a la 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 byte

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()));}}

Giải trình:

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

Kiểm tra gif (4,6)

nhập mô tả hình ảnh ở đây


0

Perl, 148 byte

146 byte mã + -plcờ.

$_=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

Để chạy nó:

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 byte

Mã số:

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

Khuyến nghị luôn được chào đón! Hãy thử trực tuyến!

Chương trình đầu ra:

nhập mô tả hình ảnh ở đây

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.