Pokeball-Simulator

26

In den Pokemon-Videospielen wird der Spieler in die Welt geschickt, um wilde Tiere zu winzigen Bällen zu zwingen und sie zum Kampf auszubilden. Natürlich weiß jeder , dass niemand Pokemon für den Kampf spielt. Die wahre Auslosung der Serie ist, dass das Pokémon sich selbst fängt! Ihre Aufgabe ist es, den Pokeball während eines Eroberungsversuchs zu simulieren. Für diese Herausforderung wird die Erfassungsformel der Generation V verwendet, die wie folgt lautet:

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

HP_maxentspricht den maximalen HP des Zielpokemons. HP_currentist gleich den aktuellen HP des Zielpokemons. rateist die Fangrate des Pokémons, bonus_ballist der Multiplikator des geworfenen Pokéballs und bonus_statusist 2,5, wenn das Ziel-Pokémon schläft oder eingefroren ist, 1,5, wenn das Ziel-Pokémon gelähmt, vergiftet oder verbrannt ist, und 1, andernfalls.

Nach dem Auffinden amüssen Sie bis zu drei "Shake Checks" durchführen. Die Wahrscheinlichkeit, dass ein Shake-Check erfolgreich ist, ist 65536 / (255 / a)^(1/4). Wenn eine dieser Prüfungen fehlschlägt, entweicht das Pokémon seinem Ball. Wenn alle drei Prüfungen erfolgreich sind, wird das Pokemon abgefangen!

Hinweis: Bei jeder Division wird das Ergebnis auf ein Vielfaches von 1/4096 abgerundet. Dies ist im Allgemeinen ein unbedeutendes Detail, das jedoch in Ihrem Programm berücksichtigt werden muss.

Ihre Herausforderung besteht darin, ein Programm zu schreiben, das die Schüttelprüfungen ausführt und druckt, um den Status der Prüfungen zu ermitteln. Auf stdin erhält Ihr Programm (mindestens Details unten) die maximale HP des Pokémons, die Fangrate des Ziel-Pokémons und den Namen des Pokéballs. Die maximale HP und die Fangrate sind garantiert ganze Zahlen, während der Name des Pokeballs immer eine Zeichenfolge ist. Diese Eingabe kann in beliebiger Reihenfolge erfolgen und mit einem oder mehreren abgrenzenden Zeichen versehen sein, sofern dies konsistent ist. Angenommen, die Eingabe ist korrekt, ist keine Fehlerbehandlung erforderlich.

Die Namen der Pokeballs, die Sie unterstützen müssen, und ihre Fangmultiplikatoren sind hier aufgelistet:

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

Sie können davon ausgehen, dass das Ziel schläft und 1 HP hat. Das erwartete Ausgabeformat lautet wie folgt:

(First check failed)
(no output)

(Second check failed)
*shake*

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

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

(Das ist kein Tippfehler, Ihr Programm sollte niemals nur zwei Shakes ausgeben.)

Das ist , also ist Ihre Punktzahl die Byteanzahl des Quellcodes Ihres Programms. Die niedrigste Punktzahl gewinnt.

Boni!

Ich sagte, dass Sie annehmen können, dass das pokemon bei 1 HP ist und schläft. Alternativ können Sie dem Benutzer erlauben, die aktuellen HP und des Pokemons einzugeben bonus_status. Die aktuelle HP des Pokemons ist immer eine ganze Zahl, die kleiner oder gleich der maximalen HP ist, und beträgt bonus_statusimmer entweder 2,5, 1,5 oder 1. Wenn Sie dies tun, müssen Sie diese Werte am Ende Ihrer Eingabe haben und standardmäßig 1 und 2.5 wenn sie nicht geliefert werden. Sie können 15 Punkte von Ihrer Punktzahl abziehen, um einen dieser Punkte umzusetzen, oder 25 Punkte für beide.

Darüber hinaus können Sie kritische Erfassungen implementieren. Bei einer kritischen Erfassung wird nur ein Schütteltest durchgeführt. Wenn dies fehlschlägt, wird das Programm automatisch beendet. Wenn bestanden, gibt es Folgendes aus:

*shake*
Click!

Kritische Fänge werden häufiger, wenn der Spieler mehr Pokémon sammelt. Der Einfachheit halber können wir jedoch davon ausgehen, dass sie bereits "alle gefangen" haben. Wenn eine zufällig generierte Zahl zwischen 0 und 2047 kleiner ist als a(das Ergebnis der ersten Berechnung) multipliziert mit 2,5, ist dies eine kritische Erfassung. Durch die Unterstützung kritischer Erfassungen können Sie 25 Punkte aus Ihrer Punktzahl entfernen .

Es gibt eine Reihe anderer Pokeballs, die Sie möglicherweise unterstützen. Ihre Namen und Fangmultiplikatoren sind hier aufgelistet:

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

Für jeden dieser Bälle, für den Sie Unterstützung hinzufügen, können Sie (5 + die Länge des Ballnamens) von Ihrer Punktzahl abziehen .

Wenn Sie für einen Kick alle diese Boni (aktuelle HP und Bonus_status von stdin, kritische Eroberungen und alle 10 optionalen Bälle) erreichen, erhalten Sie eine zusätzliche Belohnung von 7 Punkten, die von Ihrer Punktzahl entfernt wurden, für einen geraden Gesamtbonus von 150 .

Beispiel Eingabe / Ausgabe

Nur um sicherzustellen, dass wir alle auf einer Seite sind.

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

Viel Glück und viel Spaß beim Golfen!

untergrundbahn
quelle
Ich kann derzeit nicht beurteilen, wie hoch die Wahrscheinlichkeit ist, die Sie geben 65536 / (255 / a)^(1/4)können, aber mein Mut sagt, dass sie größer als 1 ist. Prüfen Sie mit einer Zufallszahl im Bereich von 0 bis 65536? Ist die Prüfung erfolgreich, wenn die Zufallszahl größer oder kleiner ist?
TheConstructor
Wenn 65536 / (255 / a)^(1/4)größer als 1, ist die Prüfung automatisch erfolgreich. Ich bin mir nicht sicher, was du mit der zweiten Frage meinst.
Undergroundmonorail
So rnd < pMittel ist die Prüfung erfolgreich mit rndin Bereich von 0 und 1
TheConstructor
1
@ IsmaelMiguel siehe meine Kommentare: Sie generieren eine Zufallszahl im Bereich von 0 bis 1 und vergleichen es mit 65536 / (255 / a)^(1/4), dann, wenn die Zufallszahl kleiner ist, der Shake-Test erfolgreich
TheConstructor
1
Als Status im Text sind der Texttyp des Pokeballs, die maximale Leistung und die Fangrate als Eingabe in Ihr Programm übergangen. Optional können Sie nach aktueller HP (Standard 1) oder
Statusbonus

Antworten:

3

J 301-150 = 151

Für den Sport sind alle Boni implementiert, obwohl ich wahrscheinlich besser dran wäre, nicht zu :). Ich habe die Dinge im Folgenden kurz erklärt, aber diese ist viel zu lang, um sie im Detail zu erklären, es sei denn, jemand fordert dies ausdrücklich an. Es implementiert alle Bälle, kritischen Erfassungen und optionalen Eingaben.

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

Hier die Golfversion

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
quelle
6

PYTHON 249 Bytes - 75 für Boni = 174

Mein erster Versuch überhaupt Golf zu spielen.

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 für die Aufnahme ausgewählter Bälle: Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick

Gib mir 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 Bonuspunkte

[edit] Runden Sie jedes Mal auf 12 Bruchbits ab, wenn Division verwendet wird, indem Sie sie nicht verwenden

[edit2] Pokeball-Wörterbuch optimieren

Þorsteinn
quelle
Ich denke, Sie verwenden eine Präzision höher als 1/4096 (Fragestatus Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Sie haben wahrscheinlich Recht, ich habe diesen Teil nicht ganz verstanden und die anderen Antworten schienen genauso zu sein wie ich. Ich denke, ich muss so etwas tun: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)um alle Abteilungen auszuschließen?
Þorsteinn
1/4096 bedeutet 12 Bruchbits. Schauen Sie sich meine Lösung an. Ein direkterer Ansatz wäre floor(x*4096)*4096genauso, als würden Sie zB auf Dezimalstellen abrunden.
TheConstructor
Ohh ich verstehe, danke. Dies sollte wahrscheinlich auch für die Multiplikation gelten, wie Sie es anscheinend getan haben, aber da dies in den Regeln nicht angegeben ist, werde ich mir darüber keine Sorgen machen. :)
Þorsteinn
Ja, wahrscheinlich verwenden sie Festkommaarithmetik. Aber OP hat nur gebeten, Teilung zu runden.
TheConstructor
6

Perl 1 (374 - 150 = 224 + fehlende 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();

Argumentliste:

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

Ja, ich bin mir bewusst, dass dies völlig gegen die Regeln verstößt, aber es ist mir egal. Falls Sie es nicht bemerkt haben, ist dies der Erfassungsalgorithmus der ersten Pokémon-Generation mit all seinen Macken (Great Balls sind unter bestimmten Bedingungen besser als Ultra Balls). Dies implementiert alle Funktionen, einschließlich derer, die nicht enthalten sind (und ich habe mich trotzdem entschieden, Punkte für sie aufzunehmen). Kritische Erfassungen werden ignoriert (aber implementiert - nur, dass sie sich nicht auf die Erfassungsrate auswirken). Neuere Poké Balls laden Daten anderer Poké Balls.

Beachten Sie, dass diese Antwort zwar kurz ist, aber alle Regeln verletzt. Betrachten Sie sie daher nur als unterhaltsame Antwort, akzeptieren Sie sie nicht. Ursprünglich wollte ich den Gen5-Algorithmus in Perl 5 implementieren, aber ich entschied mich - warum nicht etwas Spaß haben. Und ja, ich habe Perl 1 kompiliert und dieser Code funktioniert. Wenn Sie es in einer neueren Version von Perl ausführen, erhalten Sie möglicherweise Warnungen über die veraltete Verwendung von. Seien wir dojedoch ehrlich: Es ist die einzige Möglichkeit, Funktionen in Perl 1 auszuführen. Perl 1 hat auch einige Eigenheiten (zum Beispiel kann ich das nicht verschiebe die Zeile beginnend mit /M/der vorherigen - warum? - Ich weiß nicht).

Außerdem gibt es in Perl 1 keine Zufallszahlen, also hoffen Sie, dass Sie mich nicht für modulo von töten $$. Das kommt der Zufallszahl, die ich hätte finden können, am nächsten.

Bearbeiten: Es scheint, dass die alte do call()Syntax in Perl 5.19.8 entfernt wurde. Stellen Sie sicher, dass Sie eine ältere Version von Perl verwenden, um dieses Skript auszuführen, da Perl 5.20 anscheinend nicht mit Perl 1-Skripten kompatibel ist.

Konrad Borowski
quelle
5

PHP (746 763 Bytes (alle Boni):

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

Um dies zu nutzen, müssen Sie den Eingang 'ball = poke & status = sleep' bei STDIN angeben.

Die HP muss als "hp [max]" oder "hp [current]" angegeben werden.

Dieser Code funktioniert wie hier getestet .

Sie können den Status anhand seines Namens oder des Multiplikators angeben. ( in der Frage nicht erforderlich ).

Hier ist eine lesbare Version:

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

Ich musste dies bearbeiten, weil ich eine viel höhere Präzision als die erforderliche verwendete.

Das Update wurde von TheConstructor bereitgestellt .

Ismael Miguel
quelle
Ich glaube , Sie werden mit einem precission höher als 1/4096 (Frage Staaten Hinweis: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Und du hast recht. Mir ist aufgefallen, dass ich den Wert verwende, der von der Division kommt. Wenn Sie möchten, können Sie mir helfen, da ich keine Ahnung habe, wie ich in PHP auf eine kleinere Genauigkeit 'runden' kann.
Ismael Miguel
Sie können die floor(x*4096)/4096Festkommadivision wie ich durchführen oder implementieren.
TheConstructor
Danke für deine Hilfe. Daran würde ich nie denken. Ich habe meine Antwort korrigiert.
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":""):""):"");}}

Ergebnis:

  • 729 Bytes
  • -93 alle Bälle
  • -25 optional current_hp und bonus_state

=> 611

Das Programm verwendet Festkomma-Arithmetik mit 12 Bruchbits ( 1/4096ist der Wert des am weitesten rechts stehenden Bits). Da Java normalerweise kein Festkomma verwendet, gibt es einige Verschiebungen im Code, um die erwarteten Ergebnisse zu erzielen. In der Langversion finden Sie die verwendeten arithmetischen Funktionen, die für Golfzwecke verwendet wurden.

Während die meisten Berechnungen mit intWerten hätten durchgeführt werden können, funktionieren Divisionen mit longs besser, da Sie den Dividenden um weitere 12 Bit nach links verschieben müssen, um die gewünschte Genauigkeit beizubehalten (andernfalls verlieren Sie alle Bruchbits).

Beispieleingabe ( ;wird nur benötigt, wenn interaktiv ausgeführt, dh STDIN hat kein EOF erhalten): Ball, catch_rate, max_hp

Poke 15 255 ;

Beispielausgabe:

*shake*

Beispiel Eingabe: Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Beispielausgabe:

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

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

342 - 25 (Parameter) - 75 (12 Bälle) = 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]

Erwartet Eingabe HP_max,Rate,Ball[,HP_current[,status]]. Unterstützt nicht Moonoder LoveBälle.

Dies ist das erste Mal, dass ich Golf gespielt habe, das ist kein Regex, daher gibt es wahrscheinlich Raum für Verbesserungen. Ich habe die Idee, nur teilweise Ballnamen zu speichern, schamlos kopiert. ;) Die anderen beiden Bälle zu unterstützen lohnt sich einfach nicht, auch nicht mit den zusätzlichen +7 , um alle Boni zu bekommen.

Ungolfed-Version

Diese Version lässt alle kurzen Aliase aus, die ich zu Beginn definiere, definiert aber die Suche nach Bällen separat.

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]

Anmerkung zur Wahrscheinlichkeitsformel: Ich habe die vollständige Formel (mit ausgeschriebener Formel a) neu angeordnet, sodass es keine Unterteilungen gibt, und ich berechne, (...)^(1/4)indem ich die Quadratwurzel zweimal nehme.

Martin Ender
quelle
1
Sieht so aus, als ob die Priorität auf Ihrer Seite liegt. Oo p-=p%1/4096scheint wirklich zu funktionieren. (Hätte gedacht, Sie müssten zumindest schreiben p-=p%(1/4096)und dann wäre ich immer noch nicht sicher, ob der Modul für Brüche auf beiden Seiten implementiert ist. Schön!
TheConstructor
@TheConstructor Haha, ja, ich musste das tatsächlich überprüfen ... es sah für mich auch sehr seltsam aus, %kann aber für einige lustige Dinge in JS verwendet werden. Nach dem erneuten Lesen der Frage, denke ich, erfüllt diese Antwort die Rundungsanforderung jedoch nicht ganz. Ich denke, nach jeder Division sollte eine Rundung angewendet werden . Möglicherweise muss ich meine Berechnung ein wenig umstrukturieren. ^^
Martin Ender
Ja, wahrscheinlich immer noch eine gute Idee
TheConstructor
@TheConstructor Eigentlich muss ich schreiben p%(1/4096). Ich habe das sogar vor dem Posten überprüft, mich aber irgendwie an das Ergebnis meines Tests erinnert.
Martin Ender
Versucht in Chrome; ohne () gearbeitet, aber vielleicht nicht immer oder nicht in allen Browsern ...
TheConstructor
0

Update: (C #)

Byteanzahl: 3.600

Kritisch: -25

Alle Poke-Balls: -91


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

[regulär]

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
quelle
Das ist Code-Golf. Sie sollten Ihre Antwort reduzieren (z. B. Leerzeichen entfernen). Sie können die aktuelle Antwort weiterhin als lesbare Version bereitstellen.
Ismael Miguel