Mario Kart Scoring avec cravates

16

J'ai rencontré ce problème en travaillant sur un autre défi que je fais pour ce site. Dans ce défi, j'utilise " Mario Kart 8 Scoring ". Le nombre de points que le joueur en k ème place obtient est représenté par ce tableau à 1 index: [15,12,10,9,8,7,6,5,4,3,2,1]. Donc la 1ère place obtient 15 points, la 2ème place obtient 12 points, etc.

Il est assez facile d'attribuer des points comme celui-ci, mais la partie délicate vient de la façon dont je gère les liens. Ce que je fais, c'est donner à chaque joueur à égalité la moyenne des points accordés pour chaque lieu à égalité. Par exemple, si seulement le 1er et le 2e sont à égalité, les deux joueurs obtiennent (15 + 12) / 2 = 13,5 points. (Remarque: vous êtes autorisé à arrondir au nombre entier le plus proche, donc 13 ou 14 sont également acceptables.) Ensuite, les 3e - 12e places obtiennent le nombre normal de points pour leur position.

Défi

Étant donné 12 scores entiers non négatifs triés de manière décroissante, affichez le nombre de points que chaque joueur obtient. Vous pouvez également prendre la liste de points [15,12,10,9, ...] en entrée. Notez que le nombre de points que chaque joueur obtient ne dépend pas des valeurs réelles des scores, mais de la façon dont ils se comparent aux autres scores.

Cas de test

  • [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]
    • explication: (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 ]
    • explication: (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]
    • explication: (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 ]
    • explication: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4,5, (2 + 1) / 2 = 1,5

Connexes: classer une liste de scores avec des «sauts»

geokavel
la source

Réponses:

5

JavaScript (ES6), 57 octets

Prend une entrée dans la syntaxe de curry (p)(s), où p est la liste des points et s est la liste des scores.

p=>s=>s.map(v=>s.reduce((t,x,i)=>x-v?t:t+p[n++,i],n=0)/n)

Cas de test

Arnauld
la source
5

R , 3 octets

Apparemment, R a une fonction intégrée pour cela. Prend une liste des points et des scœurs en entrée.

ave

Essayez-le en ligne!

Exemple:

p=c(15,12,10,9,8,7,6,5,4,3,2,1)

> ave(p,c(20,15,15,15,10,9,8,7,6,5,4,3))
 [1] 15.00000 10.33333 10.33333 10.33333  8.00000  7.00000  6.00000  5.00000  4.00000  3.00000  2.00000  1.00000
> ave(p,c(1,1,1,1,1,1,1,1,1,1,1,1))
 [1] 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333
BLT
la source
Le bon outil pour le travail!
geokavel
5
Cela devrait être de 3 octets (juste ave) sinon c'est juste un extrait (ce qui n'est pas autorisé). Heureusement, cela vous fait économiser 5 octets.
caird coinheringaahing
@caird merci, vous avez absolument raison.
BLT
4

Perl 5 , 109 +1 (-a) = 110 octets

@p=(1..10,12,15);while(@F){$/=$,=0;do{$,++;$/+=pop@p}while($w=shift@F)==$F[0];push@r,(int.5+$//$,)x$,}say"@r"

Essayez-le en ligne!

Comprend 17 octets pour coder en dur les valeurs en points.

Xcali
la source
4

MATL , 12 10 octets

2 octets de réduction grâce à @geokavel !

7#uti2XQw)

Les entrées sont un vecteur de colonne ( ;comme séparateur) de scores entiers et un vecteur de colonne avec les points. La sortie contient les résultats séparés par des retours à la ligne.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

       % Implicitly take first input. 
       % STACK: [21;21;15;14;12;9;6;5;4;3;2;1]
7#u    % Unique consecutive integer labels
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11]
t      % Duplicate
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11], [1;1;2;3;4;5;6;7;8;9;10;11]
i      % Take second input
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11], [1;1;2;3;4;5;6;7;8;9;10;11], [15;12;10;9;8;7;6;5;4;3;2;1]
2XQ    % Average second argument as grouped by the first
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11], [13.5;10;9;8;7;6;5;4;3;2;1]
w      % Swap
       % STACK: [[13.5;10;9;8;7;6;5;4;3;2;1], [1;1;2;3;4;5;6;7;8;9;10;11]
)      % Reference indexing
       % STACK: [13.5;10;9;8;7;6;5;4;3;2;1]
       % Implicitly display
Luis Mendo
la source
Solution Nics! Je pense que vous pouvez économiser quelques octets en n'arrondissant pas à l'int plus proche (ce n'est pas obligatoire).
geokavel
@geokavel Oh, vous avez raison! J'ai mal interprété le défi comme exigeant un arrondi. Merci!
Luis Mendo
3

05AB1E , 12 octets

γ€g£vygFyÅAˆ

Essayez-le en ligne!

Explication

γ              # group the scores into chunks of consecutive equal elements
 €g            # get the length of each chunk
   £           # split the points list into chunks of these sizes
    v          # for each chunk y in the points list
     ygF       # len(y) times do:
        yÅA    # get the arithmetic mean of y
           ˆ   # add to global list
               # implicitly output global list
Emigna
la source
2

C # (.NET Core) , 154 octets

x=>s=>{for(int i=0;i<12;){int b=0,j=i,a=0,c=0;for(;j<12&&x[i]==x[j];j++,b++){a+=s[j];}a=(int)Math.Round(a/(b+.0));for(;c<b;c++){x[i+c]=a;}i+=b;}return x;}

Essayez-le en ligne!

C # (.NET Core) + en utilisant Linq, 170 + 23 octets

x=>s=>x.GroupBy(z=>z).Select(y=>Enumerable.Repeat(Math.Round(s.Skip(Array.IndexOf(x,y.Key)).Take(y.Count()).Average()),y.Count())).Aggregate((a,b)=>a.Concat(b)).ToArray()

Essayez-le en ligne!

Dennis.Verweij
la source
2

J, 15 octets

[:;<@(##+/%#)/.

Essayez-le en ligne!

Prend la liste des scores (1 2 ... 12 15 ) comme argument de droite et les valeurs à marquer comme argument de gauche. Si ce n'est pas une entrée logique, ajoutez 1 octet pour un ~-passif pour inverser l'ordre dans lequel les entrées sont prises.

Il peut y avoir quelques choses au golf, notamment

  • Mon utilisation de la boxe
  • Le capuchon à la fin

Explication

Je vais diviser cela en deux fonctions.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe prend la moyenne d'une liste et la duplique autant de fois que la longueur de la liste
  • score note une entrée (argument de gauche) étant donné une liste de scores (argument de droite).

avg_and_dupe

# # +/ % #
#           Length
  #         Copy as many times as the left argument
    +/ % #  Average
    +/       Sum
       %     Divided by
         #   Length

Cela fonctionne si bien car il est traité comme deux fourches . Si vous vous grattez toujours la tête (je sais que je l'étais au début), demandez et je peux fournir une explication plus approfondie de la raison pour laquelle cela fonctionne comme il le fait.

But

[: ; <@avg_and_dupe/.
                   /.  Key: using the values given, partition the scores
     <@avg_and_dupe     For each partition:
       avg_and_dupe      Average and duplicate
     <                   Then box
   ;                   Raze the boxes into a single list

Si c'est toujours déroutant, je peux également ajouter une explication pour /.-key, mais je pense que la page wiki l' explique assez bien.

cole
la source
Notez que OP ajouté You can also take the points list [15,12,10,9,...] as input.si cela vous fait gagner des octets
Stephen
2

Python 2 , 66 octets

-8 octets grâce à Leaky Nun.

lambda s,p:[sum(p[s.index(i):][:s.count(i)])/s.count(i)for i in s]

Essayez-le en ligne!

totalement humain
la source
2

Gelée , 11 octets

ṁ⁴Œg¤Æmṁ$€F

Essayez-le en ligne!

-3 octets grâce à Fireflame pour avoir remarqué les nouvelles fonctionnalités de Jelly: D

HyperNeutrino
la source
Oui, il est probablement trop long de voir à quel point les solutions au défi connexe sont courtes.
geokavel
@geokavel ce qui est ennuyeux, c'est que le code pour générer la liste est plus long que la solution J sur celle-ci; _;
HyperNeutrino
J'ai oublié de dire que vous pouvez également prendre la liste des points en entrée. Je vais ajouter ça.
geokavel
11 octets. Utilise la nouvelle monade moyenne arithmétique au lieu de S÷Let moule au lieu de xL, ce qui permet $au lieu de deux µ.
fireflame241
1

Proton , 62 octets

(s,p)=>[sum(p[s.index(i)to][to s.count(i)])/s.count(i)for i:s]

Essayez-le en ligne!

Proton , 63 octets

(s,p)=>map(i=>sum(p[s.index(i)to][to s.count(i)])/s.count(i),s)

Essayez-le en ligne!

M. Xcoder
la source
^^ Je vais juste commencer par Proton la prochaine fois lol.
2017 totalement humain
1

Dyalog APL, 14 octets

∊{(⊂≢⍴+/÷≢)⍵}⌸

Prend la liste des scores comme argument de gauche et la liste des points comme argument de droite. Ajoutez 2 octets pour l'encapsuler ()s'il est appelé directement et non comme une fonction nommée.

{... }⌸grouper l'argument droit par clé dans l'argument gauche et appliquer la fonction entre accolades à chaque groupe (opérateur clé).

⊂≢⍴+/÷≢ est une fourchette où:

+/÷≢ est la moyenne des points pour le groupe (somme divisée par le décompte)

≢⍴ remodeler le pointage (reproduire la moyenne pour faire correspondre le nombre d'éléments dans le groupe)

encadre le résultat (c'est pour contrecarrer le mélange du résultat que l'opérateur clé applique)

est enrôlé et aplatit le résultat de l'opérateur clé (qui est un vecteur imbriqué de vecteurs) dans une liste simple.

TryAPL en ligne

Gil
la source
1

Haskell, 152 octets

f::[Int]->[Int]
f=concat.g(15:12:[10,9..1])[]
g[q]t _=[q:t]
g(q:r)t(x:z)|x>head z=(replicate(l(q:t))(sum(q:t)`div`l(q:t))):g r[]z|1<2=g 
r(q:t)z
l=length

C'est pénible à importer groupByet onj'ai donc dû faire le mien.

La fonction de moyenne sera raccourcie sous peu.

Le besoin de la signature pourrait probablement être évité avec les drapeaux du compilateur.

Leif Willerts
la source