Pertimbangkan versi ASCII ini dari mekanisme yang mirip dengan mesin bean atau game plinko / pachinko :
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
The O
adalah bola yang jatuh ke bawah.
- Ketika itu mengenai
^
, ada kemungkinan 50-50 itu akan ke kiri atau kanan. - Ketika itu mengenai
/
, itu selalu pergi ke kiri. - Ketika hits
\
, itu selalu berjalan dengan benar.
Bola akhirnya jatuh ke salah satu U
palung bernomor di bagian bawah. Pertanyaannya adalah, berapa probabilitasnya pada setiap palung?
Untuk kasus ini, probabilitas yang 0.0
, 0.1875
, 0.5625
, 0.125
, dan 0.125
, untuk palung 1 sampai 5 masing-masing.
Berikut contoh lain dengan 3 palung bukannya 5. Probabilitas adalah 0.5
, 0.5
, dan 0.0
:
O
/
^ ^
U U U
1 2 3
Dalam tantangan ini kami akan menggeneralisasikan masalah ini ke suatu mekanisme dengan sejumlah lapisan yang diatur dengan cara apa pun.
Tantangan
Tulis program atau fungsi yang mengambil representasi ASCII dari struktur piramida mekanisme. (Input melalui stdin / baris perintah / fungsi arg.)
Anda dapat mengasumsikan itu datang dengan spasi yang menempatkannya dalam bentuk yang tepat, misalnya
^
\ ^
^ ^ \
\ ^ / ^
Atau Anda dapat menganggapnya masuk tanpa spasi sama sekali, misalnya
^
\^
^^\
\^/^
(Jika diinginkan, Anda dapat mengasumsikan ada garis baru dan / atau beberapa pola spasi yang konsisten.)
Struktur piramida input dapat memiliki sejumlah level (alias garis), termasuk nol. Setiap level memiliki satu lagi ^
,, /
atau \
dari yang terakhir, dan ada levels + 1
palung di bagian bawah (yang bukan bagian dari input).
Program / fungsi Anda harus mencetak / mengembalikan daftar probabilitas bahwa bola mendarat di setiap palung (dalam urutan palung paling kiri ke palung paling kanan). Ini harus berupa nilai titik apung yang, ketika dicetak, memiliki setidaknya 3 tempat desimal (nol berlebihan atau titik desimal tidak diperlukan; 1
baik untuk 1.000
, .5
baik untuk 0.500
, dll.). Jika Anda menulis suatu fungsi, Anda dapat mencetak nilai atau mengembalikan daftar / larik float.
Format daftar cetak yang masuk akal baik-baik saja. misalnya 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
, atau 0.5\n0.5\n0.0
semua akan baik-baik saja.
Contohnya
0 Level: (bermuara pada satu hal sepele U
)
Input: [no input/empty string given]
Keluaran:1.0
1 Tingkat:
Input: ^
Keluaran:0.5 0.5
Input: /
Keluaran:1.0 0.0
Input: \
Keluaran:0.0 1.0
2 Tingkat: (contoh kedua di atas)
Memasukkan:
/
^ ^
Keluaran: 0.5 0.5 0.0
3 Tingkat:
Memasukkan:
^
^ ^
^ ^ ^
Keluaran: 0.125 0.375 0.375 0.125
Memasukkan:
\
/ \
/ / \
Keluaran: 0.0 0.0 0.0 1.0
4 Tingkat: (contoh pertama di atas)
Memasukkan:
^
\ ^
^ ^ \
\ ^ / ^
Keluaran: 0.0 0.1875 0.5625 0.125 0.125
7 Tingkat:
Memasukkan:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Keluaran: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
Mencetak gol
Jawaban terpendek dalam byte menang. Tiebreaker adalah posting sebelumnya.
sumber
Jawaban:
CJam,
50 48 45 44 4240 byteIni mengharapkan input menjadi tanpa ruang dan memiliki baris baru. Sebagai contoh:
Algoritma
Ide dasarnya adalah bahwa Anda terus mengurai setiap karakter (hanya ada 4 karakter yang berbeda) dan melakukan operasi yang berbeda pada distribusi probabilitas (awalnya sebuah array yang mengandung 1 elemen nilai 1). Untuk setiap baris karakter input (dimulai dengan karakter pertama di baris pertama), kami mempertahankan array probabilitas dengan ukuran yang sama. Setiap karakter bertindak berdasarkan probabilitas pertama dari daftar dan mendorong pasangan yang dihasilkan ke akhir daftar. Setelah setiap baris, kami menjumlahkan pasangan dari daftar untuk mendapatkan jumlah item yang tepat sebagai item pada baris berikutnya.
Berikut adalah empat karakter dan tindakan yang diperlukan yang sesuai untuk masing-masing:
^
: Ketika karakter ini terjadi, Anda membagi probabilitas saat ini menjadi dua bagian. Misalnya, jika kita memiliki ini di baris pertama, kita harus mengonversikan[1]
ke[0.5 0.5]
/
: Ketika karakter ini muncul, kita harus menempatkan<current probability> 0
probabilitas saat ini dalam array.\
: Ketika karakter ini muncul, kita harus menempatkan0 <current probability>
probabilitas saat ini dalam array.\n
: Ketika karakter ini muncul, kami memiliki baris baru. Dengan demikian kami mengelompokkan semua pasangan dari 3 karakter di atas dan menjumlahkannya untuk mendapatkan probabilitas setiap item untuk baris berikutnya. Misalnya[0 0.5 0.25 0.25]
dikonversi menjadi[0 0.75 0.25]
. Perhatikan bahwa item pertama dan terakhir memiliki pasangan implisit (dihargai 0) sebelum dan sesudahnya.Sekarang kita hanya perlu mengidentifikasi karakter yang tepat dan melakukan tindakan yang benar. Mari kita gunakan matematika biasa di sini untuk melakukan itu. Kode ASCII untuk
^
,\
,/
dan\n
adalah94
,92
,47
, dan10
. Setelah beberapa percobaan, kami mendapatkan persamaan sederhana ini untuk mengubah angka-angka ini menjadi 0, 1, 2 dan 3:memberi:
Dalam array dengan panjang 4, yang terakhir
4f%
akan menjadi implisit. Jadi kita cukup lakukan%13
pada kode ASCII dari karakter dan memilih tindakan yang tepat dari berbagai tindakan.Penjelasan kode :
Cobalah online di sini
sumber
Ruby 140
Fungsi yang mengambil input string (dapat diformat dengan baik sebagai piramida) dan mengembalikan array pelampung.
Uji secara online: http://ideone.com/kmsZMe
Implementasi yang cukup mudah. Ini dia ungolfed:
sumber
Ruby, 140
158byteJangan terus memilih ini ketika ada versi ruby yang lebih baik .Ini ada lebih banyak trik untuk Anda.Fungsi tanpa nama dengan satu argumen. Tidak boleh mengandung spasi apa pun. Mungkin atau mungkin tidak mengandung baris baru.
Membuang 9 byte karena harus menanganiSemua test case bekerja dengan benar, lihat di sini di ideone .0 levels
(string kosong).sumber
split
, misalnya.Pyth,
434241 byteIni mengharapkan input tanpa spasi. Cobalah secara online: Pyth Compiler / Executor
Pyth, 40 byte (dipertanyakan)
Terima kasih kepada @isaacg, karena telah menghemat satu byte. Perhatikan bahwa versi ini tidak benar-benar berfungsi dalam versi Pyth, ketika pertanyaan diajukan. Ada bug kecil di kompiler. Meskipun kode ini tidak menggunakan fitur baru Pyth (hanya hal-hal yang sudah ada dalam dokumen Pyth untuk waktu yang lama dan seharusnya berfungsi), ini mungkin bukan jawaban yang valid. Putuskan sendiri.
Cobalah secara online: Pyth Compiler / Executor
Penjelasan:
Misalnya jika saya saat ini memiliki probabilitas input
G = [0.5, 0.5, 0.0]
dan barisH = "^/^"
yang terjadi sebagai berikut:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
sumber
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 byteTidak ada yang mewah, program lengkap yang membaca garis (dengan atau tanpa spasi, hanya menghapusnya) dari STDIN, dan mencetak hasil yang dipisahkan ruang ke STDOUT.
Kode lebih rapi dengan komentar:
sumber
Python 3, 113
Pembaruan vektor probabilitas secara berulang
P
dalam menanggapi setiap baris. Vektor probabilitas baruQ
ini dibuat satu entri pada satu waktu. Iterasi melalui slot baru, dan hitung kontribusi dari pasak ke kanan sebagair
, sementara juga menghitung kontribusi yang tersisa untuk slot yang akan datang sebagaip-r
.Mengharapkan setiap baris berakhir di setidaknya satu ruang untuk menghindari masalah di mana garis berakhir dengan garis miring terbalik.
sumber
input()
bisa mengatasinya.Python 3, 138 byte
Bekerja dengan spasi putih karena mereka semua disaring (oleh
if'!'<e
).Metode:
r
probabilitas untuk mencapai hambatan dan palung implisit di bawahnya. Kami mulai dari daftar[1]
.0
ke daftar untuk palung terkemuka. Kami memutuskan apakah ini merupakan hambatan pertama dengan membandingkan indeksnyap
dengan angka segitiga berikutnyat*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Kami menggunakan metode berikut:v = ord(char) mod 7 + 1
hasil^:4 /:6 \:2
v div 3 / 2
menghasilkan fraksi pertama (^:0.5 /:1 \:0
)v mod 3 / 2
menghasilkan fraksi kedua (^:0.5 /:0 \:1
)t + 1
elemen terakhir dari daftar akhirr
.2 byte berkat saran obrolan @ Sp3000.
sumber
Perl, 78
Mengambil input tanpa spasi.
Coba saya .
sumber
TI-BASIC,
7376Mengambil input satu baris pada satu waktu, dan berakhir ketika spasi dimasukkan dengan sendirinya, karena tidak ada putus baris dalam string atau string kosong yang sah dalam TI-BASIC.
Saya cukup yakin saya mendapatkan ukuran yang benar (TI-BASIC adalah tokenized, jadi setiap perintah mengambil satu atau dua byte — seq () mengambil satu, inString () mengambil dua, redup () membutuhkan satu, dan seterusnya. Saya menghitung ukuran secara manual.)
Meskipun karakter backslash valid dalam sebuah string, perhatikan bahwa tidak ada cara untuk memasukkan satu dari dalam program kecuali Anda telah memodifikasi kalkulator Anda.
sumber
Javascript - 117
Sudah mencoba menggunakan rekursi, tapi itu terlalu lama ...
Hat tip untuk xnor untuk ide pengurangan, yang mencukur selusin atau lebih karakter.
Tidak Disatukan:
sumber