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:

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 código de golf , 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!
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.
rnd < psignifica que la verificación es exitosa con un rndrango de 0 y 1.
65536 / (255 / a)^(1/4), luego, si el número aleatorio es menor, la prueba de agitación tuvo éxito
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?