Mario Kart ให้คะแนนด้วยความสัมพันธ์


16

ฉันพบปัญหานี้ในขณะที่ทำงานกับความท้าทายอื่นที่ฉันทำกับไซต์นี้ ในความท้าทายนั้นฉันใช้ " Mario Kart 8 Scoring " จำนวนคะแนนที่ผู้เล่นได้รับในลำดับที่kจะได้รับการแสดงโดยอาเรย์ 1 ที่มีการจัดทำดัชนีนี้: [15,12,10,9,8,7,6,7,6,5,4,3,2,1] อันดับที่ 1 ได้รับ 15 คะแนนอันดับที่ 2 ได้รับ 12 คะแนน ฯลฯ

มันง่ายพอที่จะกำหนดคะแนนเช่นนี้อย่างไรก็ตามส่วนที่ยุ่งยากมาพร้อมกับวิธีที่ฉันจัดการกับความสัมพันธ์ สิ่งที่ฉันทำคือให้คะแนนเฉลี่ยที่ผู้เล่นแต่ละคนได้รับในแต่ละตำแหน่ง ตัวอย่างเช่นหากมีการผูก 1 และ 2 ผู้เล่นทั้งสองจะได้รับ (15 +12) / 2 = 13.5 คะแนน (หมายเหตุ: คุณได้รับอนุญาตให้ปัดเศษเป็น int ที่ใกล้ที่สุดดังนั้นทั้ง 13 หรือ 14 จึงเป็นที่ยอมรับเช่นกัน) จากนั้นอันดับที่ 3-12 จะได้รับคะแนนตามปกติสำหรับตำแหน่งของพวกเขา

ท้าทาย

ได้รับ 12 จำนวนเต็มไม่เป็นลบที่เรียงลำดับลดลงส่งออกจำนวนคะแนนที่ผู้เล่นแต่ละคนได้รับ คุณสามารถใช้รายการคะแนน [15,12,10,9, ... ] เป็นอินพุตได้ โปรดทราบว่าจำนวนคะแนนที่ผู้เล่นแต่ละคนได้รับไม่ได้ขึ้นอยู่กับค่าจริงของคะแนน แต่จะเปรียบเทียบกับคะแนนอื่น ๆ ได้อย่างไร

กรณีทดสอบ

  • [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]
    • คำอธิบาย: (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 ]
    • คำอธิบาย: (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]
    • คำอธิบาย: (15 + 12 + 10 + 9) / 4 = 11.5, (8 + 7 + 6) / 3 = 7
  • [100,99,98,95,95,95,94,93,93,93,91,91] => [15,12,10, 8,8,8 , 6, 5,5 , 3, 2, 2 ]
    • คำอธิบาย: (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4.5, (2 + 1) / 2 = 1.5

ที่เกี่ยวข้อง: จัดอันดับรายการคะแนนด้วย "ข้าม"

คำตอบ:


5

JavaScript (ES6), 57 ไบต์

รับอินพุตในรูปแบบ currying (p)(s)โดยที่pคือรายการคะแนนและsคือรายการคะแนน

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

กรณีทดสอบ


5

R , 3 ไบต์

เห็นได้ชัดว่า R มีในตัวสำหรับสิ่งนี้ ใช้รายการของpoints และsแกนเป็นอินพุต

ave

ลองออนไลน์!

ตัวอย่าง:

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

เครื่องมือที่เหมาะสมสำหรับงาน!
geokavel

5
นี่ควรเป็น 3 ไบต์ (เพียงave) มิฉะนั้นเป็นเพียงตัวอย่างข้อมูล (ซึ่งไม่ได้รับอนุญาต) โชคดีที่สิ่งนี้ช่วยให้คุณประหยัด 5 ไบต์
caird coinheringaahing

@caird ขอบคุณคุณพูดถูก
BLT


4

MATL , 12 10 ไบต์

ปิด 2 ไบต์ด้วย@geokavel !

7#uti2XQw)

อินพุตเป็นเวกเตอร์คอลัมน์ ( ;เป็นตัวคั่น) ของคะแนนเต็มและเวกเตอร์คอลัมน์ที่มีคะแนน ผลลัพธ์ประกอบด้วยผลลัพธ์ที่คั่นด้วยการขึ้นบรรทัดใหม่

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

       % 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! ฉันคิดว่าคุณสามารถบันทึกไบต์โดยการปัดเศษเป็น int ที่ใกล้ที่สุด (ไม่จำเป็น)
geokavel

@geokavel โอ้คุณพูดถูก! ฉันอ่านข้อผิดพลาดขณะขอร้องปัดเศษ ขอบคุณ!
Luis Mendo

3

05AB1E , 12 ไบต์

γ€g£vygFyÅAˆ

ลองออนไลน์!

คำอธิบาย

γ              # 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 ไบต์

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

ลองออนไลน์!

C # (. NET Core) + ใช้ Linq, 170 + 23 ไบต์

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

ลองออนไลน์!


2

J, 15 ไบต์

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

ลองออนไลน์!

รับรายการคะแนน ( 1 2 ... 12 15) เป็นอาร์กิวเมนต์ด้านขวาและค่าให้คะแนนเป็นอาร์กิวเมนต์ซ้าย หากนี่ไม่ใช่อินพุตแบบโลจิคัลให้เพิ่ม 1 ไบต์สำหรับ a~ -passive เพื่อสลับลำดับที่อินพุตถูกใช้

อาจมีบางสิ่งในการเล่นกอล์ฟซึ่งรวมถึง

  • การใช้มวยของฉัน
  • หมวกที่ปลาย

คำอธิบาย

ฉันจะแบ่งมันออกเป็นสองฟังก์ชัน

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe ใช้ค่าเฉลี่ยของรายการและทำซ้ำหลาย ๆ ครั้งตามความยาวของรายการ
  • score ให้คะแนนอินพุต (อาร์กิวเมนต์ซ้าย) ที่ระบุรายการคะแนน (อาร์กิวเมนต์ขวา)

avg_and_dupe

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

มันใช้งานได้ดีมากเพราะถือเป็นส้อมสองอัน หากคุณยังคงเกาหัวของคุณ (ฉันรู้ว่าฉันเป็นครั้งแรก) ถามและฉันสามารถให้คำอธิบายในเชิงลึกมากขึ้นว่าทำไมมันทำงานเช่นนี้

คะแนน

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

หากยังคงสับสนฉันสามารถเพิ่มคำอธิบายสำหรับ/.คีย์ได้ แต่ฉันคิดว่าหน้าวิกิอธิบายได้ค่อนข้างดี


โปรดทราบว่า OP ได้เพิ่มYou can also take the points list [15,12,10,9,...] as input.ถ้าช่วยให้คุณประหยัดไบต์ใด ๆ
สตีเฟ่น


2

เยลลี่ 11 ไบต์

ṁ⁴Œg¤Æmṁ$€F

ลองออนไลน์!

-3 ไบต์ขอบคุณ fireflame สำหรับการสังเกตคุณสมบัติใหม่ของ Jelly: D


ใช่มันอาจนานเกินไปที่จะเห็นว่าการแก้ปัญหาเกี่ยวกับความท้าทายที่เกี่ยวข้องนั้นสั้นเพียงใด
geokavel

@geokavel สิ่งที่น่ารำคาญคือโค้ดที่สร้างรายการนั้นยาวกว่าโซลูชัน J ของอันนั้น; _;
HyperNeutrino

ฉันลืมที่จะนำว่าคุณสามารถใช้รายการคะแนนเป็นอินพุตได้เช่นกัน ฉันจะเพิ่มที่
geokavel

11 ไบต์ ใช้เลขคณิตใหม่ monad เฉลี่ยแทนS÷Lและเชื้อราแทนxLซึ่งจะช่วยให้แทนของทั้งสอง$ µ
fireflame241

1
@miles ที่ไม่ใช่การแข่งขันไม่ได้จริงๆสิ่งที่อีกต่อไป
Mr. Xcoder




1

Dyalog APL ขนาด 14 ไบต์

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

รับรายการคะแนนเป็นอาร์กิวเมนต์ด้านซ้ายและรายการคะแนนเป็นอาร์กิวเมนต์ที่ถูกต้อง เพิ่ม 2 ไบต์สำหรับการตัด()ถ้าเรียกใช้โดยตรงและไม่ใช่ฟังก์ชันที่มีชื่อ

{...}⌸จัดกลุ่มอาร์กิวเมนต์ขวาด้วยคีย์ในอาร์กิวเมนต์ซ้ายและใช้ฟังก์ชันเป็นวงเล็บปีกกากับแต่ละกลุ่ม (โอเปอเรเตอร์คีย์)

⊂≢⍴+/÷≢ เป็นทางแยกที่:

+/÷≢ คือคะแนนเฉลี่ยสำหรับกลุ่ม (ผลรวมหารด้วยจำนวนครั้ง)

≢⍴ tally reshape (ทำซ้ำค่าเฉลี่ยเพื่อจับคู่จำนวนรายการในกลุ่ม)

ทำกล่องผลลัพธ์ (นี่คือการต่อต้านการผสมของผลลัพธ์ที่ใช้ตัวดำเนินการคีย์)

คือเกณฑ์และแบนผลลัพธ์ของตัวดำเนินการหลัก (ซึ่งเป็นเวกเตอร์ซ้อนของเวกเตอร์) ลงในรายการอย่างง่าย

TryAPL ออนไลน์


1

Haskell, 152 ไบต์

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

มันเป็นความเจ็บปวดในการนำเข้าgroupByและonดังนั้นฉันจึงต้องทำเอง

ฟังก์ชั่นการหาค่าเฉลี่ยจะสั้นลงในไม่ช้า

ต้องการลายเซ็นอาจหลีกเลี่ยงได้ด้วยธงแปล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.