Cada jugador tiene un número. ¿Puede el tuyo ser el más alejado de todos?
Requisitos
Escriba una función Java, Python 2 o Ruby llamada choose()
que acepte tres argumentos:
- un número entero: el número de rondas ya completadas
- un número entero: el número de jugadores
- una serie de cadenas: los resultados de cada ronda anterior
- cada cadena es una lista de enteros separados por espacios, ordenados de menor a mayor
Por ejemplo, choose(2, 4, ["4 93 93 174", "1 84 234 555"])
significa:
- ya había dos rondas (esta es la tercera ronda)
- hay un total de cuatro jugadores
- en la primera ronda, los números elegidos fueron 4, 93, 93, 174
- en la segunda ronda, los números elegidos fueron 1, 84, 234, 555
Debe devolver un número entero del 1 al 999 (inclusive).
Para cada otro jugador, su puntaje es la raíz cuadrada de la distancia entre su número y el de ellos. Su puntaje para la ronda es el total de todos estos puntajes.
Se jugarán 100 rondas. ¡El puntaje total más alto gana!
Reglas
- Su código no puede usar ninguna E / S, incluida la consola, los archivos, la red, etc.
- No puede interferir con el programa de control ni con ningún otro jugador.
- Los programas que parecen violar las reglas anteriores serán excluidos.
- Cada llamada de una función debería tomar menos de cinco segundos en mi computadora (Intel Core i5 2450M con 8GB de RAM).
- Si un programa arroja una excepción o devuelve un valor no válido, se tratará como si devolviera 1.
- Cada usuario puede enviar como máximo un programa.
Diverso
- El programa de control está en GitHub .
- Hay tres jugadores incorporados. Se pueden encontrar en esta respuesta .
- El ganador será elegido el 28 de enero.
Tabla de clasificación
El ganador es Conservador .
Mención de honor a Gustav , el jugador con el puntaje más alto con una estrategia no constante.
- Conservador - 36226
- Alto - 36115
- FloorHugger - 35880
- NumberOne - 35791
- Sobreestimador - 35791
- Gustav - 35484
- Historiador - 35201
- Muestreador - 34960
- Incrementador - 34351
- JumpRightIn - 34074
- Vickrey - 34020
- Adolescente - 33907
- Randu - 33891
- Levantador de pesas - 33682
- Intermediario - 33647
- BounceInwards - 33529
- Desagradable matemático - 33292
- Puente - 33244
- Copycat - 33049
Los resultados completos se pueden encontrar aquí . (Recomiendo deshabilitar el ajuste de texto).
king-of-the-hill
Ypnypn
fuente
fuente
Respuestas:
Python, conservador
Como cada excepción arroja 1, se mantiene lo más alejado posible. Hace su fortuna a expensas de los débiles.
Dato curioso: pensé en mejorarlo, pero no pude encontrar una mejor manera que solo esconderme en un rincón.
fuente
Número uno, Java
El nombre lo explica completamente.
fuente
Python, AncientHistorian
Cree firmemente que el futuro será exactamente como el pasado, pero cree que la última ronda es demasiado reciente para ser histórica, por lo que solo recorre 1 - 999 y elige lo que hubiera sido lo mejor que las rondas anteriores a excepción de la última. Las primeras 2 rondas devuelven 500.
fuente
Python, Vickrey
Hace una lista de números que se han jugado a menudo, supone que todos los demás jugarán de manera óptima y opta por la segunda mejor opción dada la lista.
Por ejemplo, si los números más comunes son
[1, 990, 999]
, entonces Vickrey inserta la jugada óptima 200 para dar[1, 200, 990, 999]
, luego elige la mejor opción para la nueva matriz (que es 556).fuente
Java, sobreestimador
Como su nombre lo indica, este programa asume que todos los demás programas intentarán jugar "bien" eligiendo la mejor respuesta basada en la última ronda, por lo que este "sobreestimador" siempre elige la peor posición posible en función de la ronda anterior.
fuente
Java - levantador de pesas
Recorre 1-999 para descubrir cuál sería el mejor para cada ronda. Los pesa de acuerdo con lo reciente (las rondas recientes tienen más peso) y devuelve su mejor estimación general. Con suerte, si los patrones se forman en una ronda posterior, esto podrá detectarlo.
Editar: ¡Ahora con + Inf% más recursividad! No poder almacenar / guardar / ver lo que elegiste en rondas anteriores es un lastre. Tener en cuenta sus propios aportes lo arruina cuando intenta averiguar qué van a hacer los demás . ¡Entonces, calculemoslo! Esto ahora se repetirá para descubrir qué eligió en la ronda anterior e ignorarlo al calcular el próximo movimiento.
Tenga en cuenta que sólo realmente ignora su propia entrada desde la última vez, pero desde que uno se pondera el más alto, parece que funciona bien. Esto podría solucionarse con un poco más de trabajo, pero esperaré a que la tabla de clasificación vea si es necesario.
fuente
Rubí, imitador
Simplemente devuelve el número ganado la última vez.
fuente
Ruby, JumpRightIn
Es probablemente la estrategia más directa. Encuentra la brecha más grande en la última ronda y elige el número justo en el medio de esa brecha.
fuente
Gustav (Python 2)
Esta es una metaestrategia bastante directa, copiada descaradamente de una de mis viejas respuestas en un desafío KotH similar. Considera algunas estrategias simples, observa cómo se habrían desempeñado en todas las rondas anteriores y luego sigue la puntuación más alta para la próxima ronda.
Ahora me doy cuenta de que el algoritmo todavía tiene algunos defectos. Por ejemplo, podría seguir "persiguiéndose a sí mismo" porque no distingue sus propios movimientos de los de los oponentes. Sin embargo, lo dejaré así por ahora.
fuente
Python, Randu
Números seleccionados por el generador de números aleatorios más mal concebido de la historia .
fuente
Los siguientes tres programas están integrados.
Alto (rubí)
Incrementador (Java)
FloorHugger (Python)
fuente
Python, Sampler
De una lista de lugares, elija el que esté más alejado de los números usados recientemente, ignorando el turno anterior.
fuente
Java, BounceInwards
Comenzando en 1, gradualmente se acerca a 500 mientras rebota entre la opción más alta y más baja.
fuente
NastyMathematician (Java)
Examina las dos últimas rondas (si los mejores números fueron 70 y 80, arrojará 90). Es desagradable porque trata de obtener el mayor número posible para ganar contra sus oponentes.
fuente
Python: no quiero pensar en un nombre ...
Si el promedio de los números elegidos en las rondas anteriores es inferior a 500, elige 999. De lo contrario, elige 1.
fuente
Python, Middleman (basado en el conservador de @clabacchio)
Después de notar que el borde superior tiene un puntaje alto (y superó al borde inferior), me pregunté si podría haber algo peor que quedar atrapado en el medio.
fuente
Saltador (Ruby)
Alterna entre la parte inferior, media y superior. (5,500,995)
fuente