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_max
es igual al HP máximo del Pokémon objetivo. HP_current
es igual al HP actual del Pokémon objetivo. rate
es la tasa de captura del pokemon, bonus_ball
es el multiplicador de la pokebola lanzada y bonus_status
es 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_status
siempre 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)
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?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 < p
significa que la verificación es exitosa con unrnd
rango de 0 y 1.65536 / (255 / a)^(1/4)
, luego, si el número aleatorio es menor, la prueba de agitación tuvo éxitoRespuestas:
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.
Aquí la versión de golf
fuente
PYTHON 249 bytes - 75 para bonos = 174
Mi primer intento de golf.
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
fuente
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)
excluir todas las divisiones?floor(x*4096)*4096
igual que redondearía a, por ejemplo, lugares decimales.Perl 1 (374-150 = 224 + bytes faltantes)
Lista de argumentos:
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.fuente
PHP (
746763 bytes - todos los bonos):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:
Tuve que editar esto porque estaba usando una precisión mucho mayor que la requerida.
La solución fue proporcionada por TheConstructor .
fuente
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
o implementar una división de punto fijo como lo hice yo.Java, 611
Puntuación:
=> 611
El programa utiliza aritmética de punto fijo con 12 bits de fracción (
1/4096
es 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
int
valores, las divisiones funcionan mejor conlong
s, 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_hpSalida de muestra:
Entrada de muestra: Ball, catch_rate, max_hp, current_hp, bonus_state
Salida de muestra:
fuente
CoffeeScript -
317313310307306294270250242 bytes342-25 (parámetros) - 75 (12 bolas) = 242
Espera entrada
HP_max,Rate,Ball[,HP_current[,status]]
. No soportaMoon
niLove
pelotas.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.
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.fuente
p-=p%1/4096
realmente parece funcionar. (Habría adivinado que al menos necesitaría escribirp-=p%(1/4096)
y aún así no estaría seguro de que el módulo se implementa para fracciones en ambos lados. ¡%
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. ^^p%(1/4096)
. Incluso verifiqué esto antes de publicar, pero de alguna manera recordé mal el resultado de mi prueba.Actualización: (C #)
Conteo de bytes: 3,600
Crítico: -25
Todas las bolas de empuje: -91
Total = 3,484
[golfizado]
[regular]
fuente