Latar Belakang
The acak Domino Automaton adalah model mainan untuk gempa bumi, terinspirasi oleh automata seluler. Dalam tantangan ini, tugas Anda adalah untuk mensimulasikan versi model ini yang disederhanakan, dan mengumpulkan data darinya.
Otomat didefinisikan pada sebuah array A
dari k
bit, yang mewakili garis patahan yang gempa bumi dapat terjadi. Array membungkus di sekitar perbatasannya. Kondisi itu A[i] = 0
berarti posisi i
itu rileks , dan itu A[i] = 1
berarti ia bersemangat , atau mengandung energi yang tersimpan. Pada setiap langkah waktu, satu posisi array dipilih secara acak. Jika posisi itu rileks, ia menjadi bersemangat (energi potensial ditambahkan ke sistem). Jika posisi itu sudah bersemangat, itu memicu gempa bumi, dan posisi yang dipilih dan semua posisi bersemangat yang terhubung lagi menjadi rileks. Jumlah posisi tereksitasi yang menjadi rileks adalah besarnya gempa.
Contoh
Pertimbangkan array
100101110111
panjang 12. Jika proses acak memilih bit kedua dari kiri, array diperbarui ke
110101110111
^
sejak bit yang dipilih (ditandai dengan ^
) adalah 0
. Jika kita selanjutnya memilih bit keempat dari kiri, yang merupakan terisolasi 1
, gempa berkekuatan 1 dipicu, dan bit diatur ke 0
lagi:
110001110111
^
Selanjutnya, kita dapat memilih bit kedua dari kanan, yang memicu gempa berkekuatan 5:
000001110000
^
Perhatikan bahwa semua 1
s dalam "cluster" yang sama dengan yang dipilih adalah bagian dari gempa, dan array membungkus di perbatasan.
Tugas
Anda harus mengambil sebagai input dua bilangan bulat positif k
dan t
, dan tugas Anda adalah mensimulasikan otomat domino acak untuk t
langkah-langkah waktu, mulai dari k
array panjang awal semua 0
s. Output akan menjadi daftar L
dari k
bilangan bulat, di mana L[i]
(dengan pengindeksan berbasis 1) berisi jumlah gempa bumi besarnya i
yang terjadi selama simulasi. Anda diizinkan untuk meninggalkan nol yang tertinggal dari output.
Untuk input k = 15
dan t = 1000
, beberapa output representatif adalah
[117, 97, 45, 26, 10, 5, 3, 1, 3, 0, 0, 0, 0, 0, 0]
[135, 91, 58, 21, 8, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[142, 63, 51, 31, 17, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0]
[106, 75, 45, 30, 16, 8, 5, 2, 2, 0, 0, 0, 0, 0, 0]
[111, 96, 61, 22, 3, 8, 3, 2, 0, 0, 0, 1, 0, 0, 0]
Aturan
Program dan fungsi lengkap diizinkan. Hitungan byte terpendek menang, dan celah standar tidak diizinkan.
Perhatikan bahwa Anda tidak perlu mensimulasikan robot menggunakan implementasi tertentu, hanya masalah output.
Jawaban:
Pyth, 48 byte
Mendapat sedikit terinspirasi oleh penjelasan @ Dennis. Punya beberapa pemikiran serupa kemarin, tetapi tidak benar-benar mengikuti mereka.
Cobalah online: Demonstrasi
Penjelasan:
sumber
CJam,
5755 byteIni adalah fungsi anonim yang muncul k dan t dari tumpukan ( k di atas t ) dan meninggalkan array yang diinginkan sebagai imbalan.
Cobalah online di Internet juru bahasa CJam .
Bagaimana itu bekerja
sumber
Python 2, 153 byte
Ternyata saya punya solusi yang hampir sama dengan Fry , tetapi dengan sedikit lebih mengutak-atik.
sumber
randrange
, tetapi saya tidak menyadari itu hanya bekerja dengan satu argumen. Kerja bagus!Java,
278272 byteJava bukan bahasa Golf terbaik, dan saya bukan pegolf terbaik, tapi sangat menyenangkan untuk menulis jadi ini dia! Beri tahu saya tentang bug dan peningkatan! (Saya memutuskan untuk mengirim kembali hanya sebagai fungsi.)
Dan file dengan spasi dan komentar:
sumber
Alt+09
, atau tab di Notepad ++)d[q]+=1;
ini bisa menjadid[q]++;
Anda dapat menambahkan langsung pada array daripada menggunakan + = di mana-mana. Itu harus menyimpan banyak karakter.for(;t>0;t--){
dapat diubah menjadifor(;t-->0;){
: DPython 2,
174170Terima kasih @Vioz untuk menemukan cara yang lebih singkat untuk membuatnya
D
, dan membuktikan lagi bahwanot
biasanya golfable. Dan juga untuk menulis penjelasannya.Saya telah mencoba membuat program serupa di Pyth, tetapi tampaknya ada masalah ruang lingkup dalam apa yang saya coba lakukan. Ini secara naif mengimplementasikan kartu domino dan fungsinya
U
menyebarkan gempa bumi. Arah penguranganU
tidak memerlukan mod karena akan membungkus secara alami. Elemen terakhir dariE
menghitung berapa kali nol diubah menjadi satu, sehingga tidak dicetak pada akhirnya.Tidak Tergabung + Penjelasan:
sumber
D[r]=not e
untukD[r]=e<1
menyimpan 2 byte, danE=[0]*-~k
untukE=D+[0]
menyimpan 2 lainnya, untuk membuat Anda turun ke 170.ES6,
224196189179172Barang-barang yang mudah telah di-golf, tetapi masih ada beberapa pekerjaan yang harus dilakukan. Saya akan mengetikkan penjelasan nanti. Juga, jika seseorang dapat memberi tahu saya mengapa
new Date%k
hal pendek tidak berfungsi dengan baik lagi, itu akan membengkak.Penggunaan adalah
sumber
new
. Anda tidak memerlukan itut
dalam for loop, Tidak perlu dua yang terakhir;
a[r]^=1
akan berfungsi jika nilai awal salah satu1
atau0
Perl, 212
Versi sebelumnya yang saya pasang tidak benar, dan implementasinya membutuhkan beberapa pekerjaan.
Ini mungkin bukan algoritma yang tepat untuk ini, tapi saya tidak bisa berpikir sekarang. Versi ungolfed di bawah.
Tidak Disatukan:
sumber
CJam, 76 byte
Ya, ini tidak terlalu kompetitif. Tapi karena butuh waktu cukup lama, saya pikir saya tetap akan mempostingnya.
Cobalah online
sumber