Dalam video game Pokemon, pemain dikirim ke dunia untuk memaksa hewan liar menjadi bola-bola kecil dan melatih mereka untuk bertarung. Tentu saja, semua orang tahu bahwa tidak ada yang memainkan Pokemon untuk pertempuran itu. Hasil seri sesungguhnya adalah pokemon yang menangkap dirinya sendiri! Tugas Anda adalah mensimulasikan pokeball selama upaya menangkap. Tantangan ini akan menggunakan formula penangkapan generasi V, yaitu sebagai berikut:

HP_maxsama dengan maksimum HP target pokemon. HP_currentsama dengan HP pokemon target saat ini. rateadalah tingkat tangkapan pokemon, bonus_balladalah pengali pokeball yang dilempar, dan bonus_status2,5 jika pokemon target tertidur atau beku, 1,5 jika pokemon target dilumpuhkan, diracuni, atau dibakar, dan 1 sebaliknya.
Setelah menemukan a, Anda harus melakukan hingga tiga "pemeriksaan goyang". Probabilitas keberhasilan pemeriksaan shake adalah 65536 / (255 / a)^(1/4). Jika salah satu dari cek ini gagal, pokemon lolos dari bolanya. Jika ketiga cek berhasil, pokemon tertangkap!
Catatan: Setiap kali divisi dilakukan, hasilnya dibulatkan ke kelipatan 1/4096. Ini umumnya merupakan detail yang tidak penting, tetapi harus diperhitungkan dalam program Anda.
Tantangan Anda adalah menulis sebuah program yang mengeksekusi cek goyang dan mencetak untuk mengetahui status cek. Pada stdin, program Anda akan menerima (setidaknya, detail di bawah) HP maksimum pokemon, tingkat tangkapan pokemon target, dan nama pokeball. HP maksimum dan tingkat tangkapan keduanya dijamin bilangan bulat, sedangkan nama pokeball selalu berupa string. Input ini dapat datang dalam urutan apa pun dan dengan karakter pembatas apa pun nyaman bagi Anda, asalkan konsisten. Asumsikan input benar, tidak diperlukan penanganan kesalahan.
Nama-nama pokeballs yang harus Anda dukung dan pengganda tangkapannya tercantum di sini:
Poke | 1
Great | 1.5
Ultra | 2
Master | 255
Anda dapat berasumsi bahwa targetnya tertidur dan pada 1 HP. Format yang diharapkan untuk output adalah ini:
(First check failed)
(no output)
(Second check failed)
*shake*
(Third check failed)
*shake*
*shake*
*shake*
(All checks pass)
*shake*
*shake*
*shake*
Click!
(Itu bukan kesalahan ketik, program Anda seharusnya tidak pernah hanya menghasilkan dua getar.)
Ini adalah kode-golf , jadi skor Anda adalah jumlah byte kode sumber program Anda. Skor terendah menang.
Bonus!
Saya mengatakan bahwa Anda dapat menganggap pokemon berada pada 1 HP dan tertidur. Atau, Anda dapat mengizinkan pengguna untuk memasukkan HP dan pokemon saat ini bonus_status. HP pokemon saat ini akan selalu berupa bilangan bulat yang sama dengan atau kurang dari HP maksimumnya, dan bonus_statusakan selalu menjadi 2,5, 1,5 atau 1. Jika demikian, Anda harus memiliki nilai-nilai ini di akhir input Anda, dan default ke 1 dan 2.5 jika tidak disediakan. Anda dapat mengurangi 15 poin dari skor Anda untuk menerapkan salah satu dari ini, atau 25 untuk keduanya.
Selain itu, Anda dapat menerapkan tangkapan kritis. Jika penangkapan kritis terjadi, hanya satu tes goyang yang dilakukan. Jika gagal, program keluar secara diam-diam. Jika lulus, ini menghasilkan:
*shake*
Click!
Tangkapan kritis menjadi lebih umum karena pemain mengumpulkan lebih banyak pokemon, tetapi demi kesederhanaan kita dapat mengasumsikan bahwa mereka telah "menangkap mereka semua". Jika angka yang dihasilkan secara acak antara 0 dan 2047 kurang dari a(hasil perhitungan pertama) dikalikan dengan 2,5, itu adalah penangkapan kritis. Dukungan untuk tangkapan kritis memungkinkan Anda untuk menghapus 25 poin dari skor Anda.
Ada sejumlah pokeballs lain yang dapat Anda pilih untuk didukung. Nama dan pengganda tangkap mereka tercantum di sini:
Safari | 1.5
Sport | 1.5
Lure | 3
Net | 3
Dusk | 3.5
Dive | 3.5
Moon | 4
Fast | 4
Quick | 5
Love | 8
Untuk setiap bola yang Anda tambahkan dukungannya, Anda dapat mengurangi ( 5+ panjang nama bola) dari skor Anda.
Akhirnya, untuk tendangan, mencapai semua bonus ini (HP saat ini dan status bonus_dari stdin, tangkapan kritis, dan semua 10 bola opsional) akan memberi Anda hadiah tambahan 7 poin dihapus dari skor Anda, untuk total 150 bonus total.
Contoh Input / Output
Hanya untuk memastikan kita semua berada di halaman yang sama.
$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!
Semoga sukses, dan senang bermain golf!
65536 / (255 / a)^(1/4)lebih besar dari 1, centang secara otomatis berhasil. Saya tidak yakin apa yang Anda maksud dengan pertanyaan kedua.
rnd < pberarti cek berhasil dengan rndkisaran 0 dan 1.
65536 / (255 / a)^(1/4), maka jika angka acak kurang uji goyang berhasil
65536 / (255 / a)^(1/4)tetapi nyali saya mengatakan lebih besar dari 1. Apakah Anda memeriksa terhadap angka acak di kisaran 0 hingga 65536? Apakah cek berhasil jika nomor acak lebih besar atau lebih rendah?