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:
HP_max
entspricht den maximalen HP des Zielpokemons. HP_current
ist gleich den aktuellen HP des Zielpokemons. rate
ist die Fangrate des Pokémons, bonus_ball
ist der Multiplikator des geworfenen Pokéballs und bonus_status
ist 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 a
mü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 Code-Golf , 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_status
immer 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!
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?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.rnd < p
Mittel ist die Prüfung erfolgreich mitrnd
in Bereich von 0 und 165536 / (255 / a)^(1/4)
, dann, wenn die Zufallszahl kleiner ist, der Shake-Test erfolgreichAntworten:
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.
Hier die Golfversion
quelle
PYTHON 249 Bytes - 75 für Boni = 174
Mein erster Versuch überhaupt Golf zu spielen.
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
quelle
Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)
um alle Abteilungen auszuschließen?floor(x*4096)*4096
genauso, als würden Sie zB auf Dezimalstellen abrunden.Perl 1 (374 - 150 = 224 + fehlende Bytes)
Argumentliste:
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
do
jedoch 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.quelle
PHP (
746763 Bytes (alle Boni):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:
Ich musste dies bearbeiten, weil ich eine viel höhere Präzision als die erforderliche verwendete.
Das Update wurde von TheConstructor bereitgestellt .
quelle
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
Festkommadivision wie ich durchführen oder implementieren.Java, 611
Ergebnis:
=> 611
Das Programm verwendet Festkomma-Arithmetik mit 12 Bruchbits (
1/4096
ist 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
int
Werten hätten durchgeführt werden können, funktionieren Divisionen mitlong
s 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_hpBeispielausgabe:
Beispiel Eingabe: Ball, catch_rate, max_hp, current_hp, bonus_state
Beispielausgabe:
quelle
CoffeeScript -
317313310307306294270250242 Byte342 - 25 (Parameter) - 75 (12 Bälle) = 242
Erwartet Eingabe
HP_max,Rate,Ball[,HP_current[,status]]
. Unterstützt nichtMoon
oderLove
Bä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.
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.quelle
p-=p%1/4096
scheint wirklich zu funktionieren. (Hätte gedacht, Sie müssten zumindest schreibenp-=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!%
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. ^^p%(1/4096)
. Ich habe das sogar vor dem Posten überprüft, mich aber irgendwie an das Ergebnis meines Tests erinnert.Update: (C #)
Byteanzahl: 3.600
Kritisch: -25
Alle Poke-Balls: -91
Gesamt = 3.484
[Golf]
[regulär]
quelle