Mario Kart chấm điểm w / Ties


16

Tôi gặp vấn đề này trong khi thực hiện một thử thách khác mà tôi đang thực hiện cho trang web này. Trong thử thách đó, tôi sử dụng " Mario Kart 8 chấm điểm ". Số lượng điểm mà người chơi ở vị trí thứ k nhận được được biểu thị bằng mảng 1 chỉ mục này: [15,12,10,9,8,7,6,5,4,3,2,1]. Vì vậy, vị trí thứ nhất được 15 điểm, vị trí thứ 2 được 12 điểm, v.v.

Thật dễ dàng để gán các điểm như thế này, tuy nhiên phần khó khăn đi kèm với cách tôi xử lý các mối quan hệ. Những gì tôi làm là cung cấp cho mỗi người chơi buộc trung bình số điểm cho mỗi vị trí buộc. Ví dụ: nếu chỉ ràng buộc thứ 1 và thứ 2, thì cả hai người chơi sẽ nhận được (15 + 12) / 2 = 13,5 điểm. (Lưu ý: Bạn được phép làm tròn đến số int gần nhất, vì vậy cả 13 hoặc 14 đều được chấp nhận.) Sau đó, vị trí thứ 3 - 12 có được số điểm bình thường cho vị trí của họ.

Thử thách

Cho 12 điểm số nguyên không âm được sắp xếp tăng dần, xuất ra số điểm mỗi người chơi được. Bạn cũng có thể lấy danh sách điểm [15,12,10,9, ...] làm đầu vào. Lưu ý rằng số điểm mà mỗi người chơi đạt được không phụ thuộc vào giá trị thực của điểm số, mà là cách họ so sánh với các điểm khác.

Các trường hợp thử nghiệm

  • [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]
    • giải thích: (12 + 10 + 9) / 3 = 10.3333
  • [1,1,1,1,1,1,1,1,1,1,1,1] => [ 7,7,7,7,7,7,7,7,7,7,7, 7 ]
    • giải thích: (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]
    • giải thích: (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 ]
    • giải thích: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4.5, (2 + 1) / 2 = 1.5

Liên quan: Xếp hạng danh sách điểm số với "bỏ qua"

Câu trả lời:


5

JavaScript (ES6), 57 byte

Đưa đầu vào theo cú pháp currying (p)(s), trong đó p là danh sách các điểm và s là danh sách điểm.

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

Các trường hợp thử nghiệm


5

R , 3 byte

Rõ ràng R có tích hợp sẵn cho việc này. Lấy một danh sách các thuốc pmỡ và slõi làm đầu vào.

ave

Hãy thử trực tuyến!

Thí dụ:

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

Công cụ phù hợp cho công việc!
geokavel

5
Đây phải là 3 byte (chỉ ave) nếu không nó chỉ là một đoạn (không được phép). May mắn thay, điều này giúp bạn tiết kiệm 5 byte.
caird coinheringaahing

@caird cảm ơn, bạn hoàn toàn đúng.
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"

Hãy thử trực tuyến!

Bao gồm 17 byte để mã hóa các giá trị điểm.


4

MATL , 12 10 byte

Giảm 2 byte nhờ @geokavel !

7#uti2XQw)

Đầu vào là một vectơ cột ( ;như dấu phân cách) của điểm số nguyên và vectơ cột với các điểm. Đầu ra chứa các kết quả được phân tách bằng dòng mới.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

       % 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

Giải pháp Nics! Tôi nghĩ bạn có thể lưu một số byte bằng cách không làm tròn đến int gần nhất (không bắt buộc).
geokavel

@geokavel ơi, bạn nói đúng! Tôi đọc sai các thách thức như yêu cầu làm tròn. Cảm ơn!
Luis Mendo

3

05AB1E , 12 byte

γ€g£vygFyÅAˆ

Hãy thử trực tuyến!

Giải trình

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

J, 15 byte

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

Hãy thử trực tuyến!

Lấy danh sách điểm số ( 1 2 ... 12 15) làm đối số bên phải và các giá trị để ghi điểm dưới dạng đối số bên trái. Nếu đây không phải là đầu vào logic, hãy thêm 1 byte cho một ~giao diện để đảo ngược thứ tự thực hiện đầu vào.

Có thể có một vài điều để chơi gôn, bao gồm

  • Cách sử dụng quyền anh của tôi
  • Cái mũ ở cuối

Giải trình

Tôi sẽ chia nó thành một vài chức năng.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe lấy trung bình của một danh sách và sao chép nó nhiều lần bằng độ dài của danh sách
  • score chấm điểm một đầu vào (đối số bên trái) cho một danh sách các điểm số (đối số bên phải).

avg_and_dupe

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

Điều này hoạt động rất độc đáo bởi vì nó được coi là hai dĩa . Nếu bạn vẫn gãi đầu (tôi biết tôi là người đầu tiên), hãy hỏi và tôi có thể cung cấp một lời giải thích sâu hơn về lý do tại sao điều này hoạt động như nó.

ghi bàn

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

Nếu nó vẫn còn khó hiểu, tôi cũng có thể thêm một lời giải thích cho /.-key, nhưng tôi nghĩ rằng trang wiki giải thích nó khá tốt.


Lưu ý rằng OP đã thêm You can also take the points list [15,12,10,9,...] as input.nếu điều đó giúp bạn tiết kiệm bất kỳ byte nào
Stephen


2

Thạch , 11 byte

ṁ⁴Œg¤Æmṁ$€F

Hãy thử trực tuyến!

-3 byte nhờ fireflame để nhận thấy các tính năng mới của Jelly: D


Vâng, có lẽ đã quá lâu để xem các giải pháp cho thách thức liên quan ngắn đến mức nào.
geokavel

@geokavel điều khó chịu là mã để tạo danh sách dài hơn giải pháp J trên đó; _;
HyperNeutrino

Tôi quên đặt rằng bạn cũng có thể lấy danh sách điểm làm đầu vào. Tôi sẽ thêm điều đó.
geokavel

11 byte. Sử dụng đơn nguyên trung bình số học mới thay vì S÷Lvà khuôn thay vì xL, cho phép $thay vì hai µ.
fireflame241





1

APL Dyalog, 14 byte

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

Lấy danh sách điểm số làm đối số bên trái và danh sách điểm là đối số bên phải. Thêm 2 byte để gói nó ()nếu được gọi trực tiếp và không phải là một hàm được đặt tên.

{... }⌸nhóm đối số phải theo khóa trong đối số bên trái và áp dụng hàm trong dấu ngoặc cho mỗi nhóm (toán tử khóa).

⊂≢⍴+/÷≢ là một ngã ba trong đó:

+/÷≢ là điểm trung bình cho nhóm (tổng chia cho kiểm đếm)

≢⍴ định hình lại kiểm đếm (sao chép mức trung bình để khớp với số lượng vật phẩm trong nhóm)

hộp kết quả (điều này là để chống lại sự pha trộn kết quả mà toán tử khóa áp dụng)

là liệt kê và làm phẳng kết quả của toán tử khóa (là một vectơ lồng nhau) vào một danh sách đơn giản.

Dùng thử trực tuyến


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

Đó là một nỗi đau để nhập khẩu groupByonvì vậy tôi phải tự làm.

Chức năng trung bình sẽ được rút ngắn trong thời gian ngắn.

Cần chữ ký có thể tránh được với cờ biên dịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.