带领带的马里奥赛车得分


16

我在为该网站提出另一个挑战时遇到了这个问题。在这项挑战中,我使用“ Mario Kart 8 Scoring ”。玩家在第k位获得的积分数量由此1索引数组表示:[15,12,10,9,8,7,6,5,4,3,2,1]。因此,第一名获得15分,第二名获得12分,依此类推。

像这样分配点很容易,但是棘手的部分是如何处理领带的。我要做的是给每个并列玩家平均每个并列位置的得分。例如,如果只有第1名和第2名并列,则两个玩家都将获得(15 + 12)/ 2 = 13.5分。(注意:允许四舍五入到最接近的整数,因此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,127,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,92,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

相关:用“跳过”对得分列表进行排名

Answers:


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具有此功能。将p软膏和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

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

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

在线尝试!

包括17个字节,用于对点值进行硬编码。


4

MATL12个 10字节

多亏@geokavel 2个字节!

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哦,对了!我将挑战理解为重新舍入。谢谢!
路易斯·门多

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

J,15个字节

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

在线尝试!

将得分列表(1 2 ... 12 15)作为右手参数,将要得分的值作为左手参数。如果这不是逻辑输入,请为~-passive 添加1字节以反转输入的顺序。

打高尔夫球可能有几件事,包括

  • 我对拳击的使用
  • 底盖

说明

我将其分为几个功能。

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

如果仍然令人困惑,我还可以为/.-key 添加一个解释,但是我认为Wiki页面可以很好地解释它。


请注意,You can also take the points list [15,12,10,9,...] as input.如果这样可以节省您任何字节,则添加OP
Stephen于2008年


2

果冻,11字节

ṁ⁴Œg¤Æmṁ$€F

在线尝试!

-3个字节,感谢fireflame注意到了Jelly的新功能:D


是的,寻找相关挑战的解决方案有多短可能太久了。
geokavel

@geokavel令人讨厌的是,用于生成列表的代码比该代码上的J解决方案长;
HyperNeutrino

我忘了说您也可以将积分列表作为输入。我要补充一点。
geokavel

11个字节。使用新的算术平均数monad代替S÷L和mould代替xL,允许$代替2 µ
fireflame241





1

Dyalog APL,14个字节

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

将分数列表作为左参数,将分数列表作为右参数。添加2个字节用于包装()如果直接调用而不是作为命名函数则。

{... }⌸通过按左参数中的键将右参数分组,然后将大括号中的函数应用于每个组(键运算符)。

⊂≢⍴+/÷≢ 是一个叉子,其中:

+/÷≢ 是组的平均分(总和除以计数)

≢⍴ 理清整形(复制平均值以匹配组中的项目数)

框结果(这是为了抵消关键运算符应用的结果的混合)

是enlist并将key运算符(这是向量的嵌套向量)的结果扁平化为一个简单列表。

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

导入很痛苦groupByon很,所以我必须自己做。

平均功能将很快缩短。

使用编译器标志可以避免需要签名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.