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"

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


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

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.


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

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

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!


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.


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


2

Jelly , 11 byte

ṁ⁴Œg¤Æmṁ$€F

Cobalah online!

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


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

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.