Mario Kart Scoring w / Ties

16

Natknąłem się na ten problem podczas pracy nad innym wyzwaniem dla tej witryny. W tym wyzwaniu wykorzystuję „ Mario Kart 8 Scoring ”. Ilość punktów, które gracz otrzymuje na k- tym miejscu, jest reprezentowana przez 1-indeksowaną tablicę: [15,12,10,9,8,8,7,6,5,4,3,2,1]. Tak więc pierwsze miejsce otrzymuje 15 punktów, drugie miejsce 12 punktów itp.

Łatwo jest przypisywać takie punkty, jednak trudna część polega na tym, jak radzę sobie z remisami. To, co robię, to daje każdemu graczowi wiążącemu średnią liczbę punktów za każde miejsce wiązania. Na przykład, jeśli tylko 1. i 2. remis, to obaj gracze otrzymują (15 + 12) / 2 = 13,5 punktów. (Uwaga: możesz zaokrąglać do najbliższej liczby całkowitej, więc 13 lub 14 są również dopuszczalne.) Następnie miejsca od 3 do 12 otrzymują normalną liczbę punktów za ich pozycję.

Wyzwanie

Biorąc pod uwagę 12 nieujemnych liczb całkowitych, które są coraz mniej posortowane, wypisuje liczbę punktów, jaką otrzymuje każdy gracz. Możesz również wziąć listę punktów [15,12,10,9, ...] jako dane wejściowe. Zauważ, że liczba punktów, jaką otrzymuje każdy gracz, nie zależy od rzeczywistych wartości wyników, ale od ich porównania z innymi wynikami.

Przypadki testowe

  • [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,155,15,10,9,8,7,6,5,4,3] => [15, 10,10,10 , 8,7,6,5,4,3,2, 1]
    • wyjaśnienie: (12 + 10 + 9) / 3 = 10,3333
  • [1,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 ]
    • wyjaśnienie: (15 + 12 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) / 12 = 6,8333
  • [20,20,20,20,10,10,10,10,9,8,7,6,5] => [ 12,12,12,12 , 7,7,7 , 5,4,3,2, 1]
    • wyjaśnienie: (15 + 12 + 10 + 9) / 4 = 11,5, (8 + 7 + 6) / 3 = 7
  • [100,99,98,95,95,95,95,93,93,92,92,91,91] => [15,12,10, 8,8,8 , 6, 5,5 , 3, 2, 2 ]
    • wyjaśnienie: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4,5, (2 + 1) / 2 = 1,5

Powiązane: Ranking listy wyników za pomocą „pomija”

geokavel
źródło

Odpowiedzi:

5

JavaScript (ES6), 57 bajtów

Pobiera dane wejściowe w składni curry (p)(s), gdzie p jest listą punktów, a s jest listą wyników.

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

Przypadki testowe

Arnauld
źródło
5

R , 3 bajty

Najwyraźniej R ma do tego wbudowane. Pobiera na pwejściu listę maści i srdzeni.

ave

Wypróbuj online!

Przykład:

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
źródło
Odpowiednie narzędzie do pracy!
geokavel
5
Powinien to być 3 bajty (tylko ave), w przeciwnym razie jest to tylko fragment kodu (co jest niedozwolone). Na szczęście oszczędza to 5 bajtów.
caird coinheringaahing 10.09.17
@ dziwne dzięki, masz absolutną rację.
BLT
4

Perl 5 , 109 +1 (-a) = 110 bajtów

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

Wypróbuj online!

Zawiera 17 bajtów, aby zakodować wartości punktowe.

Xcali
źródło
4

MATL , 12 10 bajtów

2 bajty wyłączone dzięki @geokavel !

7#uti2XQw)

Dane wejściowe to wektor kolumny ( ;jako separator) wyników liczb całkowitych i wektor kolumny z punktami. Dane wyjściowe zawierają wyniki oddzielone znakami nowej linii.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

       % 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
źródło
Rozwiązanie Nics! Myślę, że możesz zaoszczędzić kilka bajtów, nie zaokrąglając do najbliższej liczby int (nie jest to wymagane).
geokavel
@geokavel Oh, masz rację! Źle odczytałem wyzwanie jako wymagające zaokrąglenia. Dzięki!
Luis Mendo,
3

05AB1E , 12 bajtów

γ€g£vygFyÅAˆ

Wypróbuj online!

Wyjaśnienie

γ              # 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
źródło
2

C # (.NET Core) , 154 bajtów

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

Wypróbuj online!

C # (.NET Core) + przy użyciu Linq, 170 + 23 bajtów

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

Wypróbuj online!

Dennis.Verweij
źródło
2

J, 15 bajtów

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

Wypróbuj online!

Pobiera listę wyników (1 2 ... 12 15 ) jako argument po prawej stronie, a wartości do zdobycia jako argument po lewej stronie. Jeśli nie jest to logiczne wejście, dodaj 1 bajt dla~ -pasywnego, aby odwrócić kolejność, w której dane są pobierane.

Może być kilka rzeczy do golfa, które obejmują

  • Moje użycie boksu
  • Czapka na końcu

Wyjaśnienie

Podzielę to na kilka funkcji.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe przyjmuje średnią z listy i powiela ją tyle razy, ile wynosi długość listy
  • score wyniki wejściowe (lewy argument), biorąc pod uwagę listę wyników (prawy argument).

avg_and_dupe

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

Działa to tak ładnie, ponieważ jest traktowane jak dwa widelce . Jeśli nadal drapiesz się po głowie (wiem, że byłem na początku), zapytaj i mogę podać bardziej szczegółowe wyjaśnienie, dlaczego tak się dzieje.

wynik

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

Jeśli nadal jest mylący, mogę dodać wyjaśnienie /.-key, ale myślę, że strona wiki wyjaśnia to całkiem dobrze.

kapusta
źródło
Zauważ, że OP dodane, You can also take the points list [15,12,10,9,...] as input.jeśli to pozwala zaoszczędzić bajty
Stephen
2

Python 2 , 66 bajtów

-8 bajtów dzięki Dziurawej Zakonnicy.

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

Wypróbuj online!

całkowicie ludzki
źródło
2

Galaretka , 11 bajtów

ṁ⁴Œg¤Æmṁ$€F

Wypróbuj online!

-3 bajty dzięki fireflame za zauważenie nowych funkcji galaretki: D

HyperNeutrino
źródło
Tak, chyba zbyt długo patrzy się na to, jak krótkie są rozwiązania związane z tym wyzwaniem.
geokavel
@geokavel denerwujące jest to, że kod do wygenerowania listy jest dłuższy niż rozwiązanie J na tym; _;
HyperNeutrino
Zapomniałem powiedzieć, że możesz wziąć listę punktów jako dane wejściowe. Dodam to.
geokavel
11 bajtów. Używa nowej arytmetycznej średniej monady zamiast S÷Li pleśni zamiast xL, co pozwala $zamiast dwóch µ.
fireflame241
1
@miles nie jest już tak naprawdę rzeczą .
Pan Xcoder,
1

Proton , 62 bajty

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

Wypróbuj online!

Proton , 63 bajty

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

Wypróbuj online!

Pan Xcoder
źródło
^^ Zaraz zacznę od Proton następnym razem lol.
całkowicie ludzki,
1

Dyalog APL, 14 bajtów

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

Traktuje listę wyników jako lewy argument, a listę punktów jako prawy argument. Dodaj 2 bajty do pakowania() jeśli wywoływane bezpośrednio, a nie jako funkcja o nazwie.

{...}⌸ zgrupuj prawy argument po kluczu w lewym argumencie i zastosuj funkcję w nawiasach klamrowych do każdej grupy (operator klucza).

⊂≢⍴+/÷≢ jest widelcem, w którym:

+/÷≢ to średnia punktów dla grupy (suma podzielona przez sumę)

≢⍴ przekształć licznik (powtórz średnią, aby dopasować liczbę elementów w grupie)

zaznacza wynik (ma to na celu przeciwdziałanie mieszaniu wyników przez głównego operatora)

zapisuje i spłaszcza wynik działania głównego operatora (który jest zagnieżdżonym wektorem wektorów) do prostej listy.

TryAPL online

Gil
źródło
1

Haskell, 152 bajty

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

Importowanie groupByi utrudnianieon tak musiałem zrobić własną rękę.

Funkcja uśredniania zostanie wkrótce skrócona.

Potrzebując podpisu można prawdopodobnie uniknąć flag kompilatora.

Leif Willerts
źródło