ネクタイ付きマリオカートスコアリング


16

私はこのサイトのために作っている別の挑戦に取り組んでいる間、この問題に遭遇しました。そのチャレンジでは、「マリオカート8スコアリング」を利用します。k位のプレーヤーが獲得するポイントの量は、この1インデックス配列[15,12,10,9,8,7,6,5,4,3,2,1]で表されます。したがって、1位には15ポイント、2位には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 ]
    • 説明:(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

関連:「スキップ」でスコアのリストをランク付けする

回答:


5

JavaScript(ES6)、57バイト

入力をカリー化構文(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ありがとう、あなたは絶対に正しい。
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ソリューション!最も近い整数に丸めないことで、いくつかのバイトを節約できると思います(必須ではありません)。
-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

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)を右側の引数として、スコアリングする値を左側の引数として使用します。これが論理入力でない場合は、~-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

これは2つのフォークとして扱われているのでとてもうまく機能しますます。まだ頭をかいている場合(最初はそうだったと思います)、尋ねてください。これがなぜ機能するのかについて、より詳細な説明を提供できます。

スコア

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


2

ゼリー、11バイト

ṁ⁴Œg¤Æmṁ$€F

オンラインでお試しください!

新しいJelly機能に気付くためのfireflameのおかげで-3バイト:D


ええ、おそらく、関連する課題の解決策がどれほど短いかを考えるのは長すぎるでしょう。
-geokavel

@geokavel面倒なことは、リストを生成するコードがそのJソリューションよりも長いことです; _;
ハイパーニュートリノ

ポイントリストを入力として使用できることを忘れていました。それを追加します。
-geokavel

11バイト。新しい算術平均モナドの代わりに使用しS÷L、金型の代わりにxLでき、$2つの代わりにµ
fireflame241





1

Dyalog APL、14バイト

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

スコアのリストを左引数として、ポイントリストを右引数として使用します。ラップするために2バイトを追加します()名前付き関数としてではなく、直接呼び出さ場合ます。

{... }⌸右引数を左引数のキーでグループ化し、中括弧内の関数を各グループに適用します(キー演算子)。

⊂≢⍴+/÷≢ フォークです:

+/÷≢ グループの平均ポイント(合計を集計で割った値)

≢⍴ 集計の変更(グループ内のアイテムの数と一致するように平均を複製します)

結果をボックス化します(これは、キーオペレーターが適用する結果の混合を打ち消すためです)

は、enlistであり、キー演算子(ネストされたベクトルのベクトル)の結果を単純なリストにフラット化します。

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.