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”
źródło
ave
), w przeciwnym razie jest to tylko fragment kodu (co jest niedozwolone). Na szczęście oszczędza to 5 bajtów.Perl 5 , 109 +1 (-a) = 110 bajtów
Wypróbuj online!
Zawiera 17 bajtów, aby zakodować wartości punktowe.
źródło
MATL ,
1210 bajtów2 bajty wyłączone dzięki @geokavel !
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
źródło
05AB1E , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
C # (.NET Core) , 154 bajtów
Wypróbuj online!
C # (.NET Core) + przy użyciu Linq, 170 + 23 bajtów
Wypróbuj online!
źródło
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ą
Wyjaśnienie
Podzielę to na kilka funkcji.
avg_and_dupe
przyjmuje średnią z listy i powiela ją tyle razy, ile wynosi długość listyscore
wyniki wejściowe (lewy argument), biorąc pod uwagę listę wyników (prawy argument).avg_and_dupe
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
Jeśli nadal jest mylący, mogę dodać wyjaśnienie
/.
-key, ale myślę, że strona wiki wyjaśnia to całkiem dobrze.źródło
You can also take the points list [15,12,10,9,...] as input.
jeśli to pozwala zaoszczędzić bajtyPython 2 , 66 bajtów
-8 bajtów dzięki Dziurawej Zakonnicy.
Wypróbuj online!
źródło
Galaretka , 11 bajtów
Wypróbuj online!
-3 bajty dzięki fireflame za zauważenie nowych funkcji galaretki: D
źródło
S÷L
i pleśni zamiastxL
, co pozwala$
zamiast dwóchµ
.Python 3 , 67 bajtów
Wypróbuj online!
Python 2 ,
10870 bajtówWypróbuj online!
źródło
Python 3 , 72 bajty
Wypróbuj online!
źródło
Proton , 62 bajty
Wypróbuj online!
Proton , 63 bajty
Wypróbuj online!
źródło
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
źródło
Haskell, 152 bajty
Importowanie
groupBy
i 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.
źródło