Bubble-wraps adalah hiburan tingkat maksimum. Semua orang bisa menyetujui itu.
Sekarang, Anda akan membuat komputer lebih menikmati gelembung.
Spesifikasi
Anda akan diberi dua bilangan bulat, w, dan h. (Masing-masing lebar dan tinggi responsif)
Program Anda harus menampilkan semua fase w, menunggu 1 detik antara masing-masing dan berakhir
Setiap bungkus gelembung dimulai dengan semua sel penuh.
Misalnya, bungkus gelembung 4 * 6 dimulai seperti:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
Dan setiap fase, sel acak yang tidak muncul muncul. Misalnya,
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
Program harus berhenti ketika semua sel muncul. alias.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Contohnya
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
dan0
bukannyaO
danX
?(1,1)
tidak memiliki gelembung (mis. "Sel" kiri atas selalu berupa garis bawah)?Jawaban:
C (Windows),
260248 bytesumber
system("cls")
ini juga khusus Windows, jadi kodenya tidak akan lebih portabel dengan pustaka thread. Dan dengan C ++ saya juga perlu memasukkaniostream
ataucstdio
.Python 3 ,
222220 byteIni adalah pertama kalinya saya menjawab, jadi harap bersikap lembut (dan tunjukkan kesalahan yang telah saya buat).
Cobalah online!
Bagaimana itu bekerja:
r*c+r%2*c%2
waktu: Adar*c
gelembung dalam pola, kecuali r dan c keduanya aneh, dalam hal ini adar*c+1
.sumber
f(c,r)
dan Anda akan baik-baik saja).MATL , 37 byte
Sudut kiri atas selalu berupa garis bawah (diizinkan oleh tantangan).
Layar dihapus di antara fase. Saya bisa menghemat satu byte dengan tidak membersihkan layar, tetapi tampilannya lebih baik seperti ini.
Program keluar dengan kesalahan ( diizinkan secara default ) setelah menampilkan semua fase.
Cobalah di MATL Online! (Jika tidak berfungsi setelah beberapa detik, segarkan halaman dan coba lagi).
sumber
Mathematica (145 bytes)
Fungsi anonim, mengambil tinggi dan lebar sebagai input (dalam urutan itu - jika itu masalah, ganti
{##}
dengan{#2,#}
di tengah kode untuk tambahan 2 byte).Kode:
Penjelasan:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
membuat wrap-wrap awal yang tidak terpancing, dengan membuat array "_" dan "O" lalu StringJoining mereka di antara baris baru.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
berulang kali memilih salah satu dari "O" untuk menggantikan dengan "X", sebanyak yang ada "O" (yaitu Lantai [lebar * tinggi / 2] - terima kasih kepada @JonathanAllan untuk ide menempatkan "_ "Bukan" O "di sudut kiri atas, kalau tidak, ini akan menjadiCeiling
2 byte lebih banyak).Monitor[Do[Pause@1,{i,...}],i]
makei
mengambil nilai dalam daftar yang baru saja kita hitung, masing-masing untuk 1 detik, dan dicetak secara dinamisi
.Contoh output:
sumber
Jelly ,
3029 byteMemanggil tautan sebagai angka dua dengan argumen program dan kemudian berhenti dengan pesan (kode untuk itu
çṛ“\'=ṙMḋḌẓ(ėo»
)Nuansa: "sel" kanan-bawah akan selalu berupa gelembung (daripada bagian kiri atas seperti contoh dalam pertanyaan), ini untuk memastikan bahwa ketika semua gelembung muncul, pilihan acak mengembalikan 0 yang akan menjadi
"X"
pada akhir daftar - mengganti yang kemudian tidak membuat perubahan pada nilai dan memutus loop.Catatan: tidak menghapus layar (tidak ditentukan, dan saya tidak yakin bagaimana melakukannya).
Bagaimana?
sumber
Scala , 764 byte
Bagaimana itu bekerja
Algoritme pertama mengisi Urutan 2D dengan nilai-nilai salah. Ini menentukan berapa banyak iterasi (kotak terbuka) yang ada berdasarkan argumen baris perintah yang dimasukkan. Ini menciptakan lipatan dengan nilai ini sebagai batas atas. Nilai integer dari lipatan hanya digunakan secara implisit sebagai cara untuk menghitung berapa banyak iterasi yang harus dijalankan oleh algoritma. Urutan diisi yang kita buat sebelumnya adalah urutan awal untuk lipatan. Ini digunakan dalam menghasilkan urutan 2D baru dari nilai palsu dengan indek cooresponding mereka.
Sebagai contoh,
Akan diubah menjadi
Perhatikan bahwa semua daftar yang sepenuhnya benar (memiliki panjang 0) dihilangkan dari daftar hasil. Algoritme kemudian mengambil daftar ini dan memilih daftar acak di daftar terluar. Daftar acak dipilih sebagai baris acak yang kita pilih. Dari baris acak itu, kita kembali menemukan angka acak, indeks kolom. Setelah kami menemukan dua indeks acak ini, kami tidur utasnya selama 1000 milidetik.
Setelah kami selesai tidur, kami membersihkan layar dan membuat papan baru dengan
true
nilai yang diperbarui dalam indeks acak yang telah kami buat.Untuk mencetak ini dengan benar, kami menggunakan
map
dan zip dengan indeks peta sehingga kami memilikinya dalam konteks kami. Kami menggunakan nilai kebenaran dari urutan, apakah kami harus mencetakX
atau salah satuO
atau_
. Untuk memilih yang terakhir, kami menggunakan nilai indeks sebagai panduan kami.Hal-hal menarik untuk diperhatikan
Untuk mengetahui apakah harus mencetak
O
atau_
, kondisi((r._2 % 2) + c._2) % 2 == 0
digunakan.r._2
merujuk ke indeks baris saat ini sementarac._2
mengacu pada kolom saat ini. Jika seseorang berada di baris aneh,r._2 % 2
akan menjadi 1, oleh karena itu mengimbangic._2
dengan satu di kondisi. Ini memastikan bahwa pada baris ganjil, kolom dipindahkan oleh 1 sebagaimana dimaksud.Mencetak string
"\033[H\033[2J\n"
, menurut beberapa jawaban Stackoverflow yang saya baca, membersihkan layar. Ini menulis byte ke terminal dan melakukan beberapa hal funky yang saya tidak begitu mengerti. Tetapi saya telah menemukan ini sebagai cara termudah untuk melakukannya. Ini tidak bekerja pada emulator konsol Intellij IDEA. Anda harus menjalankannya menggunakan terminal reguler.Persamaan lain yang mungkin aneh untuk dilihat ketika pertama kali melihat kode ini adalah
(l * k) / 2 - (l * k + 1) % 2
. Pertama, mari kita demistifikasikan nama-nama variabel.l
mengacu pada argumen pertama yang diteruskan ke program sementarak
mengacu pada argumen kedua. Untuk menerjemahkannya(first * second) / 2 - (first * second + 1) % 2
,. Tujuan dari persamaan ini adalah untuk menghasilkan jumlah iterasi yang dibutuhkan untuk mendapatkan urutan semua X. Pertama kali saya melakukan ini, saya hanya melakukan(first * second) / 2
itu masuk akal. Untuk setiapn
elemen di setiap sublist, adan / 2
gelembung yang dapat kami pop. Namun, ini rusak ketika berhadapan dengan input seperti(11 13)
. Kita perlu menghitung produk dari dua angka, membuatnya aneh jika itu genap, dan bahkan jika itu aneh, dan kemudian mengambil mod itu dengan 2. Ini bekerja karena baris dan kolom yang aneh akan membutuhkan satu iterasi lebih sedikit untuk sampai ke hasil akhir.map
digunakan sebagai gantiforEach
karena memiliki lebih sedikit karakter.Hal-hal yang mungkin bisa diperbaiki
Satu hal yang benar-benar mengganggu saya tentang solusi ini adalah seringnya menggunakan
zipWithIndex
. Itu mengambil begitu banyak karakter. Saya mencoba membuatnya sehingga saya bisa mendefinisikan fungsi satu karakter saya sendiri yang hanya akan tampilzipWithIndex
dengan nilai yang diteruskan. Tetapi ternyata Scala tidak mengizinkan fungsi anonim memiliki parameter tipe. Mungkin ada cara lain untuk melakukan apa yang saya lakukan tanpa menggunakanzipWithIndex
tetapi saya belum terlalu memikirkan cara cerdas untuk melakukannya.Saat ini, kode berjalan dalam dua lintasan. Yang pertama menghasilkan papan baru sementara yang kedua mencetaknya. Saya pikir jika seseorang menggabungkan dua lintasan ini menjadi satu lintasan, itu akan menghemat beberapa byte.
Ini adalah golf kode pertama yang saya lakukan sehingga saya yakin ada banyak ruang untuk perbaikan. Jika Anda ingin melihat kode sebelum saya mengoptimalkan byte sebanyak mungkin, ini dia.
sumber
JavaScript (ES6),
246229 bytesumber
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
entah bagaimana digabungkan? Mungkin boolean-flag untuk menentukan_O
atauO_
, dan kemudian melakukan.repeat(w).slice(w)
?Python - 290 byte
Saya belum pernah melakukan ini sebelumnya - jadi kritik konstruktif apa pun akan dihargai :)
Trik utama di sini adalah hanya daftar pemahaman bersarang mengganggu. Saya bisa menyimpan beberapa karakter dengan tidak memiliki baris baru di antara pops tetapi itu hanya terlihat jelek.
sumber
w
danh
sebagai input (melalui STDIN, sebagai input fungsi, atau yang serupa), alih-alih memiliki hardcodedH=4 W=6
. Juga, meskipun saya tidak pernah memprogram dalam Python, saya pikir Anda dapat bermain golf beberapa ruang dalam kode Anda saat ini. Tips untuk Bermain Golf dengan Python mungkin juga menarik untuk dibaca untuk memberi Anda ide tentang cara bermain golf lebih lanjut. Selamat menikmati! :)Arang ,
494639 byte (tidak bersaing)Verbose
sumber
APL (Dyalog) ,
6159 byte⎕←
outputm←
m , di mana m adalah'O_'[
...]
karakter-karakter ini diindeks oleh ...2|
pembagian-sisa-ketika-dibagi-dua-/¨
perbedaan antara masing-masing⍳
semua koordinat (indeks) dalam array⎕
input numerik bentuk (jumlah baris dan kolom )(
...)[
...]←'X'
tetapkan karakter X ke salah satu ... elemen yangb/
disaring-oleh- b (untuk didefinisikan),m
dari m, khususnya ...?
elemen acak (jumlah lit) dalam rentang satu ke+/
jumlahb←
b , di mana b adalah'O'=
Boolean karena di mana huruf sama dengan,m
m terurai⎕DL 1
D e l ay satu detik→2
Pergi ke baris 2/⍨
jika (lit. disaring oleh)'O'∊
apakah surat itu adalah anggota dari⎕←m
nilai yang dikeluarkan, di mana nilai yang dikeluarkan adalah mCobalah online!
Dari versi 16.0 akan lebih pendek:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
sumber
Python 3,
195188 byteMenggunakan
bytearray
dandecode
tampaknya lebih pendek daripada mengiris dan memasang kembali string a laa[:i]+'X'+a[i+1:]
.sumber
Java 7, 317 byte
Penjelasan:
Tes gif (4,6)
sumber
Perl, 148 byte
146 byte kode +
-pl
bendera.Untuk menjalankannya:
sumber
MATLAB (R2016b), 172 byte
Kode:
Rekomendasi selalu diterima! Cobalah online!
Output Program:
Penjelasan:
sumber