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_max
sama dengan maksimum HP target pokemon. HP_current
sama dengan HP pokemon target saat ini. rate
adalah tingkat tangkapan pokemon, bonus_ball
adalah pengali pokeball yang dilempar, dan bonus_status
2,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_status
akan 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)
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?65536 / (255 / a)^(1/4)
lebih besar dari 1, centang secara otomatis berhasil. Saya tidak yakin apa yang Anda maksud dengan pertanyaan kedua.rnd < p
berarti cek berhasil denganrnd
kisaran 0 dan 1.65536 / (255 / a)^(1/4)
, maka jika angka acak kurang uji goyang berhasilJawaban:
J 301-150 = 151
Untuk olahraga, semua bonus diterapkan, meskipun saya mungkin akan lebih baik untuk tidak :). Saya secara singkat menjelaskan hal-hal di bawah ini, tetapi yang ini terlalu panjang untuk dijelaskan secara terperinci, kecuali seseorang secara eksplisit meminta. Ini mengimplementasikan semua bola, tangkapan kritis, dan input opsional.
Di sini versi golf
sumber
PYTHON 249 byte - 75 untuk bonus = 174
Mencoba pertama saya bermain golf.
Bonus untuk memasukkan bola yang dipilih: Safari, Olahraga, Lure, Net, Senja, Selam, Cepat, Cepat
Memberi saya 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 poin bonus
[Sunting] Bulatkan hingga 12 bit fraksional setiap pembagian waktu digunakan dengan tidak menggunakannya
[edit2] optimalkan kamus pokeball
sumber
Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)
untuk mengecualikan semua divisi?floor(x*4096)*4096
sama seperti Anda membulatkan ke misalnya tempat desimal.Perl 1 (374 - 150 = 224 + MissingNo. Bytes)
Daftar argumen:
Ya, saya sadar ini benar-benar melanggar aturan, tetapi saya tidak peduli. Jika Anda belum menyadarinya, ini adalah algoritma penangkapan generasi Pokémon pertama, dengan semua quirksnya (Great Balls lebih baik daripada Ultra Balls, dalam kondisi tertentu). Ini mengimplementasikan semua fitur, termasuk yang tidak termasuk (dan saya memutuskan untuk memasukkan poin untuk mereka). Capture kritis diabaikan (tetapi mereka diimplementasikan - hanya saja mereka tidak mempengaruhi laju capture), Poké Ball baru memuat data Poké Balls lainnya.
Harap perhatikan bahwa sementara jawaban ini singkat, itu melanggar semua aturan, jadi anggap saja ini sebagai jawaban yang menyenangkan, jangan terima. Saya awalnya akan mengimplementasikan algoritma Gen5 di Perl 5, tapi saya memutuskan - mengapa tidak bersenang-senang. Dan ya, saya benar-benar mengkompilasi Perl 1, dan kode ini berfungsi. Jika Anda menjalankannya dalam versi Perl yang lebih baru, Anda mungkin mendapat peringatan tentang penggunaan yang usang
do
, tetapi mari kita jujur - itu satu-satunya cara untuk menjalankan fungsi di Perl 1. Perl 1 juga memiliki beberapa kebiasaan sendiri (misalnya, saya tidak bisa pindahkan garis dimulai dengan/M/
ke baris sebelumnya - mengapa? - Saya tidak tahu).Juga, tidak ada angka acak di Perl 1, jadi harap Anda tidak akan membunuh saya karena modulo
$$
. Itu hal yang paling dekat dengan angka acak yang bisa kutemukan.Sunting: Tampaknya
do call()
sintaks lama telah dihapus di Perl 5.19.8. Pastikan Anda menggunakan versi Perl yang lebih lama untuk menjalankan skrip ini, karena Perl 5.20 tampaknya tidak akan kompatibel dengan skrip Perl 1.sumber
PHP (
746763 byte - semua bonus):Untuk menggunakan ini, Anda harus memberikan input sebagai 'ball = poke & status = sleep' di STDIN.
HP harus disediakan sebagai 'hp [max]' atau 'hp [current]'.
Kode ini berfungsi, seperti yang diuji di sini .
Anda dapat memberikan status dengan nama itu atau pengganda. ( tidak diharuskan dalam pertanyaan ).
Ini adalah versi yang dapat dibaca:
Saya harus mengedit ini karena saya menggunakan presisi yang jauh lebih tinggi daripada yang dibutuhkan.
Perbaikan disediakan oleh TheConstructor .
sumber
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
atau menerapkan divisi titik tetap seperti yang saya lakukan.Java, 611
Skor:
=> 611
Program ini menggunakan fixed-point-arithmetics dengan 12 fraksi-bit (
1/4096
adalah nilai bit yang paling tepat). Karena Java biasanya tidak menggunakan titik tetap, ada beberapa pergeseran di dalam kode untuk mencapai hasil yang diharapkan. Lihat versi panjang untuk fungsi aritmatika yang digunakan, yang telah digariskan untuk tujuan bermain golf.Sementara sebagian besar perhitungan bisa dilakukan pada
int
nilai, divisi bekerja lebih baik denganlong
s karena Anda perlu menggeser dividen dengan 12 bit ke kiri untuk menjaga presisi yang diinginkan (jika tidak, Anda kehilangan semua fraksi-bit).Input sampel (
;
hanya diperlukan jika dijalankan secara interaktif yaitu STDIN belum menerima EOF): Ball, catch_rate, max_hpOutput sampel:
Input sampel: Bola, catch_rate, max_hp, current_hp, bonus_state
Output sampel:
sumber
CoffeeScript -
317313310307306294270250242 byte342 - 25 (parameter) - 75 (12 bola) = 242
Mengharapkan masukan
HP_max,Rate,Ball[,HP_current[,status]]
. Tidak mendukungMoon
atauLove
bola.Ini adalah hal pertama yang saya golf bukan regex, jadi mungkin ada ruang untuk perbaikan. Saya tanpa malu-malu menyalin ide untuk menyimpan hanya nama-nama bola parsial. ;) Mendukung dua bola lainnya sama sekali tidak layak, bahkan dengan tambahan +7 untuk mendapatkan semua bonus.
Versi tidak disatukan
Versi ini menghilangkan semua alias pendek yang saya definisikan di awal, tetapi tidak mendefinisikan pencarian bola secara terpisah.
Catatan tentang rumus probabilitas: Saya telah mengatur ulang rumus lengkap (dengan dituliskan
a
) sehingga tidak ada divisi, dan saya menghitung(...)^(1/4)
dengan mengambil akar kuadrat dua kali.sumber
p-=p%1/4096
sepertinya benar-benar berfungsi. (Saya kira Anda setidaknya perlu menulisp-=p%(1/4096)
dan kemudian saya tidak akan yakin modulus diimplementasikan untuk fraksi di kedua sisi. Bagus!%
dapat digunakan untuk beberapa hal lucu di JS. Setelah membaca ulang pertanyaannya, saya pikir jawaban ini tidak cukup memenuhi persyaratan pembulatan. Saya pikir pembulatan harus diterapkan setelah setiap divisi. Saya mungkin harus merestrukturisasi perhitungan saya sedikit. ^^p%(1/4096)
. Saya bahkan memeriksa ini sebelum memposting, tetapi entah bagaimana mengingat hasil pengujian saya yang salah.Pembaruan: (C #)
Jumlah byte: 3.600
Critcal: -25
Semua bola-poke: -91
Total = 3.484
[golf]
[reguler]
sumber