Mario Kart Puanları


16

Bu site için yaptığım başka bir zorluk üzerinde çalışırken bu sorunla karşılaştım. Bu mücadelede " Mario Kart 8 Scoring " i kullanıyorum. Puan miktarı oyuncu k [15,12,10,9,8,7,6,5,4,3,2,1]: sırada yer Bu 1 endeksli dizisi tarafından temsil edilir alır. Böylece 1.lik 15 puan, 2.lik 12 puan vb.

Bunun gibi noktalar atamak yeterince kolaydır, ancak zor kısım bağları nasıl ele aldığımla birlikte gelir. Yaptığım her bağlama oyuncusuna, her bağlama yeri için verilen puanların ortalamasını vermektir. Örneğin, sadece 1. ve 2. berabere kalırsa, her iki oyuncu da (15 + 12) / 2 = 13.5 puan alır. (Not: En yakın int'e yuvarlanmanıza izin verilir, bu nedenle 13 veya 14 de kabul edilebilir.) Sonra 3. - 12. sıra, konumları için normal miktarda puan alır.

Meydan okuma

Azalan olarak sıralanan 12 negatif olmayan tamsayı puanı verildiğinde, her oyuncunun aldığı puanların sayısını girin. Nokta listesini [15,12,10,9, ...] girdi olarak da alabilirsiniz. Her oyuncunun aldığı puan sayısının puanların gerçek değerlerine değil, diğer puanlarla nasıl karşılaştırıldığına bağlı olduğunu unutmayın.

Test Durumları

  • [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]
    • açıklama: (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 ]
    • açıklama: (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]
    • açıklama: (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 ]
    • açıklama: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4.5, (2 + 1) / 2 = 1.5

İlgili: "Atlar" ile puan listesini sırala

Yanıtlar:


5

JavaScript (ES6), 57 bayt

Kıvrım sözdiziminde girdi alır; (p)(s)burada p , noktalar listesidir ve s , skorlar listesidir.

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

Test senaryoları


5

R , 3 bayt

Görünüşe göre R bunun için yerleşik bir. Giriş olarak bir pmerhem ve sçekirdek listesi alır .

ave

Çevrimiçi deneyin!

Misal:

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

İş için doğru araç!
geokavel

5
Bu 3 bayt olmalıdır (sadece ave) aksi takdirde sadece bir snippettir (buna izin verilmez). Neyse ki, bu size 5 bayt kazandırır.
caird coinheringaahing

@caird teşekkürler, kesinlikle haklısın.
BLT

4

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

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

Çevrimiçi deneyin!

Nokta değerlerini sabit kodlamak için 17 bayt içerir.


4

MATL , 12 10 bayt

@Geokavel sayesinde 2 bayt kapalı !

7#uti2XQw)

Girdiler, ;tamsayı skorlarının bir sütun vektörü ( ayırıcı olarak) ve noktaları olan bir sütun vektörüdür. Çıktı, yeni satırlarla ayrılmış sonuçları içerir.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

       % 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

Nics çözümü! Sanırım en yakın int'e yuvarlayarak bazı baytlar kaydedebilirsiniz (gerekli değildir).
geokavel

@geokavel Oh, haklısın! Ben yuvarlama talep olarak meydan okumayı yanlış okudum. Teşekkürler!
Luis Mendo

3

05AB1E , 12 bayt

γ€g£vygFyÅAˆ

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin!

Linq, 170 + 23 bayt kullanan C # (.NET Core) +

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

Çevrimiçi deneyin!


2

J, 15 bayt

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

Çevrimiçi deneyin!

Skor listesini alır (1 2 ... 12 15 ) sağ taraftaki bir argüman olarak ve skorlanacak değerleri sol taraftaki bir argüman olarak alır. Bu mantıklı bir giriş değilse,~ , girişlerin alındığı sırayı tersine çevirmek passive için .

Golf yapmak için birkaç şey olabilir.

  • Boks kullanımım
  • Sondaki kapak

açıklama

Bunu birkaç işleve bölebilirim.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe bir listenin ortalamasını alır ve listenin uzunluğu kadar çoğaltır
  • score Skor listesi (sağ argüman) verilen bir girdiyi (sol argüman) puanlar.

avg_and_dupe

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

Bu çok güzel çalışıyor çünkü iki çatal gibi tedavi ediliyor . Hâlâ başınızı kaşıyorsanız (ilk başta olduğumu biliyorum), sorun ve bunun neden işe yaradığına dair daha ayrıntılı bir açıklama sağlayabilirim.

Puan

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

Hala kafa karıştırıcıysa, /.-key için bir açıklama da ekleyebilirim , ancak wiki sayfasının bunu oldukça iyi açıkladığını düşünüyorum .


OP You can also take the points list [15,12,10,9,...] as input.size bayt kazandırırsa eklediğini unutmayın
Stephen


2

Jöle , 11 bayt

ṁ⁴Œg¤Æmṁ$€F

Çevrimiçi deneyin!

Yeni Jelly özelliklerini fark ettiği için ateşböceği sayesinde -3 bayt: D


Evet, muhtemelen ilgili zorluktaki çözümlerin ne kadar kısa olduğuna bakmak çok uzun.
geokavel

@geokavel sinir bozucu şey, listeyi oluşturmak için kod o bir J çözümünden daha uzun olmasıdır; _;
HyperNeutrino

Nokta listesini de girdi olarak alabileceğinizi unutmuşum. Bunu ekleyeceğim.
geokavel

11 bayt. İki yerine izin veren yeni aritmetik ortalama monad yerine S÷Lve kalıp yerine kullanır . xL$µ
fireflame241





1

Dyalog APL, 14 bayt

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

Skor listesini sol argüman olarak, puan listesini sağ argüman olarak alır. ()Adlandırılmış bir işlev olarak değil, doğrudan çağrılırsa , içine 2 bayt ekleyin .

{... }⌸sağ argümanı sol argümanda anahtarla gruplayın ve her gruba parantez içinde fonksiyonu uygulayın (ana işletmen).

⊂≢⍴+/÷≢ bir çatal:

+/÷≢ grup için ortalama puandır (toplamın taksitle bölünmesi)

≢⍴ taksitli yeniden şekillendirme (ortalamayı gruptaki öğelerin sayısına uyacak şekilde çoğalt)

sonucu kutulara yerleştirir (bu, ana operatörün uyguladığı sonucun karıştırılmasına karşı koymak içindir)

ana operatörün sonucunu (vektörlerin iç içe bir vektörü olan) listeler ve basit bir listeye düzeltir.

TryAPL çevrimiçi


1

Haskell, 152 bayt

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

İçe aktarmak için bir acı groupByveon bu yüzden kendiminkini yapmak zorunda kaldım.

Ortalama alma işlevi kısa bir süre için kısaltılacaktır.

Derleyici bayraklarıyla imzaya ihtiyaç duyulmaması muhtemeldir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.