Me encontré con este problema mientras trabajaba en otro desafío que estoy haciendo para este sitio. En ese desafío utilizo " Mario Kart 8 Scoring ". La cantidad de puntos que obtiene el jugador en el puesto número k está representada por esta matriz de 1 índice: [15,12,10,9,8,7,6,5,4,3,2,1]. Entonces, el primer lugar obtiene 15 puntos, el segundo lugar obtiene 12 puntos, etc.
Es bastante fácil asignar puntos como este, sin embargo, la parte difícil viene con cómo manejo los lazos. Lo que hago es dar a cada jugador empatador el promedio de los puntos dados para cada lugar de empate. Por ejemplo, si solo el 1 ° y el 2 ° empate, ambos jugadores obtienen (15 + 12) / 2 = 13.5 puntos. (Nota: se le permite redondear al int más cercano, por lo que 13 o 14 también son aceptables). Luego, del 3 ° al 12 ° lugar obtenga la cantidad normal de puntos para su posición.
Desafío
Dados 12 puntajes enteros no negativos que se ordenan de manera decreciente, genera el número de puntos que obtiene cada jugador. También puede tomar la lista de puntos [15,12,10,9, ...] como entrada. Tenga en cuenta que la cantidad de puntos que obtiene cada jugador no depende de los valores reales de los puntajes, sino de cómo se comparan con los otros puntajes.
Casos de prueba
- [21,21,15,14,12,9,6,5,4,3,2,1] => [ 14,14 , 10,9,8,7,6,5,4,3,2, 1]
- [20,15,15,15,10,9,8,7,6,5,4,3] => [15, 10,10,10 , 8,7,6,5,4,3,2, 1]
- explicación: (12 + 10 + 9) / 3 = 10.3333
- [1,1,1,1,1,1,1,1,1,1,1,1] => [ 7,7,7,7,7,7,7,7,7,7,7, 7 ]
- explicación: (15 + 12 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) / 12 = 6.8333
- [20,20,20,20,10,10,10,9,8,7,6,5] => [ 12,12,12,12 , 7,7,7 , 5,4,3,2, 1]
- explicación: (15 + 12 + 10 + 9) / 4 = 11.5, (8 + 7 + 6) / 3 = 7
- [100,99,98,95,95,95,94,93,93,92,91,91] => [15,12,10, 8,8,8 , 6, 5,5 , 3, 2, 2 ]
- explicación: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4.5, (2 + 1) / 2 = 1.5
Relacionado: Clasifique una lista de puntajes con "saltos"
fuente
ave
) de lo contrario es solo un fragmento (que no está permitido). Afortunadamente, esto te ahorra 5 bytes.Perl 5 , 109 +1 (-a) = 110 bytes
Pruébalo en línea!
Incluye 17 bytes para codificar los valores de puntos.
fuente
MATL ,
1210 bytes2 bytes de descuento gracias a @geokavel !
Las entradas son un vector de columna (
;
como separador) de puntuaciones enteras y un vector de columna con los puntos. La salida contiene los resultados separados por nuevas líneas.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
05AB1E , 12 bytes
Pruébalo en línea!
Explicación
fuente
C # (.NET Core) , 154 bytes
Pruébalo en línea!
C # (.NET Core) + usando Linq, 170 + 23 bytes
Pruébalo en línea!
fuente
J, 15 bytes
Pruébalo en línea!
Toma la lista de puntuaciones (
1 2 ... 12 15
) como argumento de la derecha y los valores para puntuar como argumento de la izquierda. Si esto no es una entrada lógica, agregue 1 byte para un~
-pasivo invierta el orden en que se toman las entradas.Puede haber algunas cosas para el golf, que incluyen
Explicación
Lo dividiré en un par de funciones.
avg_and_dupe
toma el promedio de una lista y la duplica tantas veces como la longitud de la listascore
puntúa una entrada (argumento izquierdo) dada una lista de puntajes (argumento derecho).avg_and_dupe
Esto funciona muy bien porque se trata como dos tenedores . Si todavía te estás rascando la cabeza (sé que lo estaba al principio), pregunta y puedo darte una explicación más profunda de por qué esto funciona como lo hace.
Puntuación
Si todavía es confuso, también puedo agregar una explicación para
/.
-key, pero creo que la página wiki lo explica bastante bien.fuente
You can also take the points list [15,12,10,9,...] as input.
si eso le ahorra bytesPython 2 , 66 bytes
-8 bytes gracias a Leaky Nun.
Pruébalo en línea!
fuente
Jalea , 11 bytes
Pruébalo en línea!
-3 bytes gracias a fireflame por notar las nuevas características de Jelly: D
fuente
S÷L
y molde en lugar dexL
, lo que permite en$
lugar de dosµ
.Python 3 , 67 bytes
Pruébalo en línea!
Python 2 ,
10870 bytesPruébalo en línea!
fuente
Python 3 , 72 bytes
Pruébalo en línea!
fuente
Protón , 62 bytes
Pruébalo en línea!
Protón , 63 bytes
Pruébalo en línea!
fuente
Dyalog APL, 14 bytes
Toma la lista de puntajes como argumento izquierdo y la lista de puntos como argumento derecho. Agregue 2 bytes para envolverlo
()
si se llama directamente y no como una función con nombre.{
...}⌸
agrupe el argumento derecho por la clave en el argumento izquierdo y aplique la función entre llaves a cada grupo (operador clave).⊂≢⍴+/÷≢
es un tenedor donde:+/÷≢
es el promedio de puntos por grupo (suma dividida por el recuento)≢⍴
tally remodelar (replicar el promedio para que coincida con el número de elementos en el grupo)⊂
recuadra el resultado (esto es para contrarrestar la mezcla del resultado que aplica el operador clave)∊
se enlista y aplana el resultado del operador clave (que es un vector anidado de vectores) en una lista simple.TryAPL en línea
fuente
Haskell, 152 bytes
Es un dolor importar
groupBy
yon
tuve que hacer el mío.La función de promedio se acortará en breve.
La necesidad de la firma probablemente podría evitarse con los indicadores del compilador.
fuente