Pokeball Simulator

26

En los videojuegos de Pokemon, el jugador es enviado al mundo para forzar a los animales salvajes a formar pequeñas bolas y entrenarlos para pelear. Por supuesto, todos saben que nadie juega Pokemon para la batalla. ¡El verdadero atractivo de la serie es que el Pokémon se está atrapando! Su trabajo es simular la pokebola durante un intento de captura. Este desafío utilizará la fórmula de captura de la generación V, que es la siguiente:

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

HP_maxes igual al HP máximo del Pokémon objetivo. HP_currentes igual al HP actual del Pokémon objetivo. ratees la tasa de captura del pokemon, bonus_balles el multiplicador de la pokebola lanzada y bonus_statuses 2.5 si el pokemon objetivo está dormido o congelado, 1.5 si el pokemon objetivo está paralizado, envenenado o quemado, y 1 en caso contrario.

Después de encontrar a, debe realizar hasta tres "controles de sacudidas". La probabilidad de que un chequeo de batido tenga éxito es 65536 / (255 / a)^(1/4). Si alguno de estos controles falla, el pokemon escapa de su bola. Si las tres verificaciones son exitosas, ¡el pokemon es atrapado!

Nota: Cada vez que se realiza una división, el resultado se redondea a un múltiplo de 1/4096. Esto generalmente es un detalle insignificante, pero debe tenerse en cuenta en su programa.

Su desafío es escribir un programa que ejecute los cheques de sacudidas e imprima para mostrar el estado de los cheques. En stdin, su programa recibirá (al menos, los detalles a continuación) el HP máximo del pokemon, la tasa de captura del pokemon objetivo y el nombre de la pokeball. El HP máximo y la tasa de captura están garantizados como enteros, mientras que el nombre de la pokebola siempre es una cadena. Esta entrada puede venir en cualquier orden y con cualquier carácter delimitador (es) conveniente para usted, siempre y cuando sea consistente. Suponga que la entrada es correcta, no se requiere manejo de errores.

Los nombres de las pokebolas que debes apoyar y sus multiplicadores de captura se enumeran aquí:

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

Puede suponer que el objetivo está dormido y con 1 HP. El formato esperado para la salida es este:

(First check failed)
(no output)

(Second check failed)
*shake*

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

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

(Eso no es un error tipográfico, su programa nunca debería generar solo dos batidos).

Este es el , por lo que su puntaje es el recuento de bytes del código fuente de su programa. La puntuación más baja gana.

Bonos!

He dicho que puede asumir el pokemon es a 1 HP y dormido. Alternativamente, puede permitir que el usuario ingrese el HP y el HP actual del pokemon bonus_status. El HP actual del Pokémon siempre será un número entero igual o menor que su HP máximo, y bonus_statussiempre será 2.5, 1.5 o 1. Si lo hace, debe tener estos valores al final de su entrada, y por defecto a 1 y 2.5 si no se suministran. Puede restar 15 puntos de su puntaje por implementar uno de estos, o 25 por ambos.

Además, puede implementar capturas críticas. Si se produce una captura crítica, solo se realiza una prueba de agitación. Si falla, el programa sale silenciosamente. Si se aprueba, genera:

*shake*
Click!

Las capturas críticas se vuelven más comunes a medida que el jugador recolecta más pokemon, pero por simplicidad podemos suponer que ya los "atraparon a todos". Si un número generado aleatoriamente entre 0 y 2047 es menor que a(el resultado del primer cálculo) multiplicado por 2.5, es una captura crítica. El soporte para capturas críticas le permite eliminar 25 puntos de su puntaje.

Hay una serie de otras pokebolas que puedes elegir apoyar. Sus nombres y multiplicadores de captura se enumeran aquí:

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

Para cada una de estas bolas para las que agrega soporte, puede restar (5 + la longitud del nombre de la bola) de su puntaje.

Finalmente, para patadas, lograr todas estas bonificaciones (HP actual y bonus_status de stdin, capturas críticas y las 10 bolas opcionales) le otorgará una recompensa adicional de 7 puntos eliminados de su puntaje, para un bono total de incluso 150 .

Ejemplo de entrada / salida

Solo para asegurarnos de que todos estamos en la misma página.

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

¡Buena suerte y feliz golf!

metro subterráneo
fuente
Actualmente no puedo juzgar qué tan grande es la probabilidad que das, 65536 / (255 / a)^(1/4)pero mis agallas dicen que es mayor que 1. ¿Compruebas con un número aleatorio en el rango de 0 a 65536? ¿El cheque tiene éxito si el número aleatorio es mayor o si es menor?
TheConstructor
Si 65536 / (255 / a)^(1/4)es mayor que 1, la verificación se realiza automáticamente. No estoy seguro de qué quieres decir con la segunda pregunta.
undergroundmonorail
Esto rnd < psignifica que la verificación es exitosa con un rndrango de 0 y 1.
TheConstructor
1
@IsmaelMiguel vea mis comentarios: genera un número aleatorio en el rango de 0 a 1 y lo compara con 65536 / (255 / a)^(1/4), luego, si el número aleatorio es menor, la prueba de agitación tuvo éxito
TheConstructor
1
Como se indica en el texto, el tipo textual de pokebola, el máximo de HP y la tasa de captura han pasado como entrada a su programa. Opcionalmente, puede solicitar HP actual (predeterminado 1) o bonificación de estado (predeterminado 2.5)
TheConstructor

Respuestas:

3

J 301-150 = 151

Para los deportes, se implementaron todos los bonos, aunque probablemente sería mejor no :). Brevemente expliqué las cosas a continuación, pero esta es demasiado larga para explicarla en detalle, a menos que alguien lo solicite explícitamente. Implementa todas las bolas, capturas críticas y entradas opcionales.

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

Aquí la versión de golf

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

PYTHON 249 bytes - 75 para bonos = 174

Mi primer intento de golf.

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

Bonificación por incluir bolas seleccionadas: Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick

Dándome 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 puntos de bonificación

[editar] Redondear a 12 bits fraccionales cada vez que se usa la división al no usarla

[edit2] optimizar el diccionario pokeball

Þorsteinn
fuente
Creo que está utilizando una precisión superior a 1/4096 (estados de pregunta Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Probablemente tengas razón, no entendí esa parte y las otras respuestas parecían hacerlo de la misma manera que yo. Supongo que necesito hacer algo como esto: ¿ r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)excluir todas las divisiones?
Þorsteinn
1/4096 significa 12 bits fraccionarios. Echa un vistazo a mi solución; un enfoque más directo sería floor(x*4096)*4096igual que redondearía a, por ejemplo, lugares decimales.
TheConstructor
Ohh ya veo, gracias. Es probable que esto también se aplique a la multiplicación como parece haberlo hecho, pero dado que eso no está establecido en las reglas, no me voy a preocupar por eso. :)
Þorsteinn
Sí, probablemente usan aritmética de punto fijo. Pero OP solo pidió redondear la división.
TheConstructor
6

Perl 1 (374-150 = 224 + bytes faltantes)

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 de argumentos:

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

Sí, soy consciente de que esto rompe completamente las reglas, pero no me importa. En caso de que no lo hayas notado, este es el primer algoritmo de captura de la generación Pokémon, con todas sus peculiaridades (Great Balls es mejor que Ultra Balls, en ciertas condiciones). Esto implementa todas las características, incluidas las que no están incluidas (y decidí incluir puntos para ellas de todos modos). Las capturas críticas se ignoran (pero se implementan, solo que no afectan la velocidad de captura), las Poké Balls más nuevas cargan datos de otras Poké Balls.

Tenga en cuenta que si bien esta respuesta es breve, rompe todas las reglas, así que considérela como una respuesta divertida, no la acepte. Inicialmente iba a implementar el algoritmo Gen5 en Perl 5, pero decidí: ¿por qué no divertirme un poco? Y sí, en realidad compilé Perl 1, y este código funciona. Si lo ejecuta en una versión más reciente de Perl, puede recibir advertencias sobre el uso desaprobado do, pero seamos honestos: es la única forma de ejecutar funciones en Perl 1. Perl 1 también tiene algunas peculiaridades por sí mismo (por ejemplo, no puedo mueve la línea que comienza con la /M/línea anterior, ¿por qué? No lo sé).

Además, no hay números aleatorios en Perl 1, así que espero que no me mates por módulo de $$. Es lo más parecido al número aleatorio que pude haber encontrado.

Editar: Parece que la do call()sintaxis anterior se eliminó en Perl 5.19.8. Asegúrese de utilizar una versión anterior de Perl para ejecutar este script, ya que parece que Perl 5.20 no será compatible con los scripts de Perl 1.

Konrad Borowski
fuente
5

PHP (746 763 bytes - todos los bonos):

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

Para usar esto, debe proporcionar la entrada como 'ball = poke & status = sleep' en STDIN.

El HP debe proporcionarse como 'hp [max]' o 'hp [current]'.

Este código funciona, como se prueba aquí .

Puede proporcionar el estado por su nombre o el multiplicador. ( no requerido en la pregunta ).

Aquí hay una versión legible:

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

Tuve que editar esto porque estaba usando una precisión mucho mayor que la requerida.

La solución fue proporcionada por TheConstructor .

Ismael Miguel
fuente
Creo que se está utilizando una precision superior a 1/4096 (estados de interrogación Nota: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Y tienes razón. Noté que estoy usando cualquier valor que provenga de la división. Si quieres, puedes ayudarme porque no tengo ni idea de cómo 'redondear' a una precisión menor en PHP.
Ismael Miguel
Puedes hacer floor(x*4096)/4096o implementar una división de punto fijo como lo hice yo.
TheConstructor
Gracias por tu ayuda. Nunca pensaría en eso. He arreglado mi respuesta.
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":""):""):"");}}

Puntuación:

  • 729 bytes
  • -93 todas las bolas
  • -25 opcional current_hp y bonus_state

=> 611

El programa utiliza aritmética de punto fijo con 12 bits de fracción ( 1/4096es el valor del bit más a la derecha). Como Java no suele usar el punto fijo, hay bastantes cambios dentro del código para lograr los resultados esperados. Vea la versión larga para las funciones aritméticas utilizadas, que se han incluido en línea para jugar al golf.

Si bien la mayoría de los cálculos podrían haberse realizado sobre intvalores, las divisiones funcionan mejor con longs, ya que necesita cambiar el dividendo por otros 12 bits a la izquierda para mantener la precisión deseada (de lo contrario, perderá todos los bits de fracción).

Entrada de muestra ( ;solo se requiere si se ejecuta de forma interactiva, es decir, STDIN no ha recibido EOF): Ball, catch_rate, max_hp

Poke 15 255 ;

Salida de muestra:

*shake*

Entrada de muestra: Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Salida de muestra:

*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);
    }
}
El constructor
fuente
1

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

342-25 (parámetros) - 75 (12 bolas) = 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]

Espera entrada HP_max,Rate,Ball[,HP_current[,status]]. No soporta Moonni Lovepelotas.

Esto es lo primero que he jugado al golf que no es una expresión regular, por lo que probablemente haya margen de mejora. Copié descaradamente la idea de almacenar solo nombres de bolas parciales. ;) Apoyar las otras dos bolas simplemente no vale la pena, ni siquiera con el +7 adicional para obtener todas las bonificaciones.

Versión sin golf

Esta versión omite todos los alias cortos que defino al principio, pero define la búsqueda de bolas por separado.

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]

Una nota sobre la fórmula de probabilidad: he reorganizado la fórmula completa (con la escrita a) para que no haya divisiones, y estoy calculando (...)^(1/4)sacando la raíz cuadrada dos veces.

Martin Ender
fuente
1
Parece que la precedencia está de tu lado Oo p-=p%1/4096realmente parece funcionar. (Habría adivinado que al menos necesitaría escribir p-=p%(1/4096)y aún así no estaría seguro de que el módulo se implementa para fracciones en ambos lados. ¡
Genial
@TheConstructor Jaja, sí, en realidad tuve que comprobar eso ... también me pareció realmente extraño, pero %puede usarse para algunas cosas divertidas en JS. Después de releer la pregunta, creo que esta respuesta no cumple con el requisito de redondeo. Creo que el redondeo debe aplicarse después de cada división. Puede que tenga que reestructurar un poco mi cálculo. ^^
Martin Ender
Sí, probablemente todavía sea una buena idea
TheConstructor
@ TheConstructor En realidad, necesito escribir p%(1/4096). Incluso verifiqué esto antes de publicar, pero de alguna manera recordé mal el resultado de mi prueba.
Martin Ender
Probado en Chrome; funcionó sin () pero quizás no siempre o no en todos los navegadores ...
TheConstructor
0

Actualización: (C #)

Conteo de bytes: 3,600

Crítico: -25

Todas las bolas de empuje: -91


Total = 3,484

[golfizado]

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

[regular]

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
fuente
Este es el código de golf. Debería reducir su respuesta (por ejemplo, eliminar espacios en blanco). Aún puede proporcionar la respuesta actual como una versión legible.
Ismael Miguel