Encontrei esse problema enquanto trabalhava em outro desafio que estou fazendo para este site. Nesse desafio, utilizo " Mario Kart 8 Scoring ". A quantidade de pontos que o jogador em k é colocado é representada por esta matriz de 1 índice: [15,12,10,9,8,7,6,5,4,3,2,1]. Então, o 1º lugar recebe 15 pontos, o 2º lugar recebe 12 pontos, etc.
É fácil atribuir pontos como este, no entanto, a parte complicada vem com a maneira como eu manejo os empates. O que faço é dar a cada jogador que amarra a média dos pontos dados para cada local de amarração. Por exemplo, se apenas o 1º e o 2º empataram, ambos os jogadores recebem (15 + 12) / 2 = 13,5 pontos. (Nota: você pode arredondar para o int mais próximo, então 13 ou 14 também são aceitáveis.) Em seguida, o 3º - 12º lugar obtém a quantidade normal de pontos para sua posição.
Desafio
Dadas 12 pontuações inteiras não negativas que são classificadas de forma decrescente, produz o número de pontos que cada jogador recebe. Você também pode pegar a lista de pontos [15,12,10,9, ...] como entrada. Observe que o número de pontos que cada jogador recebe não depende dos valores reais das pontuações, mas como eles se comparam às outras pontuações.
Casos de teste
- [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]
- explicação: (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 ]
- explicação: (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]
- explicação: (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 ]
- explicação: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4,5, (2 + 1) / 2 = 1,5
Relacionado: Classifique uma lista de pontuações com "pular"
fonte
ave
), caso contrário, é apenas um trecho (o que não é permitido). Felizmente, você economiza 5 bytes.Perl 5 , 109 +1 (-a) = 110 bytes
Experimente online!
Inclui 17 bytes para codificar os valores dos pontos.
fonte
MATL ,
1210 bytes2 bytes de desconto graças a @geokavel !
As entradas são um vetor de coluna (
;
como separador) de pontuações inteiras e um vetor de coluna com os pontos. A saída contém os resultados separados por novas linhas.Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
05AB1E , 12 bytes
Experimente online!
Explicação
fonte
C # (.NET Core) , 154 bytes
Experimente online!
C # (.NET Core) + usando Linq, 170 + 23 bytes
Experimente online!
fonte
J, 15 bytes
Experimente online!
Leva a lista de pontuações (
1 2 ... 12 15
) como argumento à direita e os valores a serem pontuados como argumento à esquerda. Se não for uma entrada lógica, adicione 1 byte para um~
passivo inverta a ordem em que as entradas são obtidas.Pode haver algumas coisas no golfe, que incluem
Explicação
Vou dividir isso em algumas funções.
avg_and_dupe
pega a média de uma lista e a duplica quantas vezes o comprimento da listascore
pontua uma entrada (argumento da esquerda), dada uma lista de pontuações (argumento da direita).avg_and_dupe
Isso funciona tão bem porque é tratado como dois garfos . Se você ainda está coçando a cabeça (eu sei que estava no começo), pergunte e eu posso fornecer uma explicação mais aprofundada sobre o porquê disso funciona.
Ponto
Se ainda estiver confuso, também posso adicionar uma explicação para
/.
-key, mas acho que a página da wiki explica muito bem.fonte
You can also take the points list [15,12,10,9,...] as input.
se que poupa nenhum bytesPython 2 , 66 bytes
-8 bytes graças a Leaky Nun.
Experimente online!
fonte
Gelatina , 11 bytes
Experimente online!
-3 bytes graças ao fireflame por observar os novos recursos do Jelly: D
fonte
S÷L
e mofo em vez dexL
, o que permite em$
vez de doisµ
.Python 3 , 67 bytes
Experimente online!
Python 2 ,
10870 bytesExperimente online!
fonte
Python 3 , 72 bytes
Experimente online!
fonte
Próton , 62 bytes
Experimente online!
Próton , 63 bytes
Experimente online!
fonte
Dyalog APL, 14 bytes
Toma a lista de pontuações como argumento à esquerda e a lista de pontos como argumento à direita. Adicione 2 bytes para envolvê-lo
()
se chamado diretamente e não como uma função nomeada.{
...}⌸
agrupa o argumento da direita pela tecla no argumento da esquerda e aplica a função entre chaves a cada grupo (operador de chave).⊂≢⍴+/÷≢
é um garfo onde:+/÷≢
é a média de pontos do grupo (soma dividida pelo registro)≢⍴
remodelar o registro (replicar a média para corresponder ao número de itens no grupo)⊂
caixas o resultado (isto é para neutralizar a mistura do resultado que o operador principal aplica)∊
é alistar e nivelar o resultado do operador principal (que é um vetor aninhado de vetores) em uma lista simples.TryAPL online
fonte
Haskell, 152 bytes
É difícil importar
groupBy
eon
, por isso, tive que fazer o meu próprio.A função média será reduzida em breve.
Precisando da assinatura provavelmente poderia ser evitado com sinalizadores de compilador.
fonte