Symulator Pokeball

26

W grach wideo Pokemon gracz zostaje wysłany w świat, aby zmusić dzikie zwierzęta do drobnych piłek i wyszkolić je do walki. Oczywiście wszyscy wiedzą, że nikt nie gra w Pokemona podczas bitwy. Prawdziwym losowaniem tej serii jest złapanie pokemona! Twoim zadaniem jest symulacja pokeball podczas próby schwytania. W tym wyzwaniu zostanie wykorzystana formuła przechwytywania generacji V, która wygląda następująco:

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

HP_maxjest równa maksymalnej wartości HP docelowego pokemona. HP_currentjest równy bieżącemu HP HP docelowego pokemona. rateto współczynnik połowu pokemona, bonus_ballto mnożnik rzuconego pokeballa, i bonus_statuswynosi 2,5, jeśli docelowy pokemon śpi lub jest zamrożony, 1,5, jeśli docelowy pokemon jest sparaliżowany, otruty lub spalony, i 1 w innym przypadku.

Po znalezieniu amasz wykonać do trzech „kontroli wstrząsów”. Prawdopodobieństwo powodzenia testu wstrząsania jest następujące 65536 / (255 / a)^(1/4). Jeśli którykolwiek z tych testów nie powiedzie się, pokemon ucieka swoją piłką. Jeśli wszystkie trzy testy zakończą się powodzeniem, pokemon zostanie złapany!

Uwaga: Ilekroć wykonywany jest jakikolwiek podział, wynik jest zaokrąglany w dół do wielokrotności 1/4096. Jest to na ogół nieznaczący szczegół, ale należy to uwzględnić w programie.

Wyzwanie polega na napisaniu programu, który wykona testy wstrząsów i wydrukuje je w celu sprawdzenia statusu kontroli. Na standardowym poziomie twój program otrzyma (przynajmniej szczegóły poniżej) maksymalne HP pokemona, współczynnik połowu docelowego pokemona i nazwę pokeball. Maksymalne HP i wskaźnik połowu są gwarantowane jako liczby całkowite, a nazwa pokeball jest zawsze ciągiem znaków. Dane wejściowe mogą występować w dowolnej kolejności, a dowolne znaki ograniczające są dla Ciebie wygodne, o ile są spójne. Załóżmy, że dane wejściowe są prawidłowe, nie jest wymagana obsługa błędów.

Nazwy pokeballi, które musisz wspierać, oraz ich mnożniki połowu są wymienione tutaj:

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

Możesz założyć, że cel śpi i ma 1 HP. Oczekiwany format danych wyjściowych jest następujący:

(First check failed)
(no output)

(Second check failed)
*shake*

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

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

(To nie jest literówka, twój program nigdy nie powinien generować tylko dwóch wstrząsów.)

To jest , więc twój wynik jest liczbą bajtów kodu źródłowego twojego programu. Najniższy wynik wygrywa.

Bonusy!

Powiedziałem, że może zakładać pokemon jest w 1 HP i śpi. Alternatywnie możesz zezwolić użytkownikowi na wprowadzenie aktualnego HP pokemona i bonus_status. Bieżące HP pokemona będzie zawsze liczbą całkowitą równą lub mniejszą niż jego maksymalne HP i bonus_statuszawsze będzie wynosić 2,5, 1,5 lub 1. Jeśli tak, musisz mieć te wartości na końcu danych wejściowych, a domyślnie 1 i 2.5, jeśli nie są dostarczone. Możesz odjąć 15 punktów od swojego wyniku za wdrożenie jednego z nich lub 25 punktów za oba.

Dodatkowo możesz zaimplementować przechwytywanie krytyczne. Jeśli nastąpi przechwycenie krytyczne, wykonywany jest tylko jeden test wstrząsania. Jeśli się nie powiedzie, program zostanie zamknięty. Jeśli zostanie przekazany, wyprowadza:

*shake*
Click!

Krytyczne przechwytywania stają się bardziej powszechne, gdy gracz zbiera więcej pokemonów, ale dla uproszczenia możemy założyć, że już ich „złapali”. Jeśli losowo wygenerowana liczba z przedziału od 0 do 2047 jest mniejsza niż a(wynik pierwszego obliczenia) pomnożona przez 2,5, jest to krytyczne przejęcie. Obsługa przechwytywania krytycznego pozwala usunąć 25 punktów z twojego wyniku.

Istnieje wiele innych pokeballi, które możesz wspierać. Ich nazwy i mnożniki połowów są wymienione tutaj:

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

Dla każdej z tych kul, do których dodajesz wsparcie, możesz odjąć (5 + długość nazwy piłki) od swojego wyniku.

Wreszcie, za kopnięcia, osiągnięcie wszystkich tych bonusów (bieżące HP i bonus_status od standardowego, krytycznych przechwytów i wszystkie 10 opcjonalnych piłek) przyniesie ci dodatkową nagrodę w wysokości 7 punktów usuniętych z twojego wyniku, co daje nawet 150 premii ogółem.

Przykład wejścia / wyjścia

Aby upewnić się, że wszyscy jesteśmy na tej samej stronie.

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

Powodzenia i udanej gry w golfa!

podziemny monorail
źródło
Obecnie nie jestem w stanie ocenić, jak duże jest twoje prawdopodobieństwo, 65536 / (255 / a)^(1/4)ale moje odwagi mówią, że jest ono większe niż 1. Czy porównujesz z liczbą losową z zakresu od 0 do 65536? Czy sprawdzenie się powiedzie, jeśli liczba losowa jest większa lub niższa?
TheConstructor
Jeśli 65536 / (255 / a)^(1/4)jest większa niż 1, sprawdzanie automatycznie się powiedzie. Nie jestem pewien, co masz na myśli przez drugie pytanie.
undergroundmonorail
Więc rnd < ppomocą czek jest udana ze rndw przedziale od 0 do 1.
TheConstructor
1
@ IsmaelMiguel zobacz moje komentarze: generujesz losową liczbę z zakresu od 0 do 1 i porównujesz ją 65536 / (255 / a)^(1/4), a jeśli liczba losowa jest mniejsza, test wstrząsania powiódł się
TheConstructor
1
Jak zaznaczono w tekście, tekstowy typ pokeball, maksymalne hp i szybkość połowu są przeszłe jako dane wejściowe do twojego programu. Opcjonalnie możesz poprosić o aktualny hp (domyślnie 1) lub premię do statusu (domyślnie 2,5)
TheConstructor

Odpowiedzi:

3

J 301-150 = 151

W przypadku sportu wszystkie bonusy zostały wdrożone, choć pewnie lepiej bym tego nie robił :). Wyjaśniłem krótko rzeczy poniżej, ale ten jest zbyt długi, aby go szczegółowo wyjaśnić, chyba że ktoś wyraźnie tego zażąda. Implementuje wszystkie piłki, przechwyty krytyczne i opcjonalne dane wejściowe.

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

Oto wersja golfowa

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
źródło
6

PYTHON 249 bajtów - 75 dla bonusów = 174

Moja pierwsza gra w golfa.

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 za włączenie wybranych piłek: Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick

Daje mi 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 punktów bonusowych

[edytuj] Zaokrąglaj w dół do 12 bitów ułamkowych za każdym razem, gdy używany jest podział, nie używając go

[edit2] zoptymalizuj słownik pokeball

Steinorsteinn
źródło
Myślę, że używasz precesji wyższej niż 1/4096 (stany pytania Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Prawdopodobnie masz rację, nie całkiem rozumiałem tę część, a inne odpowiedzi wydawały się robić tak samo jak ja. Chyba muszę zrobić coś takiego: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)wykluczyć wszystkie podziały?
steinorsteinn,
1/4096 oznacza 12 bitów ułamkowych. Zobacz moje rozwiązanie; bardziej bezpośrednie podejście byłoby takie floor(x*4096)*4096samo, jak zaokrąglanie w dół do np. miejsc po przecinku.
TheConstructor
Och, rozumiem, dziękuję. Powinno to prawdopodobnie dotyczyć także mnożenia, tak jakbyś to zrobił, ale ponieważ nie jest to określone w przepisach, nie będę się tym martwić. :)
steinorsteinn
Tak, prawdopodobnie używają arytmetyki stałoprzecinkowej. Ale OP poprosił tylko o okrągły podział.
TheConstructor
6

Perl 1 (374-150 = 224 + brak brakujących bajtów)

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

Lista argumentów:

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

Tak, wiem, że to całkowicie łamie zasady, ale mnie to nie obchodzi. Jeśli nie zauważyłeś, jest to pierwszy algorytm przechwytywania Pokémon ze wszystkimi jego dziwactwami (Great Balls są lepsze niż Ultra Balls, pod pewnymi warunkami). To implementuje wszystkie funkcje, w tym te, które nie zostały uwzględnione (i tak postanowiłem uwzględnić dla nich punkty). Krytyczne przechwytywania są ignorowane (ale są implementowane - po prostu nie wpływają na szybkość przechwytywania), nowsze Poké Balls ładują dane innych Poké Balls.

Pamiętaj, że choć ta odpowiedź jest krótka, łamie wszystkie zasady, więc uważaj ją za zabawną odpowiedź, nie akceptuj jej. Początkowo zamierzałem zaimplementować algorytm Gen5 w Perlu 5, ale zdecydowałem - dlaczego nie zabawić się. I tak, skompilowałem Perl 1 i ten kod działa. Jeśli uruchomisz go w nowszej wersji Perla, możesz otrzymać ostrzeżenia o przestarzałym używaniu do, ale bądźmy szczerzy - to jedyny sposób na uruchomienie funkcji w Perlu 1. Perl 1 również ma pewne dziwactwa (na przykład nie mogę przenieś linię zaczynając od /M/poprzedniej linii - dlaczego? - nie wiem).

Poza tym w Perlu 1 nie ma losowych liczb, więc mam nadzieję, że mnie nie zabijesz za modulo $$. To najbliższa losowa liczba, którą mogłem znaleźć.

Edycja: Wygląda na to, że starsza do call()składnia została usunięta w Perlu 5.19.8. Upewnij się, że używasz starszej wersji Perla do uruchomienia tego skryptu, ponieważ wygląda na to, że Perl 5.20 nie będzie kompatybilny ze skryptami Perla 1.

Konrad Borowski
źródło
5

PHP (746 763 bajty - wszystkie bonusy):

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

Aby tego użyć, musisz podać dane wejściowe jako „ball = poke & status = sleep” na STDIN.

HP należy podać jako „hp [max]” lub „hp [current]”.

Ten kod działa zgodnie z testem tutaj .

Możesz podać status według jego nazwy lub mnożnika. ( niewymagane w pytaniu ).

Oto czytelna wersja:

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

Musiałem to edytować, ponieważ korzystałem ze znacznie większej precyzji niż wymagana.

Poprawka została dostarczona przez TheConstructor .

Ismael Miguel
źródło
Myślę, że używasz precission wyższa niż 1/4096 (stany pytanie Uwaga: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
I masz rację. Zauważyłem, że używam jakiejkolwiek wartości pochodzącej z podziału. Jeśli chcesz, możesz mi pomóc, bo nie mam cholernego pojęcia, jak „zaokrąglić” mniejszą precyzję w PHP.
Ismael Miguel
Możesz zrobić floor(x*4096)/4096lub wdrożyć podział punktu stałego, tak jak ja.
TheConstructor
Dziękuję za pomoc Nigdy bym o tym nie pomyślał. Naprawiłem swoją odpowiedź.
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":""):""):"");}}

Wynik:

  • 729 bajtów
  • -93 wszystkie kulki
  • -25 opcjonalne current_hp i bonus_state

=> 611

Program wykorzystuje arytmetykę punktów stałych z 12 bitami ułamkowymi ( 1/4096jest to wartość najbardziej prawego bitu). Ponieważ Java zwykle nie używa stałego punktu, wewnątrz kodu występują pewne zmiany, aby osiągnąć oczekiwane wyniki. Zobacz długą wersję używanych funkcji arytmetycznych, które zostały wprowadzone do gry w golfa.

Podczas gdy większość obliczeń można było wykonać na intwartościach, działy działają lepiej z longs, ponieważ musisz przesunąć dywidendę o kolejne 12 bitów w lewo, aby zachować pożądaną precyzję (w przeciwnym razie stracisz wszystkie bity ułamkowe).

Przykładowe dane wejściowe ( ;wymagane tylko, jeśli są uruchamiane interaktywnie, tj. STDIN nie otrzymał EOF): Ball, catch_rate, max_hp

Poke 15 255 ;

Przykładowe dane wyjściowe:

*shake*

Przykładowe dane wejściowe: Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Przykładowe dane wyjściowe:

*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);
    }
}
TheConstructor
źródło
1

CoffeeScript - 317 313 310 307 306 294 270 250 242 bajtów

342 - 25 (parametry) - 75 (12 piłek) = 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]

Oczekuje wkładu HP_max,Rate,Ball[,HP_current[,status]]. Nie obsługuje Moonani Lovepiłek.

To pierwsza rzecz, jaką kiedykolwiek grałem w golfa, która nie jest wyrażeniem regularnym, więc prawdopodobnie jest miejsce na ulepszenia. Bezwstydnie skopiowałem pomysł przechowywania tylko częściowych nazw piłek. ;) Wspieranie pozostałych dwóch piłek po prostu nie jest tego warte, nawet przy dodatkowym +7 za uzyskanie wszystkich bonusów.

Wersja bez golfa

Ta wersja pomija wszystkie krótkie aliasy, które zdefiniowałem na początku, ale osobno definiuje wyszukiwanie piłki.

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]

Uwaga na temat wzoru prawdopodobieństwa: Zmieniłem pełną formułę (z wypisanym a), aby nie było podziałów, i obliczam (...)^(1/4), biorąc dwukrotnie pierwiastek kwadratowy.

Martin Ender
źródło
1
Wygląda na to, że po twojej stronie jest preferencja. Oo p-=p%1/4096naprawdę działa. (Zgadłbym, że musiałbyś przynajmniej napisać, p-=p%(1/4096)a mimo to nie byłbym pewien, czy moduł zostanie zaimplementowany dla ułamków po obu stronach. Fajnie!
TheConstructor
@TheConstructor Haha, tak, naprawdę musiałem sprawdzić, czy ... też wyglądało to naprawdę dziwnie, ale %można je wykorzystać do zabawnych rzeczy w JS. Po ponownym przeczytaniu pytania myślę, że ta odpowiedź nie do końca spełnia wymagania dotyczące zaokrąglania. Myślę, że zaokrąglanie powinno być stosowane po każdym podziale. Być może będę musiał trochę zrestrukturyzować swoje obliczenia. ^^
Martin Ender
Tak, prawdopodobnie wciąż dobry pomysł
TheConstructor
@TheConstructor Właściwie to muszę pisać p%(1/4096). Sprawdziłem to nawet przed opublikowaniem, ale jakoś źle zapamiętałem wynik mojego testu.
Martin Ender
Próbowałem w Chrome; działał bez (), ale może nie zawsze lub nie we wszystkich przeglądarkach ...
TheConstructor
0

Aktualizacja: (C #)

Liczba bajtów: 3600

Kryt.: -25

Wszystkie poke-kule: -91


Razem = 3484

[grał w golfa]

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

[regularny]

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
źródło
To jest golfowy kod. Powinieneś ograniczyć swoją odpowiedź (np .: usuwanie białych znaków). Nadal możesz podać aktualną odpowiedź w postaci czytelnej.
Ismael Miguel