Seorang fisikawan yang malas memiliki tugas untuk melakukan eksperimen celah ganda. Namun, mereka malas dan tidak mau repot untuk mengatur semua peralatan sendiri dan akan mensimulasikan efeknya. Mereka tidak dapat memprogram meskipun begitu akan membutuhkan bantuan. Karena mereka malas, program Anda harus sesingkat mungkin.
Diberikan bilangan bulat positif ganjil n
( n >= 1
dan n % 2 == 1
), lakukan simulasi.
Bagaimana itu bekerja
Anda akan mulai dengan kanvas kosong dan setiap frame satu partikel cahaya akan melewati celah dan mendarat di kanvas. Partikel akan mendarat pada maksimum dengan kemungkinan:
n = 1
:
+-----+
| |
| 1/2 |
| |
+-----+
n = 3
:
+-----+ +-----+ +-----+
| | | | | |
| 1/4 | | 1/2 | | 1/4 |
| | | | | |
+-----+ +-----+ +-----+
n = 5
:
+-----+ +-----+ +-----+ +-----+ +-----+
| | | | | | | | | |
| 1/8 | | 1/4 | | 1/2 | | 1/4 | | 1/8 |
| | | | | | | | | |
+-----+ +-----+ +-----+ +-----+ +-----+
dll.
Misalnya untuk n=5
kami memeriksa kotak tengah, ada kemungkinan 50% untuk jatuh di dalamnya. Jika jatuh dari frame, jika tidak pindah ke dua berikutnya, ada kemungkinan 25% jatuh pada mereka. Jika jatuh di akhir frame, jika tidak pindah ke dua berikutnya, ada kemungkinan 12,5% jatuh pada mereka. Jika tidak jatuh itu tidak masalah, itu masih merupakan akhir dari frame.
Ada beberapa kebingungan tentang bagaimana cara menghitung peluang, sebagian besar karena orang-orang menganggapnya sebagai probabilitas yang seharusnya bertambah hingga 1. Hapus ide itu dari pikiran Anda dan itu harus menjernihkannya sedikit untuk Anda.
- Paling banyak satu partikel akan lad per frame, ini berarti sebuah partikel mungkin tidak mendarat sama sekali pada frame itu.
- Sebuah partikel dapat diwakili oleh karakter yang dapat dicetak.
- Partikel akan mendarat di mana saja di dalam kotak dengan peluang acak.
- Lebar kotak harus
2n-1
seukuran kanvas. Jadi untukn=5
mereka harus1/9
th dari lebar kanvas. - Ketinggian kotak harus setinggi kanvas.
- Partikel tidak boleh mendarat di luar kotak sama sekali.
- Jika sebuah partikel telah mendarat di tempat yang dipilih, tidak masalah ia bisa mendarat di sana lagi.
- Kotak ascii di atas adalah untuk kejelasan, mereka tidak boleh ditarik.
- Anda dapat memilih ukuran kanvas sendiri selama itu wajar. Misalnya, tingginya tidak boleh beberapa piksel. Itu juga harus dapat memenuhi semua kotak di atasnya.
- Jika kode Anda tidur di antara frame, Anda tidak perlu menambahkannya ke jumlah byte Anda.
Harus ada celah di antara masing-masing maxima, minima. Ini harus sama lebar dengan kotak tetapi tidak ada partikel yang akan mendarat di sana. Lihat diagram berikut:
+---+---+---+---+---+
| | | | | |
|max|min|max|min|max|
| | | | | |
+---+---+---+---+---+
Program harus berjalan sampai dihentikan secara manual.
Aturan
- Generator nomor acak semu (pRNG) baik-baik saja.
- Celah standar dilarang.
- Input dapat diambil dengan format apa pun yang wajar.
- Anda harus output ke STDOUT.
- Ini adalah kode-golf sehingga jawaban terpendek menang.
Contoh
GIF berikut adalah contoh dijalankan untuk n = 5
. Saya hanya mengetuknya dengan cepat sehingga peluangnya mungkin sedikit.
Jawaban:
Python 2,
207200 byteSaya yakin ada metode untuk kegilaan ini. Mengikuti interpretasi probabilitas yang saya komentari di OP.
Sunting: -7 byte melalui beberapa evaluasi malas yang pintar (dan menghapus beberapa tanda)
sumber
BASH, 396 - 11 = 385 byte
Sayangnya saya tidak dapat mendemonstrasikan ini di TryItOnline karena loop tanpa akhir & urutan pelarian ANSI yang memindahkan kursor, tetapi Anda masih dapat menyalin-menempelkannya ke terminal Anda!
Versi tidak minminasi:
sumber
$[ ]
bukan$(( ))
. Alih-alihfor i in `seq $((($1+1)/2)) -1 1`;do ...;done
, cobafor((i=($1+1)/2;i>0;i--));{ ...;}
. Alih-alih[ $(($RANDOM%2)) -eq 1 ]
, coba((RANDOM%2))
.sector
,,SS
dll harus diganti dengan 1 nama variabel char.Mathematica, 231 byte
memasukkan
keluaran
sumber
C # (.NET 4.5),
319254 byteDisimpan 65 byte berkat TheLethalCoder!
Fiuh, itu banyak pekerjaan, tapi entah bagaimana berhasil.
Karena ini menggunakan
Console
fungsi khusus dan Thread tidur, itu tidak akan berfungsi pada TIO, sayangnya.sumber
Action<int>
untuk menyimpan byte,while(true)
-> (while(1>0)
->for(;;)
.using C=Console;
Atauusing static Console;
.namespace System{using static Console;n=>{for(var r=new Random();;)for(int w=WindowWidth/(2*n-1),i=(n-1)/2,c=0,m=2,l;i>-1;i--,c+=2)if((l =r.Next(0,(m*=2+1)*2))<2){SetCursorPosition((i+(l<1?c:0))*2*w+r.Next(0,w),r.Next(0,WindowHeight));Write('*');break;}}}
Variable is not existing in the current context
kesalahan.Clojure + Quil, 394 bytes
Ya, tentu saja saya tidak menang, tetapi ini adalah latihan otak yang bagus! Saya mungkin telah memilih cara yang terlalu memutar untuk melakukan ini, tetapi itu berhasil! Pada dasarnya cara kerjanya adalah:
Nilai x dari setiap kolom dihitung berdasarkan
n
. Kemudian, "colum aktif" yang akan berisi titik-titik disaring. Kolom kemudian dizip dengan kemungkinan bahwa mereka akan dipilih.Animasi dimulai, dan setiap frame, sebuah loop dimasukkan. Mulai dari tengah, setiap pasangan kolom dicoba. Setelah satu pasang kolom dipilih, satu kolom dari pasangan dipilih secara acak.
Sebuah titik diambil pada posisi acak di dalam kolom yang dipilih, loop dalam keluar, dan bingkai baru dimulai.
Menggunakan perpustakaan grafis Quil, yang pada dasarnya adalah pembungkus Pemroses untuk Clojure.
Catatan, kode golf tidak menghasilkan animasi yang sama seperti yang ditunjukkan pada GIF. Dalam kode golf, latar belakang abu-abu, dan jendela dan titik lebih kecil. Ini memiliki efek yang sama, hanya saja tidak secantik itu.
Lihat kode yang tidak dipisahkan untuk penjelasan mendalam:
sumber
C #, 238 byte
Cobalah online! (Itu tidak akan berhasil tetapi kamu tahu).
Versi Lengkap / Terformat:
sumber