Simulator Pokeball

26

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:

a = (((3 * HP_max - 2 * HP_current) * rate * bonus_ball) / 3 * HP_max) * bonus_status

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 , 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!

monmon bawah tanah
sumber
Saat ini saya tidak bisa menilai seberapa besar kemungkinan yang Anda berikan, 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?
TheConstructor
Jika 65536 / (255 / a)^(1/4)lebih besar dari 1, centang secara otomatis berhasil. Saya tidak yakin apa yang Anda maksud dengan pertanyaan kedua.
undergroundmonorail
Jadi rnd < pberarti cek berhasil dengan rndkisaran 0 dan 1.
TheConstructor
1
@IsmaelMiguel melihat komentar saya: Anda menghasilkan angka acak dalam kisaran 0 hingga 1 dan membandingkannya 65536 / (255 / a)^(1/4), maka jika angka acak kurang uji goyang berhasil
TheConstructor
1
Sebagai negara bagian dalam teks, tipe teks pokeball, max hp, dan catch rate sudah lewat sebagai input untuk program Anda. Secara opsional, Anda dapat meminta hp saat ini (default 1) atau bonus status (default 2.5)
TheConstructor

Jawaban:

3

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.

tm =: =*./@:+.' '=] NB. Template match, match non-blanks in right with left
balls  =: 'MMLLPGSUNDFQ',.12{.'oauo' NB. space = wildcard.
NB. lookup function: name -> bonus_ball
lookup =: 4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~ (tm"1&balls)@(2&{.) 

NB. convert given option
options =: ;".`lookup@.(_=_&".);._2 ,&',' i3 NB. parse options to numeric values
NB. add defaults if necessary
complete =: (, 1 2.5{.~(5-$)) options         
NB. formula
r=: <.&.(*&4096)                              NB. round to 1/4096
NB. a=: ((3*zeroth - 2*thirth)*first*second*fourth)/(3*zeroth)
a=:r(1-3%~2*%/3 0{complete)**/1 2 4{complete  NB. A prime, already divided by 255

NB. Critical captures
crit =: >2r5*[:?11^~2: NB. check for critical, k a
mess =: 2 7$'*shake*Click! '"_ NB. Message template
check =: >"0 [:?(4$2^16)"_     NB. Perform 4 checks
mes2 =: mess#~3(<.,<)]          NB. Construct message from number of passed checks
NB. If critical, just output the message array, else do the 4 tests, and execute mes2 on their running and (meaning count the number of uninterrupted trues)
echo mes2@(+/)@(*./\)@(check"0)@(65536%4%:[:r 255%])`[email protected] a

Di sini versi golf

NB. Golfed verion
echo(m#~3(<.,<)])@(+/)@(*./\)@(>"0[:?(4$2^16)"_)@(65536%4%:[:r 255%])`(m=:2 7$'*shake*Click! '"_)@.(>2r5*[:?11^~2:)(r=:<.&.(*&4096))(1-3%~2*%/3 0{co)**/1 2 4{co=:(,1 2.5{.~(5-$));(".`(4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~((=*./@:+.' '=])"1)&('MMLLPGSUNDFQ',.12{.'oauo')@(2&{.)))@.(_=_&".);._2,&','stdin''
jpjacobs
sumber
6

PYTHON 249 byte - 75 untuk bonus = 174

Mencoba pertama saya bermain golf.

import sys,random
y=sys.argv
d,b,f={10:1,1:1.5,15:2,7:1.5,13:255,-2:3.5,6:3,8:3,0:4,11:5},3*int(y[1]),"*shake*\n"
s=lambda:random.random()*(255*b)**.25<65536*((b-2)*int(y[3])*d[ord(y[2][0])-70]*2.5)**.25
if s():print f*3+"Click!" if s()and s()else f

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

Þorsteinn
sumber
Saya pikir Anda menggunakan precisi lebih tinggi dari 1/4096 (status pertanyaan Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Anda mungkin benar, saya tidak begitu mengerti bagian itu dan jawaban yang lain sepertinya melakukan hal yang sama dengan saya. Saya kira saya perlu melakukan sesuatu seperti ini: 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?
Þorsteinn
1/4096 berarti 12 bit pecahan. Lihatlah solusi saya; pendekatan yang lebih langsung akan floor(x*4096)*4096sama seperti Anda membulatkan ke misalnya tempat desimal.
TheConstructor
Ohh begitu, terima kasih. Ini seharusnya juga berlaku untuk multiplikasi seperti yang tampaknya Anda lakukan, tetapi karena itu tidak dinyatakan dalam aturan saya tidak akan khawatir tentang itu. :)
Þorsteinn
Ya, mungkin mereka menggunakan aritmatika titik tetap. Tetapi OP hanya diminta untuk menyelesaikan pembagian.
TheConstructor
6

Perl 1 (374 - 150 = 224 + MissingNo. Bytes)

sub h{print "*shake*
";}($x,$h,$_,$c,$s)=split(/,/,<>);$G=$$%(/P/?256:/U/?151:201);$S=$G-($s==1?0:$s==1.5?12:25);
$F=255&int(int($h*255/(/G|S/?8:12))/(int($x/4)||1));sub c{for($i=0;$i<3;$i++){do h();}print "Click!
";exit;}
/M/||$S<0||$S<$c&&$F>$$*$$%255&&do c();$W=int(int($c*100/(/P/?255:/U/?150:200))*$F/255)+($s==1?0:$s==1.5?5:10);$W>9&&do h();$W>29&&do h();$W>69&&do h();

Daftar argumen:

current hp, max hp, pokéball, catch rate, status, critical capture

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.

Konrad Borowski
sumber
5

PHP (746 763 byte - semua bonus):

<?if(!$i=fgets(STDIN))die('');parse_str($i,$i);$b=array('poke'=>1,'great'=>1.5,'ultra'=>2,'master'=>255,'safari'=>1.5,'sport'=>1.5,'lure'=>3,'net'=>3,'dusk'=>3.5,'dive'=>3.5,'moon'=>4,'fast'=>4,'quick'=>5,'love'=>8);$s=array('sleep'=>2.5,'frozen'=>2.5,'paralyzed'=>1.5,'poisoned'=>1.5,'burnt'=>1.5,''=>1);$i=array_merge(array('ball'=>'poke','hp'=>array('max'=>25,'current'=>1),'status'=>2.5,'rate'=>255),$i);$l='strtolower';$r='mt_rand';$x='*shake*'.PHP_EOL;$c='Click!'.PHP_EOL;$a=(((3*$i[hp][max])-(2*$i[hp][current]))*$i[rate]*$b[$l($i[ball])])/(3*$i[hp][max])*(is_numeric($i[status])?$i[status]:$s[$l($i[status])]);$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;if($r(0,1)>$a)die();echo$x;if($a>1)die($c);if($r(0,1)>$a)die();echo$x,$x;if($r(0,1)>$a)die();echo$c;

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:

if(!$info=fgets(STDIN))die('');
parse_str($info,$info);
$balls=array(//list of pokeballs
    'poke'=>1,
    'great'=>1.5,
    'ultra'=>2,
    'master'=>255,
    'safari'=>1.5,
    'sport'=>1.5,
    'lure'=>3,
    'net'=>3,
    'dusk'=>3.5,
    'dive'=>3.5,
    'moon'=>4,
    'fast'=>4,
    'quick'=>5,
    'love'=>8
);
$status=array(//list of status
    'sleep'=>2.5,
    'frozen'=>2.5,
    'paralyzed'=>1.5,
    'poisoned'=>1.5,
    'burnt'=>1.5,
    ''=>1 //in case there is no status
);
$info=array_merge(//this will set the default values
    array(
        'ball'=>'poke',
        'hp'=>array('max'=>25,'current'=>1),
        'status'=>2.5,
        'rate'=>255
    ),
    $info
);
$a=(((3*$info['hp']['max'])-(2*$info['hp']['current']))*$info['rate']*$balls[strtolower($info['ball'])])/(3*$info['hp']['max'])*(is_numeric($info['status'])?$info['status']:$status[strtolower($info['status'])]);
$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;//same as $a=floor(pow(65536/(255/$a),0.25)*4096)/4096;

if(mt_rand(0,1)>$a) die();//test 1
echo '*shake*',PHP_EOL;
if($a>1)die('Click!'.PHP_EOL);//if $a>1, catch it (critical catch)

if(mt_rand(0,1)>$a) die();//test 2
echo'*shake*',PHP_EOL,'*shake*',PHP_EOL;

if(mt_rand(0,1)>$a) die();//test 3
echo 'Click!',PHP_EOL;//passed all tests

Saya harus mengedit ini karena saya menggunakan presisi yang jauh lebih tinggi daripada yang dibutuhkan.

Perbaikan disediakan oleh TheConstructor .

Ismael Miguel
sumber
Saya pikir Anda menggunakan presisi yang lebih tinggi dari 1/4096 (negara pertanyaan Catatan: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Dan kamu benar. Saya perhatikan bahwa saya menggunakan nilai apa pun yang berasal dari divisi. Jika Anda mau, Anda bisa memberi saya bantuan karena saya tidak tahu bagaimana cara 'membulatkan' ke ketepatan yang lebih kecil di PHP.
Ismael Miguel
Anda dapat melakukan floor(x*4096)/4096atau menerapkan divisi titik tetap seperti yang saya lakukan.
TheConstructor
Terima kasih untuk bantuannya. Saya tidak akan pernah memikirkan itu. Saya telah memperbaiki jawaban saya.
Ismael Miguel
3

Java, 611

import java.util.*;class P{enum B{DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);long v;B(int i){v=((long)i<<12)/(long)10;}}public static void main(String[]y){Scanner s=new Scanner(System.in);B b=B.valueOf(s.next().toUpperCase().substring(0,2));long c=(long)(s.nextDouble()*4096);long m=s.nextLong()<<12;long h=(s.hasNextInt()?s.nextLong():1)<<12;long S=(long)((s.hasNextDouble()?s.nextDouble():2.5)*4096);long p=(65536L<<12)/(long)(Math.sqrt(Math.sqrt((255L<<24)/((((3L*m-2L*h)*c>>12)*b.v>>12<<12)/(3L*m)*S>>12)))*512);Random r=new Random();System.out.print(r.nextInt(65536)<p?"*shake*\n"+(r.nextInt(65536)<p?"*shake*\n*shake*\n"+(r.nextInt(65536)<p?"Click!\n":""):""):"");}}

Skor:

  • 729 Bytes
  • -93 semua Balls
  • -25 current_hp dan bonus_state opsional

=> 611

Program ini menggunakan fixed-point-arithmetics dengan 12 fraksi-bit ( 1/4096adalah 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 intnilai, divisi bekerja lebih baik dengan longs 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_hp

Poke 15 255 ;

Output sampel:

*shake*

Input sampel: Bola, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Output sampel:

*shake*
*shake*
*shake*
Click!
import java.math.BigDecimal;
import java.util.Random;
import java.util.Scanner;

class Pokeball {
    static long shift(long i) {
        return i << 12;
    }
    enum B {
        DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);
        long v;
        B(int i) {
            v = semiFixedDivision(shift(i),10);
        }
    }

    public static void main(String[] args) {
        final Scanner s = new Scanner(System.in);
        B b = B.valueOf(s.next().toUpperCase().substring(0, 2));
        long catchRate = (long) (s.nextDouble() * 4096);
        long maxHp = shift(s.nextLong());
        long currentHp = shift(s.hasNextInt()?s.nextInt():1);
        long statusBonus = (long) ((s.hasNextDouble()?s.nextDouble():2.5) * 4096);
        long a = fixedMultiplication(fixedDivision(fixedMultiplication(fixedMultiplication(
                semiFixedMultiplication(3, maxHp) - semiFixedMultiplication(2, currentHp), catchRate), b.v),
                                                   semiFixedMultiplication(3, maxHp)), statusBonus);
        println("a=",a);
        long x = fixedFourthRoot(fixedDivision(shift(255), a));
        println("x=",x);
        println("x^4=",fixedMultiplication(fixedMultiplication(x,x), fixedMultiplication(x,x)));
        long p = semiFixedDivision(shift(65536), fixedFourthRoot(fixedDivision(shift(255), a)));
        Random r = new Random();
        System.out.print(r.nextInt(65536) < p ?
                         "*shake*\n" + (r.nextInt(65536) < p ?
                                        "*shake*\n*shake*\n" + (r.nextInt(65536) < p ?
                                                                "Click!\n" :
                                                                "") :
                                        "") :
                         "");
    }

    private static long unshift(long p) {
        return p >> 12;
    }

    private static void println(String s, long v) {
        System.out.print(s);
        println(v);
    }

    private static void println(long v) {
        System.out.printf("%s%n", BigDecimal.valueOf(v).divide(BigDecimal.valueOf(4096)));
    }

    /**
     * Calculates division of {@code a/b} with both number last 12 bits treated as being "right of the dot"
     */
    static long fixedDivision(long a, long b) {
        return (a<<12)/b;
    }

    /**
     * Calculates division of {@code a/b} with {@code a}'s last 12 bits treated as being "right of the dot"
     */
    static long semiFixedDivision(long a, long b) {
        return a/b;
    }
    static long fixedMultiplication(long a, long b) {
        return (a*b) >> 12;
    }
    static long semiFixedMultiplication(long a, long b) {
        return a*b;
    }
    static long fixedFourthRoot(long a) {
        return (long)(Math.sqrt(Math.sqrt(a)) * 512);
    }
}
Kontraktor
sumber
1

CoffeeScript - 317 313 310 307 306 294 270 250 242 byte

342 - 25 (parameter) - 75 (12 bola) = 242

_=process.stdin
l=console.log
m=Math
s=m.sqrt
t=['*shake*','Click!']
n=65536
_.resume()
_.setEncoding 'utf8'
_.on 'data',(d)=>
 [A,B,C,E,F]=d.match /\w+/g;E||=1;F||=2.5;i=0;while i++<3
  if n*(s s (3*A-2*E)*B*{P:1,G:1.5,U:2,M:255,S:1.5,L:3,N:3,D:3.5,F:4,Q:5}[C.charAt 0]*F)<m.floor(m.random()*n)*s s 765*A
   break
  l t[0]
 if i>2
  l t[i-3]

Mengharapkan masukan HP_max,Rate,Ball[,HP_current[,status]]. Tidak mendukung Moonatau Lovebola.

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.

balls =
  P: 1
  G: 1.5
  U: 2
  M: 255
  S: 1.5
  L: 3
  N: 3
  D: 3.5
  F: 4
  Q: 5

messages = ['*shake*', 'Click!']

process.stdin.resume()
process.stdin.setEncoding 'utf8'
process.stdin.on 'data', (data) =>
  [HP_max, rate, ball, HP_current, status] = data.match /\w+/g
  HP_current ||= 1
  HP_status ||= 2.5
  i = 0
  while i++ < 3
    if 65536 * (Math.sqrt Math.sqrt (3*HP_max - 2*HP_current)*rate*status*balls[ball.charAt 0]) < Math.floor(Math.random()*65536) * Math.sqrt Math.sqrt 765*HP_max
      break
    console.log messages[0]
  if i > 2
    console.log messages[i-3]

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.

Martin Ender
sumber
1
Sepertinya prioritas ada di pihak Anda Oo p-=p%1/4096sepertinya benar-benar berfungsi. (Saya kira Anda setidaknya perlu menulis p-=p%(1/4096)dan kemudian saya tidak akan yakin modulus diimplementasikan untuk fraksi di kedua sisi. Bagus!
TheConstructor
@TheConstructor Haha, ya saya benar-benar harus memeriksa bahwa ... itu tampak sangat aneh bagi saya juga, tetapi %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. ^^
Martin Ender
Ya, mungkin ide yang masih bagus
TheConstructor
@TheConstructor Sebenarnya, saya perlu menulis p%(1/4096). Saya bahkan memeriksa ini sebelum memposting, tetapi entah bagaimana mengingat hasil pengujian saya yang salah.
Martin Ender
Dicoba di Chrome; bekerja tanpa () tetapi mungkin tidak selalu atau tidak pada semua browser ...
TheConstructor
0

Pembaruan: (C #)

Jumlah byte: 3.600

Critcal: -25

Semua bola-poke: -91


Total = 3.484

[golf]

using System;using System.Text;using System.Security.Cryptography;using System.Linq;namespace Pokemon{public class MainClass{private string[] c(string[] i){if(i.Length <= 3){var v1 =i[0][0];var v2 =i[1][0];var v3 =i[2][0];if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};else return null;}else return null;}private static void Main(string[] args){while(true){Console.Clear();MainClass _c = new MainClass();Console.Write("Inputs'please:");var i = Console.ReadLine().ToLower();string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());new w("Processing...\n");if(r== null)new w("Too many errors");else new m(r);}}}public class w{public w(string l){Console.WriteLine(l);}}public class m{public m(string[] v){switch (v[2].Substring(0,2)){case "po":c(v[0],v[1],"1");break;case "ul":c(v[0],v[1],"2");break;case "ma":c(v[0],v[1],"255");break;case "gr":case "sa":case "sp":c(v[0],v[1],"1.5");break;case "lu":case "ne":c(v[0],v[1],"3");break;case "du":case "di":c(v[0],v[1],"3.5");break;case "mo":case "fa":c(v[0],v[1],"4");break;case "qu":c(v[0],v[1],"5");break;case "lo":c(v[0],v[1],"8");break;default:new w("Not supported");break;}}private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}private void c(params string[] v){var s =0.0;var x =0;if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}else{new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));var c_ = int.Parse(Console.ReadLine());s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));x=2;}if(((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");else{for(int c_= 0;c_<3;c_++){new w("*shake*");var r =Math.Pow(65536.0/y(255.0/s),0.25);if(i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;}}Console.ReadKey();}}}

[reguler]

using System;
using System.Text;
using System.Security.Cryptography;
using System.Linq;

namespace Pokemon
{
    public class MainClass
    {
        private string[] c(string[] i)
        {
            if (i.Length <= 3)
            {
                var v1 =i[0][0];
                var v2 =i[1][0];
                var v3 =i[2][0];
                if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};
                else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};
                else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};
                else return null;
            }
            else return null;
        }

        private static void Main(string[] args)
        {
            while(true)
            {
                Console.Clear();
                MainClass _c = new MainClass();
                Console.Write("Inputs'please:");
                var i = Console.ReadLine().ToLower();
                string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());
                new w("Processing...\n");
                if(r== null)new w("Too many errors");
                else new m(r);
            }
        }
    }

    public class w
    {
        public w(string l)
        {
            Console.WriteLine(l);
        }
    }

    public class m
    {
        public m(string[] v)
        {
            switch (v[2].Substring(0,2))
            {
                case "po":
                    c(v[0],v[1],"1");
                    break;
                case "ul":
                    c(v[0],v[1],"2");
                    break;
                case "ma":
                    c(v[0],v[1],"255");
                    break;
                case "gr":
                case "sa":
                case "sp":
                    c(v[0],v[1],"1.5");
                    break;
                case "lu":
                case "ne":
                    c(v[0],v[1],"3");
                    break;
                case "du":
                case "di":
                    c(v[0],v[1],"3.5");
                    break;
                case "mo":
                case "fa":
                    c(v[0],v[1],"4");
                    break;
                case "qu":
                    c(v[0],v[1],"5");
                    break;
                case "lo":
                    c(v[0],v[1],"8");
                    break;
                default:
                    new w("Not supported");
                    break;
            }
        }

        private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}

        private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}

        private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}

        private void c(params string[] v)
        {
            var s =0.0;
            var x =0;
            if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}
            else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}
            else
            {
                new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));
                var c_ = int.Parse(Console.ReadLine());
                s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));
                x=2;
            }
            if (((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");
            else
            {
                for(int c_= 0;c_<3;c_++)
                {
                    new w("*shake*");
                    var r =Math.Pow(65536.0/y(255.0/s),0.25);
                    if (i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;
                }
            }
            Console.ReadKey();
        }    
      }
  }
gh0st
sumber
Ini adalah kode golf. Anda harus mengurangi jawaban Anda (mis: stripping spasi putih). Anda masih dapat memberikan jawaban saat ini sebagai versi yang dapat dibaca.
Ismael Miguel