Mario Kart Scoring w / Krawatten

16

Ich bin auf dieses Problem gestoßen, als ich an einer anderen Herausforderung für diese Site arbeitete. Bei dieser Herausforderung verwende ich " Mario Kart 8 Scoring ". Die Anzahl der Punkte, die der Spieler auf Platz k erhält, wird durch dieses 1-indizierte Array dargestellt: [15,12,10,9,8,7,6,5,4,3,2,1]. Also bekommt der 1. Platz 15 Punkte, der 2. Platz 12 Punkte usw.

Es ist einfach genug, Punkte wie diese zu vergeben, aber der schwierige Teil hängt davon ab, wie ich mit Krawatten umgehe. Ich gebe jedem Spieler, der bindet, den Durchschnitt der Punkte, die für jeden Bindungsplatz vergeben wurden. Wenn zum Beispiel nur der 1. und der 2. Gleichstand besteht, erhalten beide Spieler (15 + 12) / 2 = 13,5 Punkte. (Hinweis: Sie dürfen auf das nächste int runden, also sind auch 13 oder 14 zulässig.) Dann erhalten die Plätze 3 bis 12 die normale Punktzahl für ihre Position.

Herausforderung

Bei 12 nicht-negativen Ganzzahlwerten, die absteigend sortiert sind, wird die Anzahl der Punkte ausgegeben, die jeder Spieler erhält. Sie können auch die Punkteliste [15,12,10,9, ...] als Eingabe verwenden. Beachten Sie, dass die Anzahl der Punkte, die jeder Spieler erhält, nicht von den tatsächlichen Werten der Punkte abhängt, sondern davon, wie diese mit den anderen Punkten verglichen werden.

Testfälle

  • [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]
    • Erklärung: (12 + 10 + 9) / 3 = 10,3333
  • [1,1,1,1,1,1,1,1,1,1,1] => [ 7,7,7,7,7,7,7,7,7,7, 7 ]
    • Erklärung: (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]
    • Erklärung: (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 ]
    • Erklärung: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4,5, (2 + 1) / 2 = 1,5

Verwandte: Rang eine Liste von Partituren mit "übersprungen"

Geokavel
quelle

Antworten:

5

JavaScript (ES6), 57 Byte

Nimmt Eingaben in Curry-Syntax vor (p)(s), wobei p die Liste der Punkte und s die Liste der Punkte ist.

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

Testfälle

Arnauld
quelle
5

R , 3 Bytes

Anscheinend hat R ein eingebautes dafür. Nimmt eine Liste von pPunkten und sKernen als Eingabe.

ave

Probieren Sie es online!

Beispiel:

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
quelle
Richtiges Werkzeug für den Job!
Geokavel
5
Dies sollte 3 Bytes sein (nur ave), sonst ist es nur ein Ausschnitt (was nicht erlaubt ist). Zum Glück sparen Sie dadurch 5 Bytes.
Caird Coinheringaahing
@ Caird danke, du hast absolut recht.
BLT
4

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

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

Probieren Sie es online!

Beinhaltet 17 Bytes, um die Punktwerte fest zu codieren.

Xcali
quelle
4

MATL , 12 10 Bytes

2 Bytes weniger dank @geokavel !

7#uti2XQw)

Eingaben sind ein Spaltenvektor ( ;als Trennzeichen) von Ganzzahlen und ein Spaltenvektor mit den Punkten. Die Ausgabe enthält die Ergebnisse durch Zeilenumbrüche getrennt.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

       % 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
quelle
Nics Lösung! Ich denke, Sie können einige Bytes sparen, indem Sie nicht auf das nächste int runden (es ist nicht erforderlich).
Geokavel
@geokavel Oh, du hast recht! Ich verstehe die Herausforderung falsch als das Anfordern von Rundungen. Vielen Dank!
Luis Mendo
3

05AB1E , 12 Bytes

γ€g£vygFyÅAˆ

Probieren Sie es online!

Erläuterung

γ              # 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
quelle
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;}

Probieren Sie es online!

C # (.NET Core) + unter Verwendung von Linq, 170 + 23 Bytes

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

Probieren Sie es online!

Dennis.Verweij
quelle
2

J, 15 Bytes

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

Probieren Sie es online!

Nimmt die Liste der Punkte ( 1 2 ... 12 15) als Argument für die rechte Hand und die zu bewertenden Werte als Argument für die linke Hand. Wenn dies keine logische Eingabe ist, addieren Sie 1 Byte für ein ~-passiv, um die Reihenfolge zu invertieren, in der die Eingaben verwendet werden.

Möglicherweise gibt es ein paar Dinge zum Golfen, darunter

  • Meine Nutzung des Boxens
  • Die Kappe am Ende

Erläuterung

Ich werde dies in ein paar Funktionen aufteilen.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe Nimmt den Durchschnitt einer Liste und dupliziert ihn so oft wie die Länge der Liste
  • score bewertet eine Eingabe (linkes Argument) anhand einer Liste von Bewertungen (rechtes Argument).

avg_and_dupe

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

Das funktioniert so gut, weil es wie zwei Gabeln behandelt wird . Wenn Sie sich immer noch am Kopf kratzen (ich weiß, dass ich es am Anfang war), fragen Sie und ich kann Ihnen eine ausführlichere Erklärung geben, warum dies so funktioniert.

Ergebnis

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

Wenn es immer noch verwirrend ist, kann ich auch eine Erklärung für /.-key hinzufügen, aber ich denke, die Wiki-Seite erklärt es ziemlich gut.

cole
quelle
Beachten Sie, dass OP hinzugefügt, You can also take the points list [15,12,10,9,...] as input.wenn das Sie alle Bytes speichert
Stephen
2

Python 2 , 66 Bytes

-8 Bytes dank Leaky Nun.

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

Probieren Sie es online!

total menschlich
quelle
2

Jelly , 11 Bytes

ṁ⁴Œg¤Æmṁ$€F

Probieren Sie es online!

-3 Bytes dank fireflame für das Bemerken neuer Jelly-Features: D

HyperNeutrino
quelle
Ja, es ist wahrscheinlich zu lang, wenn man bedenkt, wie kurz die Lösungen für die damit verbundene Herausforderung sind.
Geokavel
@geokavel Das nervige ist, dass der Code zum Generieren der Liste länger ist als die J-Lösung für diese; _;
HyperNeutrino
Ich habe vergessen zu sagen, dass Sie die Punkteliste auch als Eingabe nehmen können. Ich werde das hinzufügen.
Geokavel
11 Bytes. Verwendet die neue arithmetische mittlere Monade anstelle von S÷Lund mould anstelle von xL, was $statt zwei erlaubt µ.
Fireflame241
1

Proton , 62 Bytes

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

Probieren Sie es online!

Proton , 63 Bytes

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

Probieren Sie es online!

Mr. Xcoder
quelle
^^ Ich werde das nächste Mal mit Proton anfangen, lol.
Totalhuman
1

Dyalog APL, 14 Bytes

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

Nimmt die Liste der Punkte als linkes Argument und die Punkteliste als rechtes Argument. Fügen Sie 2 Bytes hinzu, um es einzuschließen, ()wenn es direkt und nicht als benannte Funktion aufgerufen wird.

{... }⌸gruppieren Sie das rechte Argument mit der Taste im linken Argument und wenden Sie die Funktion in geschweiften Klammern auf jede Gruppe an (Key Operator).

⊂≢⍴+/÷≢ ist eine Gabel, wo:

+/÷≢ ist der Durchschnitt der Punkte für die Gruppe (Summe geteilt durch die Summe)

≢⍴ Tally-Umformung (Durchschnittswert wiederholen, um der Anzahl der Elemente in der Gruppe zu entsprechen)

boxt das Ergebnis ein (um der Vermischung des Ergebnisses, das der Key Operator anwendet, entgegenzuwirken)

wird eingetragen und das Ergebnis des Schlüsseloperators (der ein verschachtelter Vektor von Vektoren ist) in eine einfache Liste eingeteilt.

TryAPL online

Gil
quelle
1

Haskell, 152 Bytes

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

Es ist ein Schmerz zu importieren groupByund onso musste ich meine eigenen machen.

Die Mittelungsfunktion wird in Kürze verkürzt.

Das Erfordernis der Signatur könnte wahrscheinlich mit Compiler-Flags vermieden werden.

Leif Willerts
quelle