Misalkan alarm Anda membangunkan Anda di suatu pagi, tetapi Anda menekan tiduran sehingga Anda bisa tidur selama 8 menit lagi. Ketika berdering lagi Anda dengan enggan bangun dan mandi, yang Anda perkirakan membutuhkan waktu 15 hingga 17 menit. Anda kemudian menyikat gigi selama 2 menit, dan berpakaian, yang memakan waktu sekitar 3 hingga 5 menit. Akhirnya, Anda makan sarapan terburu-buru dalam 6 hingga 8 menit dan berlari keluar.
Kami dapat menyatakan urutan waktu ini sebagai 8 15-17 2 3-5 6-8
.
Mengingat ketidakpastian rutinitas pagi Anda, berapa probabilitas Anda melakukan setiap tugas pada beberapa menit tertentu sejak pertama kali Anda bangun?
Dengan asumsi setiap tugas memakan waktu beberapa menit, kita dapat memetakan setiap kemungkinan kombinasi rentang waktu yang tidak pasti (misalnya 3, 4, dan 5 menit untuk menyikat gigi). Bagan ini menunjukkan semua 27 kemungkinan, dengan waktu meningkat ke kanan, dan setiap tugas dari N menit diwakili oleh (N - 1) tanda hubung dan satu bilah vertikal, hanya untuk menandai akhirnya. Batas menit terjadi di antara karakter, sehingga ruang antara kolom 8
dan berubah menjadi .9
8 min 59 sec
9 min
1111111111222222222233333333334
1234567890123456789012345678901234567890 <-- Minute
-------|--------------|-|--|-----|
-------|--------------|-|--|------|
-------|--------------|-|--|-------|
-------|--------------|-|---|-----|
-------|--------------|-|---|------|
-------|--------------|-|---|-------|
-------|--------------|-|----|-----|
-------|--------------|-|----|------|
-------|--------------|-|----|-------|
-------|---------------|-|--|-----|
-------|---------------|-|--|------|
-------|---------------|-|--|-------|
-------|---------------|-|---|-----|
-------|---------------|-|---|------|
-------|---------------|-|---|-------|
-------|---------------|-|----|-----|
-------|---------------|-|----|------|
-------|---------------|-|----|-------|
-------|----------------|-|--|-----|
-------|----------------|-|--|------|
-------|----------------|-|--|-------|
-------|----------------|-|---|-----|
-------|----------------|-|---|------|
-------|----------------|-|---|-------|
-------|----------------|-|----|-----|
-------|----------------|-|----|------|
-------|----------------|-|----|-------|
1234567891111111111222222222233333333334 <-- Minute
0123456789012345678901234567890
Jelas bahwa rutinitas bisa memakan waktu paling lama 40 menit dan setidaknya 34 menit.
Pertanyaannya adalah, pada menit tertentu, katakanlah pada menit 29, berapa peluang Anda melakukan masing-masing dari 5 tugas? Asumsikan setiap kerangka waktu yang tidak pasti didistribusikan secara seragam dalam seluruh menit yang tepat. Jadi tugas 4-7 memiliki peluang 25% untuk mengambil 4, 5, 6, atau 7 menit.
Dari grafik dapat dilihat bahwa pada menit 29 ada ...
0/27 chance you were snoozing (task 1)
0/27 chance you were showering (task 2)
0/27 chance you were brushing (task 3)
24/27 chance you were dressing (task 4)
3/27 chance you were eating (task 5)
Demikian pula pada menit 1 ada 27/27
kemungkinan Anda tidur dengan orang 0/27
lain.
Pada menit ke-38 misalnya, 17 dari rutinitas potensial telah berakhir. Jadi dalam 10 dari 10 kasus Anda akan makan. Ini berarti kemungkinan terlihat
0/10 task 1, 0/10 task 2, 0/10 task 3, 0/10 task 4, 10/10 task 5
Tantangan
Tulis fungsi yang mengambil integer untuk nilai menit, dan string yang terdiri dari urutan bilangan bulat tunggal, atau pasangan bilangan bulat a-b
dengan b
> a
, semua dipisahkan oleh spasi (sama seperti 8 15-17 2 3-5 6-8
). Semua bilangan bulat adalah positif. Menit input akan kurang dari atau sama dengan waktu maksimum yang dimungkinkan (misalnya 40).
Fungsi tersebut harus mengembalikan string lain yang menunjukkan peluang fraksional yang tidak berkurang dalam setiap tugas pada menit yang diberikan.
Contohnya
myfunc(29, "8 15-17 2 3-5 6-8")
mengembalikan string0/27 0/27 0/27 24/27 3/27
myfunc(1, "8 15-17 2 3-5 6-8")
mengembalikan string27/27 0/27 0/27 0/27 0/27
myfunc(38, "8 15-17 2 3-5 6-8")
mengembalikan string0/10 0/10 0/10 0/10 10/10
myfunc(40, "8 15-17 2 3-5 6-8")
mengembalikan string0/1 0/1 0/1 0/1 1/1
Jika bahasa Anda tidak memiliki string atau fungsi, Anda dapat menggunakan variabel bernama, stdin / stdout, baris perintah, atau apa pun yang tampaknya paling sesuai.
Mencetak gol
Ini golf kode. Solusi terpendek dalam byte menang.
sumber
|
, kanan|
, atau setengah dari masing-masing?Jawaban:
CJam,
124 115 100 9289 byteIni bisa bermain golf banyak, tapi saya harus tidur, jadi posting sekarang sendiri :)
Cobalah online di sini
Inputnya seperti:
Di mana integer pertama adalah menit input dan string kedua adalah urutan rentang waktu (seperti yang ditunjukkan dalam contoh dalam pertanyaan, hanya tanpa
,
)Output untuk input yang disebutkan di atas:
sumber
0/27
.Mathematica,
237216 byteSaya yakin saya bisa mempersingkat ini sedikit, tetapi tidak sekarang. Setidaknya saya akhirnya harus menggunakan asosiasi baru dari Mathematica 10! :)
Tidak Disatukan:
Penggunaan sebagaimana ditentukan dalam tantangan:
Ia mengembalikan
0/1
semua elemen jika input pertama lebih besar dari rentang waktu maksimum.sumber
Cases[]
tidak perlu diberikan caraTuples
kerjanya. Jika demikian, makat = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0]
.Lookup
danCounts
merupakan tambahan yang diterima untuk bahasa ini.Flatten
(bukanJoin@@
) karenaFirstPosition
sekarang dapat kembaliMissing[NotFound]
yang tidak dapat bergabung.Haskell, 232
jalankan seperti ini:
sumber
APL, 162
Contoh berjalan
Saya harap Anda tidak keberatan dengan jarak yang aneh
sumber