Mario Kart Mencetak dengan Dasi

16

Saya mengalami masalah ini saat mengerjakan tantangan lain yang saya buat untuk situs ini. Dalam tantangan itu saya menggunakan " Mario Kart 8 Scoring ". Jumlah poin pemain di tempat k diwakili oleh array 1-diindeks ini: [15,12,10,9,8,7,6,5,4,4,3,2,1]. Jadi posisi 1 mendapat 15 poin, posisi 2 mendapat 12 poin, dll.

Cukup mudah untuk menetapkan poin seperti ini, namun bagian yang sulit datang dengan bagaimana saya menangani ikatan. Yang saya lakukan adalah memberi setiap pemain yang mengikat rata-rata poin yang diberikan untuk setiap tempat yang mengikat. Misalnya, jika hanya 1 dan 2 terikat, maka kedua pemain mendapatkan (15 + 12) / 2 = 13,5 poin. (Catatan: Anda diizinkan untuk membulatkan ke int terdekat, sehingga 13 atau 14 keduanya juga dapat diterima.) Kemudian tempat ke-3 - 12 mendapatkan jumlah poin normal untuk posisi mereka.

Tantangan

Diberikan 12 skor integer non-negatif yang semakin diurutkan, output jumlah poin setiap pemain. Anda juga dapat menggunakan daftar poin [15,12,10,9, ...] sebagai input. Perhatikan bahwa jumlah poin yang didapat setiap pemain tidak tergantung pada nilai aktual skor, tetapi bagaimana mereka membandingkannya dengan skor lainnya.

Uji Kasus

  • [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]
    • penjelasan: (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, 7 ]
    • Penjelasan: (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]
    • penjelasan: (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 ]
    • penjelasan: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4,5, (2 + 1) / 2 = 1,5

Terkait: Beri peringkat daftar skor dengan "lompati"

geokavel
sumber

Jawaban:

5

JavaScript (ES6), 57 byte

Mengambil input dalam sintaks currying (p)(s), di mana p adalah daftar poin dan s adalah daftar skor.

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

Uji kasus

Arnauld
sumber
5

R , 3 byte

Rupanya R memiliki built-in untuk ini. Mengambil daftar psalep dan sinti sebagai input.

ave

Cobalah online!

Contoh:

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
sumber
Alat yang tepat untuk pekerjaan itu!
geokavel
5
Ini harus 3 byte (hanya ave) kalau tidak hanya potongan (yang tidak diizinkan). Untungnya, ini menghemat 5 byte.
caird coinheringaahing
@caird terima kasih, Anda memang benar.
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"

Cobalah online!

Termasuk 17 byte ke hardcode nilai titik.

Xcali
sumber
4

MATL , 12 10 byte

Diskon 2 byte berkat @geokavel !

7#uti2XQw)

Input adalah vektor kolom ( ;sebagai pemisah) dari skor integer dan vektor kolom dengan titik. Output berisi hasil yang dipisahkan oleh baris baru.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

       % 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
sumber
Solusi Nics! Saya pikir Anda dapat menyimpan beberapa byte dengan tidak membulatkan ke int terdekat (tidak diperlukan).
geokavel
@geokavel Oh, kamu benar! Saya salah membaca tantangan sebagai pembulatan bulat. Terima kasih!
Luis Mendo
3

05AB1E , 12 byte

γ€g£vygFyÅAˆ

Cobalah online!

Penjelasan

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

Cobalah online!

C # (.NET Core) + menggunakan 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()

Cobalah online!

Dennis. Verweij
sumber
2

J, 15 byte

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

Cobalah online!

Mengambil daftar skor (1 2 ... 12 15 ) sebagai argumen kanan dan nilai untuk skor sebagai argumen kiri. Jika ini bukan input logis, tambahkan 1 byte untuk ~-passive untuk membalikkan urutan pengambilan input.

Mungkin ada beberapa hal untuk golf, yang termasuk

  • Penggunaan tinju saya
  • Tutup di bagian akhir

Penjelasan

Saya akan membagi ini menjadi beberapa fungsi.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe mengambil rata-rata daftar dan menggandakannya sebanyak panjang daftar
  • score skor input (argumen kiri) diberi daftar skor (argumen kanan).

avg_and_dupe

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

Ini berfungsi dengan baik karena diperlakukan sebagai dua garpu . Jika Anda masih menggaruk-garuk kepala Anda (saya tahu saya dulu), tanyakan dan saya bisa memberikan penjelasan yang lebih mendalam mengapa ini bisa terjadi.

skor

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

Jika masih membingungkan, saya juga bisa menambahkan penjelasan untuk /.-kunci, tapi saya pikir halaman wiki menjelaskannya dengan cukup baik.

cole
sumber
Perhatikan bahwa OP ditambahkan You can also take the points list [15,12,10,9,...] as input.jika itu menghemat byte Anda
Stephen
2

Python 2 , 66 byte

-8 Bytes berkat Leaky Nun.

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

Cobalah online!

benar-benar manusiawi
sumber
2

Jelly , 11 byte

ṁ⁴Œg¤Æmṁ$€F

Cobalah online!

-3 bytes berkat fireflame karena memperhatikan fitur Jelly baru: D

HyperNeutrino
sumber
Ya, mungkin terlalu lama melihat seberapa pendek solusi pada tantangan terkait.
geokavel
@geokavel hal yang mengganggu adalah bahwa kode untuk menghasilkan daftar lebih panjang dari solusi J yang satu itu; _;
HyperNeutrino
Saya lupa mengatakan bahwa Anda dapat mengambil daftar poin sebagai input juga. Saya akan menambahkan itu.
geokavel
11 byte. Menggunakan aritmatika berarti monad baru alih-alih S÷Ldan membentuk alih-alih xL, yang memungkinkan $alih-alih dua µ.
fireflame241
1
@miles Non-bersaing bukan lagi suatu hal .
Tn. Xcoder
1

Python 3 , 67 byte

lambda s,p:[sum(v for j,v in zip(s,p)if j==i)/s.count(i)for i in s]

Cobalah online!

Python 2 , 108 70 byte

lambda s,p:[1.*sum(v for j,v in zip(s,p)if j==i)/s.count(i)for i in s]

Cobalah online!

TFeld
sumber
1

Proton , 62 byte

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

Cobalah online!

Proton , 63 byte

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

Cobalah online!

Tuan Xcoder
sumber
^^ Saya baru akan mulai dengan Proton waktu berikutnya lol.
totallyhuman
1

Dyalog APL, 14 byte

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

Mengambil daftar skor sebagai argumen kiri dan daftar poin sebagai argumen benar. Tambahkan 2 byte untuk membungkusnya() jika dipanggil langsung dan bukan sebagai fungsi bernama.

{...}⌸ kelompokkan argumen kanan dengan kunci dalam argumen kiri dan terapkan fungsi dalam kawat gigi untuk masing-masing grup (operator utama).

⊂≢⍴+/÷≢ adalah garpu di mana:

+/÷≢ adalah poin rata-rata untuk grup (jumlah dibagi dengan penghitungan)

≢⍴ penghitungan ulang (mereplikasi rata-rata untuk mencocokkan jumlah item dalam kelompok)

kotak hasilnya (ini untuk menetralkan pencampuran hasil yang diterapkan operator utama)

adalah meminta dan meratakan hasil operator utama (yang merupakan vektor vektor bersarang) ke dalam daftar sederhana.

TryAPL online

Gil
sumber
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

Sangat sulit untuk mengimpor groupBydan on, jadi saya harus melakukannya sendiri.

Fungsi rata-rata akan dipersingkat segera.

Membutuhkan tanda tangan mungkin dapat dihindari dengan flag compiler.

Leif Willerts
sumber