Diberikan urutan kejadian dengan probabilitas antara 0,0 dan 1,0, hasilkan dan turunkan probabilitas setiap kombinasi yang terjadi. Anda dapat menganggap bahwa urutan angka disediakan dalam bentuk apa pun yang disediakan oleh bahasa pilihan Anda.
Ini sebuah contoh; Anda dapat menganggap bahwa panjang kombinasi urutannya masuk ke dalam memori:
{ 0.55, 0.67, 0.13 }
Program harus mencetak setiap kombinasi dan probabilitas terkait dari urutan yang terjadi. A 1 harus menyatakan bahwa peristiwa dalam indeks dari urutan input terjadi dan 0 harus menyatakan bahwa peristiwa itu tidak terjadi. Output yang diinginkan di bawah ini (saya tidak peduli tentang mencetak pekerjaan, itu hanya untuk tujuan informasi dari algoritma):
[0,0,0] = (1 - 0.55) * (1-0.67) * (1-0.13) = 0.129195
[0,0,1] = (1 - 0.55) * (1-0.67) * (0.13) = 0.019305
[0,1,0] = (1 - 0.55) * (0.67) * (1-0.13) = 0.262305
[0,1,1] = (1 - 0.55) * (0.67) * (0.13) = 0.039195
[1,0,0] = (0.55) * (1-0.67) * (1-0.13) = 0.157905
[1,0,1] = (0.55) * (1-0.67) * (0.13) = 0.023595
[1,1,0] = (0.55) * (0.67) * (1-0.13) = 0.320595
[1,1,1] = (0.55) * (0.67) * (0.13) = 0.047905
Masalah ini secara tangensial terkait dengan penghitungan "produk Cartesian".
Ingat, ini adalah kode-golf, jadi kode dengan jumlah byte paling sedikit menang.
sumber
[0.129195, 0.019305, 0.262305, ..., 0.047905]
cukup sebagai output atau[0,0,0], [0,0,1], ...
perlu?Jawaban:
Haskell, 86 byte
Contoh penggunaan:
Sebagian besar byte dihabiskan untuk memformat output. Jika Anda hanya tertarik pada vektor probabilitas itu hanya 29 byte:
Bagaimana itu bekerja:
sumber
Mathematica,
4645 byteMengambil daftar. Bahkan berfungsi untuk daftar kosong
{}
, yang hasilnya adalah{1}
.Kasus cobaan:
Penjelasan
Diberikan daftar probabilitas
s
dan daftar bitb
dengan0
menunjukkan "tidak terjadi" dan1
menunjukkan "memang terjadi", daftar probabilitas yang akan dikalikan diberikan olehuntuk mendaftar. Jika sebaliknya
0
menunjukkan "memang terjadi" dan1
"tidak terjadi", maka ini disederhanakan menjadijadi kami:
sumber
Perl,
4240 byteTermasuk +1 untuk
-a
Berikan nomor pada STDIN:
output
combi.pl
:sumber
MATL ,
1211 byteInput adalah vektor kolom, dengan format
[0.55; 0.67; 0.13]
Cobalah online!
sumber
Perl, 116 byte
Dapat dibaca:
Membuat daftar semua kemungkinan kombinasi panjang 0s dan 1s sama dengan jumlah parameter input (misalnya, untuk contoh di atas, itu akan menjadi panjang 3), kemudian menghitung setiap probabilitas.
Terima kasih kepada @Dada untuk menunjukkan kepada saya apa yang bisa dilakukan
glob
fungsi , meskipun saya tidak 100% yakin saya mengerti caranya melakukannya.Output sampel:
sumber
-a
bukannya(@a=split/ /,<>)
...R,
7269 byteMengambil input dari stdin dan mengembalikan R-vektor probabilitas.
Sunting: Menghapus satu transpose yang tidak perlu, matriks permutasi sekarang adalah versi yang ditransposisikan dari yang di bawah ini dan probabilitas dihitung sebagai produk kolom-bijaksana daripada baris-bijaksana. Contoh output:
Perhatikan bahwa probabilitas berada dalam urutan yang berbeda karena fakta bahwa permutasi-matriks yang dihasilkan oleh
expand.grid
menghasilkan yang berikut (generasi matriks ini mungkin dapat golf menggunakan paket eksternal):Probabilitas pertama sesuai dengan hasil terbalik dari baris pertama dalam matriks di atas dan yang kedua ke baris kedua terbalik dll. Memformat output untuk melihat ini lebih jelas membuat program lebih lama (164 byte):
yang sebaliknya menghasilkan:
sumber
expand.grid
! Saya pikir ituapply
dapat beroperasi pada frame data dan juga matriks, jadi kode Anda harus bekerja tanpat(t(...))
, yang akan menghemat 6 byte.t
tidak terkait dengan kerangka data apa pun tetapi untuk memungkinkan pengurangan vektor probabilitas dari matriks permutasi (dengan dimensi yang berbeda). Setidaknya salah satu dari mereka diperlukan karena cara R menangani operasi vektor ini tetapi saya mungkin bisa menghapus transpos luar dan menerapkan produk di atas kolom sebagai gantinya. Akan diperbarui besokJelly , 9 byte
Cobalah online!
sumber
J, 14 byte
Pemakaian
Penjelasan
sumber
|*//0.55 0.67 0.13-/0 1
kereta api?Pyth, 10 byte
Cobalah online: Demonstrasi
Penjelasan:
sumber
C, 110 byte
Tidak Disatukan:
Bekerja hingga 32 item, + 5 + 1 byte untuk 64 item (menyatakan
long k;
dan menambahkanL
loop pertama sehinggak<1L<<N
).sumber
*1*<<n
atau hanya C ++ saja?05AB1E , 8 byte
Cobalah online!
sumber
JavaScript (Firefox 30-57), 57 byte
Mengembalikan array dari semua probabilitas. Jika Anda ingin array acara juga, maka untuk 86 byte:
Jika Anda diizinkan acara sebagai string, maka hanya 80 byte:
Kurangi dua byte untuk
1/
setiap solusi jika probabilitasnya tidak akan pernah menjadi nol.sumber
<script></script>
blok? Saya mendapatkan masalah dengan "untuk" pertama yang tidak terduga?Perl 6,
2419 byte dari Latin-1Kode lama:
Ini sebuah fungsi. Gunakan seperti ini:
mendapatkan:
Penjelasan kode yang lebih lama:
Kode yang lebih baru pada dasarnya sama, hanya menggunakan sintaks terser:
Peta menghasilkan array yang penuh dengan
any
konstruksi, yang berkembang biak menjadiany
konstruksi yang lebih besar , menyelesaikan masalah dengan rapi bahkan tanpa perlu loop.Bukan bahasa terpendek untuk program ini, tetapi ini adalah terjemahan langsung dari masalahnya.
sumber
Dyalog APL , 10 byte
Solusi Baru
Asal indeks independen. Fungsi anonim. Mengambil daftar probabilitas sebagai argumen.
∘.×/
Pengurangan produk Cartesian berakhir⊢
nilai argumen,¨
masing-masing dipasangkan dengan1-⊢
nilai argumen komplemen (lit. satu dikurangi nilai argumen)TryAPL online!
Solusi Lama
Membutuhkan
⎕IO←0
yang default pada banyak sistem. Anjuran untuk daftar probabilitas.Penjelasan
|
nilai absolut dari⎕
input, ɑ = [ ɑ ₁ ɑ ₂ ɑ ₃]∘.×.-
tensor dalam yang dimodifikasi dikalikan, ( ɑ ₁ - b ₁) ⊗ ( ɑ ₂ - b ₂) ⊗ ( ɑ ₃ - b ₃), dengan⊂⍳2
daftar terlampir b = [[0 1]]Definisi matematika
Seperti b tertutup, itu skalar, dan karena itu diperluas ke panjang ɑ , yaitu 3, sehingga seluruh ekspresi adalah
A = │ ( ɑ ₁ - b ) ⊗ ( ɑ ₂ - b ) ⊗ ( ɑ ₃ - b ) │ =
│ ( ɑ ₁ - [0,1]) ⊗ ( ɑ ₂ - [0,1]) ⊗ ( ɑ ₃ - [0,1]) │ =
│ [ ɑ ₁, ɑ ₁ - 1] ⊗ [ ɑ ₂ , ɑ ₂ - 1] ⊗ [ ₁ ɑ ₂ ( ɑ ₃-1) ⎤ ⎤ ⎥ ⎢ ⎢ ⎢ ⎣ ɑ ₁ ( ɑ ₂-1) ɑ ₃, ɑ ₃ - 1] │ =
⎢ ⎡ ⎡ ɑ ɑ ₁ ɑ ₂ ɑ ₃ ɑ
ɑ ₃ ⎦ ⎣ ɑ ₁) ɑ ₂-1) ( ɑ ₃-1)
⎦ ⎥ ⎥ ⎢ ⎢ ⎡ ( ɑ ₁-1) ɑ ₂ ɑ ₃⎤ ⎡( ɑ ₁-1) ɑ ₂ ( ɑ ₃-1) ⎥ ⎥ ⎤
⎢ ⎣ ⎣ ( ɑ ₁-1) ( ɑ ₂-1) ₂-1) ɑ ₃⎦ ⎣ ( ɑ ₁- 1) ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎦ ⎥
TryAPL online!
Catatan (berlaku untuk solusi lama dan baru)
Program dan rumus berfungsi untuk sejumlah ( n ) variabel, dan mengembalikan array n- dimensi dengan panjang 2 di setiap dimensi. Dengan tiga variabel, probabilitas hasil
P spesifik ( p , q , r ) = A p , q , r
yang dapat dengan mudah dipilih dari array dengan
(⊃A)[p;q;r]
diekstraksi denganp q r⌷⊃A
Misalnya
1 1 0⌷⊃|0.55 0.67 0.13∘.×.-⊂⍳2
memberi P (55%, 67%, ¬13%) = 1,9305%sumber
PHP,
1059794 9387 byteJalankan seperti ini:
Perhatikan bahwa outputnya sedikit endian:
Penjelasan
Tweaks
$p
ke 1 dengan perhitungan$c
$i
alih-alih bertambah$c
bukan$$i
sumber
C ++ 17,
137131129 byteMenyimpan 6 byte dengan mendeklarasikan
#define A auto
, pertama kali makro sekecil itu menyimpan apa pun. -2 byte untuk menggunakan#import
dan menghapus spasi sebelumnya<
Memunculkan semua kemungkinan kombinasi.
Tidak Disatukan:
Pemakaian:
sumber