Pokeball Simülatörü


26

Pokemon video oyunlarında oyuncu, vahşi hayvanları küçük toplara zorlamak ve onları savaşmak için eğitmek için dünyaya gönderilir. Elbette herkes , kimsenin savaş için Pokemon oynamadığını bilir . Serinin asıl çekimi pokemonun kendisini yakalaması! İşiniz, yakalama girişimi sırasında pokeball simüle etmektir. Bu zorluk, aşağıdaki gibi olan V kuşağı yakalama formülünü kullanacaktır:

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

HP_maxhedef pokemonun maksimum HP'sine eşittir. HP_currenthedef pokemon'un mevcut HP'sine eşittir. ratepokemonun yakalanma hızı bonus_ball, atılan pokeball çarpanı, bonus_statushedef pokemon uyuyorsa veya donuyorsa 2.5, hedef pokemon felç olmuş, zehirlenmiş veya yanmış ise 1.5, aksi takdirde 1'dir.

Bulduktan sonra a, üç taneye kadar "sallama kontrolü" yapmanız gerekir. Bir sallama kontrolünün başarılı olma olasılığı 65536 / (255 / a)^(1/4). Bu kontrollerden herhangi biri başarısız olursa, pokemon topu terk eder. Üç kontrol de başarılı olursa, pokemon yakalanır!

Not: Herhangi bir bölme yapıldığında, sonuç 1/4096 katına yuvarlanır. Bu genellikle önemsiz bir ayrıntıdır, ancak programınızda dikkate alınmalıdır.

Buradaki zorluk, sallama kontrollerini yapan ve kontrollerin durumunu belirlemek için basan bir program yazmaktır. Stdin'de, programınız pokemonun maksimum HP'sini, hedef pokemonun yakalanma oranını ve pokeball adını alacaktır (en azından aşağıda ayrıntıları). Pokeball adı her zaman bir dizedir, maksimum HP ve yakalama hızının hem tam sayı olduğu garanti edilir. Bu girdi herhangi bir sırayla gelebilir ve herhangi bir sınırlandırıcı karakter (ler) ile tutarlı olduğu sürece sizin için uygundur. Girişin doğru olduğunu varsayalım, hata işlemeye gerek yoktur.

Desteklemeniz gereken telefon bloklarının adları ve bunların yakalama çarpanları burada listelenmiştir:

  Poke | 1
 Great | 1.5
 Ultra | 2
Master | 255

Hedefin uykuda ve 1 HP'de olduğunu varsayabilirsiniz. Çıktı için beklenen format şudur:

(First check failed)
(no output)

(Second check failed)
*shake*

(Third check failed)
*shake*
*shake*
*shake*

(All checks pass)
*shake*
*shake*
*shake*
Click!

(Bu bir yazım hatası değildir, programınız hiçbir zaman yalnızca iki sarsıntı vermemelidir.)

Bu , yani puanınız programınızın kaynak kodunun bayt sayısı. En düşük puan kazanır.

Bonuslar!

Bunu söyleyen edebilir Pokemon 1 HP ve uykuda olan varsayalım. Alternatif olarak, kullanıcının pokemon'un mevcut HP ve girişini yapmasına izin verebilirsiniz bonus_status. Pokemon'un mevcut HP'si her zaman maksimum HP'sine eşit veya daha az bir tam sayı bonus_statusolacaktır ve her zaman 2.5, 1.5 veya 1 olacaktır. 2.5 Eğer tedarik edilmemişlerse. Bunlardan birini uygulamak için puanınızdan 15 , her ikisi için de 25 puan çıkarabilirsiniz .

Ek olarak, kritik yakalamalar da gerçekleştirebilirsiniz. Kritik bir yakalama meydana gelirse, sadece bir sallama testi gerçekleştirilir. Başarısız olursa, program sessizce çıkar. Geçilirse, çıktı:

*shake*
Click!

Kritik eserler, oyuncu daha fazla pokemon topladıkça daha yaygın hale gelir, ancak sadelik uğruna "hepsini yakaladıklarını" varsayabiliriz. 0 ile 2047 arasında rastgele oluşturulmuş bir sayı a(ilk hesaplamanın sonucu olarak) 2.5 ile çarpıldığında daha azsa , bu kritik bir yakalamadır. Kritik yakalama desteği , puanınızı 25 puan kaldırmanıza olanak tanır .

Desteklemeyi seçebileceğiniz çok sayıda başka pokebar var. İsimleri ve yakalama çarpanları burada listelenmiştir:

Safari | 1.5
 Sport | 1.5
  Lure | 3
   Net | 3
  Dusk | 3.5
  Dive | 3.5
  Moon | 4
  Fast | 4
 Quick | 5
  Love | 8

Desteklediğiniz bu topların her biri için, puanınızdan (5 + topun isminin uzunluğunu) çıkarabilirsiniz.

Son olarak, vuruşlar için, bu bonusların tümüne ulaşmak (stdin'den geçerli HP ve bonus_status, kritik yakalamalar ve 10 isteğe bağlı topun tümü), 150 puanlık bir bonus için size puanınızdan 7 puan ek ödül kazandıracak .

Örnek Giriş / Çıkış

Sadece hepimizin aynı sayfada olmasını sağlamak için.

$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!

İyi şanslar ve mutlu golf!


Şu anda alacağınız olasılığın ne kadar büyük olabileceğini yargılayamam 65536 / (255 / a)^(1/4)ama bağırsaklarım 1'den büyük olduğunu söylüyor. Rasgele sayı daha büyükse veya daha düşükse kontrol başarılı mı?
Oluşturucu,

Eğer 65536 / (255 / a)^(1/4)1'den büyük olduğu, onay otomatik olarak başarılı. İkinci soru ile ne demek istediğinizi anlamadım.
undergroundmonorail

Yani rnd < p, kontrolün rnd0 ve 1 aralığında başarılı olduğu anlamına gelir .
Yapımcı

1
Benim yorumları görmek @IsmaelMiguel: Eğer 0 ile 1 aralığında bir rastgele sayı oluşturup karşı karşılaştırmak 65536 / (255 / a)^(1/4)rasgele sayı az olursa, o zaman titreme testi başarılı
TheConstructor

1
Metinde belirtildiği gibi, yazılı pokeball tipi, maksimum hp ve av oranı programınıza giriş olarak geçmiş durumda. İsteğe bağlı olarak mevcut hp (varsayılan 1) veya durum bonusu (varsayılan 2.5)
isteyebilirsiniz

Yanıtlar:


3

J 301-150 = 151

Spor için, tüm bonuslar uygulanır, ancak muhtemelen daha iyi olmasam da :). Aşağıdakileri kısaca açıkladım, ancak birileri açıkça talep etmediği sürece, bu ayrıntılı olarak açıklamak için çok uzun. Tüm topları, kritik görüntüleri ve isteğe bağlı girdileri uygular.

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%])`mess@.crit a

İşte golf versiyonu

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''

6

PYTHON 249 bayt - bonuslar için 75 = 174

İlk golf oynamayı denedim.

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

Seçili topları dahil etme bonusu: Safari, Spor, Yem, Net, Alacakaranlık, Dalış, Hızlı, Hızlı

Bana 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 + 75 = bonus puan vermek

[edit] Her kullanıldığında bölme kullanılmadığında her seferinde 12 kesirli bit

[edit2] pokeball sözlüğünü optimize et


Sanırım 1/4096'dan daha yüksek bir öncelik kullanıyorsunuz (soru durumları Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

Muhtemelen haklısın, o kısmı pek anlamadım ve diğer cevaplar benim yaptığım gibi görünüyordu. Sanırım şöyle bir şey yapmam gerekiyor: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)Tüm bölümleri dışlamak için?
steorsteinn

1/4096, ortalama 12 kesirli bit. Çözümüme bir bakın; daha doğrudan bir yaklaşım floor(x*4096)*4096tam olarak örneğin ondalık basamağa yuvarladığınız gibi olacaktır.
Yapıcı,

Ohh, anladım, teşekkürler. Bu muhtemelen sizin yaptığınız gibi çarpma için de geçerli olmalıdır, ancak kurallarda belirtilmediğinden dolayı endişelenmeyeceğim. :)
steorsteinn

Evet, muhtemelen sabit nokta aritmetik kullanırlar. Ancak OP sadece bölünmeyi istedi.
Yapıcı,

6

Perl 1 (374-150 = 224 + Kayıp Sayı yok)

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();

Argüman listesi:

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

Evet, bunun kurallara tamamen aykırı olduğunun farkındayım, ama umrumda değil. Fark etmediysen, bu, tüm tuhaflıkları olan ilk Pokémon nesil yakalama algoritmasıdır (Büyük Toplar, belirli koşullarda Ultra Toplardan daha iyidir). Bu, dahil edilmemiş olanlar dahil tüm özellikleri uygular (ve yine de onlar için puan eklemeye karar verdim). Kritik yakalamalar göz ardı edilir (ancak uygulanırlar - sadece yakalama oranını etkilemezler), daha yeni Poké Balls diğer Poké Balls verilerini yükler.

Lütfen bu cevap kısa olsa da tüm kuralları ihlal ettiğine dikkat edin, bu yüzden sadece eğlenceli bir cevap olarak kabul edin, kabul etmeyin. Başlangıçta Perl 5'te Gen5 algoritmasını kullanacaktım, ama karar verdim - neden biraz eğlenmiyorsun. Ve evet, aslında Perl 1'i derledim ve bu kod çalışıyor. Eğer Perl’in yeni sürümünde çalıştırırsanız, kullanımdan kaldırılmış kullanım konusunda uyarılar alabilirsiniz do, ancak dürüst olalım - Perl 1’de işlevleri çalıştırmanın tek yolu budur. çizgiyi /M/önceki çizgiden başlayarak hareket ettir - neden? - bilmiyorum).

Ayrıca, Perl 1'de rastgele sayılar yoktur, bu yüzden beni modulo için öldürmeyeceğinizi umuyorum $$. Bulduğum rastgele sayıya en yakın şey bu.

Düzenleme: Eski do call()sözdiziminin Perl 5.19.8'de kaldırıldığı anlaşılıyor. Bu betiği çalıştırmak için daha eski bir Perl sürümü kullandığınızdan emin olun, çünkü Perl 5.20, Perl 1 betikleri ile uyumlu olmayacaktır.


5

PHP (746 763 bayt - tüm bonuslar):

<?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;

Bunu kullanmak için girişi STDIN'de 'ball = poke & status = sleep' olarak belirtmelisiniz.

HP 'hp [max]' veya 'hp [current]' olarak sağlanmalıdır.

Bu kod burada test edildiği gibi çalışır .

Durumu, adına veya çarpanına göre sağlayabilirsiniz. ( soruda gerekli değil ).

İşte okunabilir bir sürüm:

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

Bunu düzenlemek zorundaydım çünkü gerekenden çok daha yüksek bir hassasiyet kullanıyordum.

Düzeltme TheConstructor tarafından sağlandı .


Ben (soru devletler Not: 1/4096 daha yüksek bir kesinlik derecesi kullandığınız düşünüyorum Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

Ve haklısın. Bölmeden gelen değeri ne kullandığımı fark ettim. İstersen bana biraz yardım edebilirsin çünkü PHP'de daha küçük bir kesinliğe nasıl 'yuvarlak' olacağı konusunda hiçbir fikrim yok.
Ismael Miguel

floor(x*4096)/4096Benim yaptığım gibi sabit nokta bölümü yapabilir veya uygulayabilirsiniz.
Yapıcı,

Yardımın için teşekkürler. Bunu asla düşünmem. Cevabımı düzelttim.
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":""):""):"");}}

Gol:

  • 729 Bayt
  • -93 tüm Toplar
  • -25 isteğe bağlı current_hp ve bonus_state

=> 611

Program, 12 kesir 1/4096bitli sabit nokta aritmetik kullanır ( en fazla bitin değeridir). Java genellikle sabit nokta kullanmadığından, beklenen sonuçları elde etmek için kodun içinde bazı kaymalar vardır. Golf amacıyla kullanılan kullanılmış aritmetik fonksiyonların uzun versiyonuna bakınız.

Hesaplamaların çoğu intdeğerler üzerinden yapılabilse de long, istediğiniz hassasiyeti korumak için bölmeyi 12 bit daha sola kaydırmanız gerektiğinden bölümler daha iyi çalışır (aksi halde tüm kesirleri kaybedersiniz).

Örnek girişi ( ;yalnızca etkileşimli olarak çalışırsa, yani STDIN EOF almadıysa gereklidir): Top, yakalama_sayısı, max_hp

Poke 15 255 ;

Örnek çıktı:

*shake*

Örnek giriş: Top, yakalama_sayısı, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Örnek çıktı:

*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);
    }
}

1

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

342 - 25 (parametreler) - 75 (12 top) = 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]

Giriş bekliyor HP_max,Rate,Ball[,HP_current[,status]]. Topları desteklemez Moonveya desteklemez Love.

Bu, golf oynadığım ilk şey regex değil, bu yüzden muhtemelen iyileştirmeye yer var. Sadece kısmi top adlarını saklama fikrini utanmadan kopyaladım. ;) Diğer iki topu desteklemek, tüm bonusları almak için ek +7 ile bile olsa, buna değmez .

Ungolfed versiyonu

Bu sürüm başlangıçta tanımladığım tüm kısa takma adları atlıyor ancak top aramalarını ayrı ayrı tanımlıyor.

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]

Olasılık formülü üzerine bir not: Tüm formülü (yazılı olarak yazılmıştır a) böylelikle bölünme olmayacak şekilde yeniden düzenledim ve (...)^(1/4)karekökü iki kez alarak hesaplıyorum .


1
Görünüşe göre öncelik senin yanında, Oo p-=p%1/4096gerçekten işe yarıyor. (Misiniz size yazma en az ihtiyaç göstereceğini tahmin p-=p%(1/4096)ve sonra yine ben modülü hem tarafta kesirler için uygulanan emin olmazdım Güzel.!
TheConstructor

@Konutucu Haha, evet, aslında kontrol etmek zorunda kaldım ... bana da çok garip geldi ama %JS'de bazı komik şeyler için kullanılabiliyordu. Soruyu tekrar okuduktan sonra, bu cevabın yuvarlama şartını tam olarak yerine getirmediğini düşünüyorum. Her bölümden sonra yuvarlamanın uygulanması gerektiğini düşünüyorum . Hesaplamamı biraz yapılandırmam gerekebilir. ^^
Martin Ender

Evet muhtemelen hala iyi bir fikir
TheConstructor

@Bilgi Yapıcı Aslında yazmam gerekiyor p%(1/4096). Bunu göndermeden önce bile kontrol ettim, ancak bir şekilde testimin yanlış olduğunu hatırladım.
Martin Ender

Chrome'da denendi; () olmadan çalıştım ama belki de her zaman ya da tüm tarayıcılarda olmasın ...
TheConstructor 11:14

0

Güncelleme: (C #)

Bayt sayısı: 3.600

Kritik: -25

Tüm kurcalama topları: -91


Toplam = 3,484

[Golfed]

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();}}}

[düzenli]

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();
        }    
      }
  }

Bu kod golfü. Cevabınızı azaltmalısınız (örneğin: boşlukları sıyırma). Geçerli cevabı hala okunabilir bir sürüm olarak sunabilirsiniz.
Ismael Miguel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.