Punteggio di Mario Kart con pareggi


16

Ho riscontrato questo problema mentre lavoravo a un'altra sfida che sto facendo per questo sito. In quella sfida utilizzo " Mario Kart 8 Scoring ". La quantità di punti che il giocatore ottiene al k ° posto è rappresentata da questo array 1 indicizzato: [15,12,10,9,8,7,6,5,4,3,2,1]. Quindi il 1 ° posto ottiene 15 punti, il 2 ° posto ottiene 12 punti, ecc.

È abbastanza facile assegnare punti come questo, tuttavia la parte difficile viene da come gestisco i legami. Quello che faccio è dare ad ogni giocatore che lega la media dei punti assegnati per ogni punto di parità. Ad esempio, se solo 1o e 2o pareggio, entrambi i giocatori ottengono (15 + 12) / 2 = 13,5 punti. (Nota: puoi arrotondare all'int più vicino, quindi anche 13 o 14 sono entrambi accettabili.) Quindi il 3 ° - 12 ° posto ottiene il normale numero di punti per la loro posizione.

Sfida

Dati 12 punteggi interi non negativi che sono ordinati in modo decrescente, genera il numero di punti che ogni giocatore ottiene. Puoi anche prendere la lista dei punti [15,12,10,9, ...] come input. Nota che il numero di punti che ogni giocatore ottiene non dipende dai valori effettivi dei punteggi, ma da come si confrontano con gli altri punteggi.

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

Correlati: classifica un elenco di punteggi con "salta"

Risposte:


5

JavaScript (ES6), 57 byte

Accetta input nella sintassi del curry (p)(s), dove p è l'elenco di punti e s è l'elenco di punteggi.

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

Casi test


5

R , 3 byte

Apparentemente R ha un built-in per questo. Prende un elenco di punguenti e score come input.

ave

Provalo online!

Esempio:

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

Lo strumento giusto per il lavoro!
geokavel,

5
Dovrebbero essere 3 byte (solo ave), altrimenti è solo uno snippet (che non è consentito). Fortunatamente, questo ti fa risparmiare 5 byte.
caird coinheringaahing

@caird grazie, hai assolutamente ragione.
BLT,

4

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

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

Provalo online!

Include 17 byte per codificare i valori dei punti.


4

MATL , 12 10 byte

2 byte di sconto grazie a @geokavel !

7#uti2XQw)

Gli input sono un vettore di colonna ( ;come separatore) di punteggi interi e un vettore di colonna con i punti. L'output contiene i risultati separati da newline.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

       % 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

Soluzione di nicchia! Penso che puoi salvare alcuni byte non arrotondando all'int più vicino (non è necessario).
geokavel,

@geokavel Oh, hai ragione! Ho letto male la sfida come arrotondamento esigente. Grazie!
Luis Mendo,

3

05AB1E , 12 byte

γ€g£vygFyÅAˆ

Provalo online!

Spiegazione

γ              # 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

2

C # (.NET Core) , 154 byte

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;}

Provalo online!

C # (.NET Core) + utilizzando Linq, 170 + 23 byte

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()

Provalo online!


2

J, 15 byte

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

Provalo online!

Prende l'elenco dei punteggi (1 2 ... 12 15 ) come argomento per la mano destra e i valori per segnare come argomento per la mano sinistra. Se questo non è un input logico, aggiungi 1 byte per a~ -passive per invertire l'ordine in cui gli input sono presi.

Ci potrebbero essere alcune cose da golf, tra cui

  • Il mio uso del pugilato
  • Il tappo alla fine

Spiegazione

Dividerò questo in un paio di funzioni.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe prende la media di una lista e la duplica tante volte quanto la lunghezza della lista
  • score segna un input (argomento a sinistra) dato un elenco di punteggi (argomento a destra).

avg_and_dupe

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

Funziona così bene perché è trattato come due forchette . Se stai ancora grattando la testa (so che all'inizio ero), chiedi e posso fornire una spiegazione più approfondita del perché funziona così.

Punto

[: ; <@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

Se è ancora confuso, posso anche aggiungere una spiegazione per /.-key, ma penso che la pagina wiki lo spieghi abbastanza bene.


Si noti che OP ha aggiunto You can also take the points list [15,12,10,9,...] as input.se ciò consente di risparmiare byte
Stephen,


2

Gelatina , 11 byte

ṁ⁴Œg¤Æmṁ$€F

Provalo online!

-3 byte grazie alla fiamma di fuoco per notare le nuove funzionalità di Jelly: D


Sì, probabilmente è troppo lungo guardare a quanto sono brevi le soluzioni sulla sfida correlata.
geokavel,

@geokavel la cosa fastidiosa è che il codice per generare la lista è più lungo della soluzione J su quella; _;
HyperNeutrino,

Ho dimenticato di mettere che puoi prendere anche l'elenco dei punti come input. Lo aggiungerò.
geokavel,

11 byte. Utilizza la nuova monade aritmetica media invece di S÷Le muffa anziché xL, che consente $invece di due µ.
fireflame241





1

Dyalog APL, 14 byte

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

Prende l'elenco dei punteggi come argomento a sinistra e l'elenco dei punti come argomento a destra. Aggiungi 2 byte per racchiuderlo() se chiamato direttamente e non come una funzione con nome.

{...}⌸ raggruppa l'argomento destro per tasto nell'argomento sinistro e applica la funzione tra parentesi graffe a ciascun gruppo (operatore chiave).

⊂≢⍴+/÷≢ è un fork in cui:

+/÷≢ è la media dei punti per il gruppo (somma divisa per il conteggio)

≢⍴ rimodella tally (replica la media in modo che corrisponda al numero di elementi nel gruppo)

inscatola il risultato (questo serve a contrastare la miscelazione del risultato applicato dall'operatore chiave)

viene arruolato e appiattisce il risultato dell'operatore chiave (che è un vettore nidificato di vettori) in un semplice elenco.

TryAPL online


1

Haskell, 152 byte

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

È un dolore importare groupBye on, quindi, ho dovuto fare il mio.

La funzione di media sarà abbreviata a breve.

La necessità della firma potrebbe probabilmente essere evitata con i flag del compilatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.