リストの平均を比較する


18

リストの平均値を取得する(例[2,6,7]

  • リストの長さを取得します。 [2,6,7] -> 3
  • リスト内の数字を合計します2 + 6 + 7 = 15
  • 合計をカウントで割ります:15 / 3 = 5

あなたは、の二つのリストの平均値を比較すべきである正の整数NMを場合は、値を返すことによって、Nがあればより高い平均、別の値を持つMが同数の場合にはより高い平均、および別のものを持っています。


I / Oルール

すべての標準入出力メソッドが許可されています。

入力

入力は、2つの個別のリスト、ネストされたリスト、またはタスクに適していると考えられるその他のものとして受け取ることができます。形式を指定してください。

出力

指定する値は明確である必要があり、少なくとも1つの非空白文字で構成する必要があります。また、実行間で一貫している必要あります(Nの単一値、Mの単一値、Tieの単一値)。回答でそれらを指定してください。値には、空でない文字列、ブール値、整数、または適切と思われるものを指定できます。


スペック

  • リストは必ずしも同じ長さではありません。

  • リストが空でないことが保証されます。


テストケース

N winsM winsおよびを選択しましたTieが、これらはほとんど自明です。

N、M->出力(平均)

[7]、[6]-> N勝(Nは7、Mは6)
[4,5]、[4,4]-> N勝(Nは4.5、Mは4)
[2,3,4]、[4,5,6]-> M勝(Nは3、Mは5)
[4,1,3]、[7,3,2,1,1,2]->ネクタイ(両方とも2.666 ...)
[100,390,1]、[89,82,89]-> N勝(Nは163.666 ...、Mは86.666 ...)
[92,892]、[892,92]->ネクタイ(リストは基本的に同じです) 
[10,182]、[12,78,203,91]->ネクタイ(両方とも96)

デフォルトの抜け穴が適用されます。説明が奨励されています!これはなので、バイト単位の最短コードが勝ちです!



選択した言語が整数のみをサポートしている場合、入力に1000を掛けることはできますか?そうすれば、計算された平均値は小数点以下3桁まで正確になります
Skidsdev

許可されて@Mayubeはい、
氏Xcoder

少なくとも1文字の出力を返す必要があります。つまり、文字または文字列を返す必要があるということですか?または、文字列値が少なくとも1文字の出力を意味しますか?
オリビエグレゴワール

@OlivierGrégoire指定する出力は少なくとも1文字の長さでなければなりません(空の文字列を返すことはできませんが、少なくとも1文字の任意の文字列、および空白以外の文字を返すことができます)。それはあなた次第です。
ミスターXcoder

回答:



15

Mathematica、15バイト

Order@@Mean/@#&

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

Function2つのリストのリストが必要です。Mean/@#入力の各リストの算術平均を取り、それらの平均はに渡されOrder-1最初のリストが勝った0場合、同点がある1場合、2番目のリストが勝った場合に戻ります。


7

JavaScript(ES6)、52 50バイト

(@Shaggyのおかげで2バイト保存されました。)

2つの50バイトソリューションを次に示します。

f=(N,M,a=eval(N.join`+`)/N.length)=>M?(a-f(M))/0:a

(N,M,A=a=>eval(a.join`+`)/a.length)=>(A(N)-A(M))/0

Nの場合は無限大、Mの場合は-Infinity、同順位の場合はNaNを返します。

最初の解決策では、再帰のために少し説明が必要になる場合があります。

関数の最初の呼び出しaで、N配列の平均として初期化されます:

a=eval(N.join`+`)/N.length

M この時点で値があるため、条件式の最初の部分が呼び出されます。

M ? (a-f(M))/0 : a  ----------    

この式内で関数が呼び出され、今度はが代入さMNます。

関数へのこの2回目の呼び出しでは、前の呼び出しでのa平均として初期化されますN-M

この関数の呼び出し中に2番目のパラメーターがないため、条件式の2番目の部分がトリガーされ、平均が返されます。

M ? (a-f(M))/0 : a  --

式をよりよく理解できるようになりました。

(a - f(M)) / 0

それは:

(the average of N  minus  the average of M) divided by 0

平均値の差は、正の数、負の数、または0になります。

差を0 で除算するとInfinity-Infinity、またはNaNになり、必要に応じて3つの異なる値が提供されます。

テストケース:


A関数パラメーターに移動して、数バイト節約できましたか?
シャギー


5

MATL、8バイト

多くの修飾子(YおよびZ)があります。短くする方法が見つかりません。sum / number_of_elements3バイトです。より良い方法かもしれませんが、-ZS見つけられません。

YmiYm-ZS

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

           % Take first input implicitly
Ym         % Mean of that input
  i        % Grab second input
   Ym      % Mean of that input
     -     % Subtract
      ZS   % Sign

1最初の入力が大きい0場合、それらが結合している-1場合、2番目の入力が大きい場合を返します。







3

APL(Dyalog)、11バイト

2つのリストのリストを要求します。1左側の平均が高い場合に印刷し、同じ平均がある¯1場合、および右側の平均が高い場合は0を印刷します。

×-/(+/÷≢)¨⎕

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

 促す

( 次の暗黙関数をそれぞれに適用します。

+/ 合計

÷ で割った

 集計

-/ それらの間にマイナスを挿入(および評価)します

× シグナム


3

Javascript、81 66 58 56バイト

ルークのおかげで15バイト節約

Justin Marinerのおかげで2バイト節約

n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n))

タイは0、Mは1、Nは-1です。カリー化構文を使用して呼び出されます。f([7])([6])


1
これをかなり数バイト改善できます。変数の割り当てを削除し、カレー構文を使用し、アラートを削除し、を使用して配列を簡単に合計できますeval(a.join`+`)a=>(b=a.map(c=>eval(c.join`+`)/c.length))[0]-b[1]?b[0]>b[1]:061バイト。入力を配列の配列として受け取り、Mの場合とNの0場合の引き分けを出力しますtruefalse
ルーク

自分の答えとして投稿してみませんか?
SuperStormer

1
a初めて使用するときに関数()をインライン化することで、さらに2バイト節約できますn=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n))
ジャスティンマリナー


3

Haskell、65 43バイト

nimiのおかげで22バイト節約されました!

a x=sum x/sum[1|_<-x] 
x#y=compare(a x)$a y

もっと良い方法が必要です...しかし、型変換は私を台無しにしました。

使用法

(#) [7] [6]

戻り値 GT最初の引数が勝ったLT場合、2番目の引数が勝ったEQ場合、およびそれらが同点の場合を。

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


1
でキャストsum$xする必要はありませんf.。また、length xに置き換えるsum[1|_<-x]ことができるため、f完全に取り除くことができます:a x=sum x/sum[1|_<-x]
-nimi

あ、いいね!それをすることさえ考えませんでした。
ヘンリー

1
...ああとで#...(a x)$a y
-nimi

1
...さらに良い方法:メイン関数でポイントフリーになり、その名前を保存することもできます:(.a).compare.a。使用法:( (.a).compare.a ) [7] [6]
-nimi

2
もう1つ:[1|_<-x]と同じ(1<$x)です。
nimi

3

J、10バイト

*@-&(+/%#)

左側に1つのリスト、右側に1つのリストがあります。左平均が小さい場合は_1、大きい場合は1、等しい場合は0を返します

  • (+/%#) リストの平均を計算するための標準のJフォークです
  • &二項フォークのバリエーションを提供します。両方の引数に右側(この場合は平均動詞)を適用し、左側の動詞に渡します。この場合は...
  • *@- 減算の後に「符号」:右側の平均が左側から減算され、結果の符号が与えられます-_1、1、または0

3

Pyth、10 8 7 6バイト

バイトを保存してくれてありがとう@isaacg

._-F.O

入力はネストされたリストとして取得され[N, M]ます。出力-1の場合N < M1もしN > Mおよび0 ifが等しい場合にます。

オンラインで試す


あなたは置き換えることにより、バイトを保存することができh.+-F
isaacg

3

TI-Basic、25 21 13 12 10バイト

lirtosiastのおかげで-2バイト

:tanh(ᴇ9mean(L₁-mean(L₂

2
これはAnsCmean(L₁)>mean(L₂:Ans+3(mean(L₁)=mean(L₂、21バイトの代わりに使用することでゴルフできます。
スコットミルナー

あなたは削除することができます()
リルトシアスト

2

ゼリー、7 バイト

S÷Lµ€IṠ

N,Mを返す2つのリストのリストを受け入れるモナドリンク:
[-1]for N;
[1]のためにM; そして
[0]ネクタイのために。
完全なプログラムとして、それは(単一項目リストはその内容だけを印刷し、その結果を印刷し-11または0)。

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

どうやって?

S÷Lµ€IṠ - Link: list of lists, [N,M]
   µ€   - perform the chain to the left for €ach (of N, M)
S       -   sum
  L     -   length
 ÷      -   divide (yields the average)
     I  - incremental differences (yields [avg(M) - avg(N)])
      Ṡ - sign (yields: [1] if avg(M)>avg(N); [-1] if avg(N)>avg(M); or [0] if equal)

私はジェリーがこの挑戦でかなり上手であることを知っていました、私は言語をあまりよく知りません。私を破ってうまくやった:P
Okx

これは、たとえば5 ...では不可能だという100%の確信はありません!
ジョナサンアラン

@JonathanAllan私は?あなたが最短(私は仮定)の対応を使用して、基本的に、あなたはまだ組み込みではない平均的機能を、マップの平均値を取得しS÷L、その後、あなたは経由シングルリンクに変換S÷¥L$に短縮することができS÷Lµ、それは時だからプログラムの非常に開始してから、マップに右を配置し、使用する比較用のビルトインがないので、3つの異なるcmp出力である_/Ṡため短縮できIṠます...また、5は私がFGITWしたので助けにはなりません。:)
エリック・ザ・アウトゴルファー


2

JavaScript(ES6)、60バイト

a=>(b=(c=a.map(d=>eval(d.join`+`)/d.length))[0])-c[1])?b>0:0

出力0のためTietrueNfalseM


2

JavaScript(ES6)、60 54バイト

@Lukeと@Neilのおかげで-6バイト

(i,[x,y]=i.map(v=>eval(v.join`+`)/v.length))=>y-x&&x>y

入力を2要素配列として受け取ります[N, M]。出力true0またはfalseのためにNTieあるいはMそれぞれ。

説明

(i,                 // input array: [N, M]
    [x,y] =         // destructure assignment: set x and y to...
    i.map(v=>       // the input values mapped as...
        eval(v.join`+`) // the sum, by joining the array with +
        / v.length      // divided by the length
    )
) => y-x && x>y     // return 0 for tie, or the result of avg(N) > avg(M)

テストスニペット

スペース/コンマで区切られた入力番号。


1
おそらくで置き換えることでMath.sign(y-x)、いくつかのバイトを節約できますy-x?x>y:0。出力0のためTietrueNfalseM
ルーク

1
x-y&&x>yたぶん?
ニール

@ニールニース、さらに良い
ジャスティンマリナー

2

ピップ、13バイト

{$CM$+*a/#*a}

これはリストのリストを取得する関数です。1最初の平均が大きい-1場合、2番目の平均が大きい場合、0結び付けられている場合に返します。ここですべてのテストケースを実行します。

バックグラウンド

このソリューションは、Pipの2つのメタ演算子を多用しています。

  • $、折ります。二項演算子を取り、それをリストの要素間に適用します。たとえば、+追加ですが$+、リストを合計します。$二項演算子を単項演算子にすることに注意してください。
  • *、マップ。単項演算子を取り、リストの各要素に適用します。例えば、#リストの長さを与えるが、#*リストの項目の長さ(のリスト)を得ます。
  • これらの2つのメタ演算子は組み合わせることができます。$+*リスト上でマップを折り畳んだりプラスしたりして、リストの各要素を合計します。

Pipについて知っておくべきもう1つのことは、多くのオペレーターがデフォルトでリストを項目ごとに処理することです。たとえば、[1 2 3] * 5与える[5 10 15]; [1 2 3] * [2 3 4]与える[2 6 12]; そして[[1 2] [3 4]] * [5 6]与える[[5 10] [18 24]]

説明

以下の入力例を使用します[[2 3 4] [2 3 4 6]]

  • {...}
    関数を定義します。(最初の)引数はローカル変数にバインドされますa
  • #*a
    #関数の引数に マップし、サブリストの長さを取得します。結果:[3 4]
  • a/#*a
    のサブリスト(の要素)をaそれぞれの長さで分割します。結果:[[0.667 1 1.333] [0.5 0.75 1 1.5]]
  • $+*a/#*a
    $+その結果に マップ(追加時に折り畳み)して、サブリストを合計します。結果:[3 3.75]
  • $CM$+*a/#*a
    上のを折りたたみますCM。これは-1、2つのオペランド(Pythonのような)の比較に応じて、、、0またはを与え1ますcmp。結果:(-1なぜなら3より小さいため3.75)。

アイデンティティ関数を含む式を記述することにより、Pipで関数を定義することもできます_。たとえば、_*_は、引数を2乗する関数です-の構文糖{a*a}、およびバイト数を減らします。ただし、現在のバージョンのインタープリターに_は、*メタオペレーターでの作業を妨げるバグがあります。これが修正されると、このソリューションは11バイトになります$CM$+*_/#*_


2

C(gcc)、91 98 バイト

u,v,j;f(x,y,a,b)int*a,*b;{for(u=v=0;x--;u+=a[x])for(j=0;j<y;)v+=b[j++];j=u*y-v;x=j>0?2:!j;}

Cの間違った場所であり、おそらく除算を必要としない唯一の答えです。少なくとも、コードはスライダーなしで表示されます。

M>NM=Nに対してM<Nそれぞれ0、1、2を返します。入力をlength of Mlength of NMN


仕様内で引数として長さを取っていますか?これらの多くから重要なコードを切り取ります。
ヘンリー

Cが配列の長さを取得する別の方法があるかどうかはわかりません。長さ自体は、配列の本質的な部分に似ています。
キーガン

2

Brachylog、8バイト

⟨+/l⟩ᵐ-ṡ

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

出力は1最初のリストが大きく平均を持っている場合、-1第二のリストが大きく平均を持っている、とされ0、それらが接続されています。

説明

     ᵐ        Map:
⟨   ⟩           Fork:
 +                Sum…
  /               …divided by…
   l              …length
       -      Subtract
        ṡ     Sign

2

Java、105バイト

s->s.stream().map(l->l.stream().reduce((i,j)->i+j).get()/l.size()).reduce((i,j)->Math.signum(i-j)).get();

許容入力に従って、ネストされたリストを取得するラムダ。

リストのリストをストリーミングし、両方を平均値に変換してから、差の符号を返します。同点の1場合、最初のリストが大きい-1場合、2番目のリストが大きい場合0


「何でも入力できる」のでStream私がやっように sを直接使ってください。
オリビエグレゴワール

2

R 38 34バイト

function(a,b)sign(mean(a)-mean(b))

入力として2つの数値ベクトルを受け取る関数。最初のリストの平均が高い場合は1を返し、同じ場合は0を返し、2番目のリストの平均が高い場合は-1を返します。


1
これは、割り当てなしで呼び出すことができる匿名関数ですか?Rはわかりませんが、もしそうならあなたは必要ありませんf=
小麦ウィザード

@WheatWizardあなたは正しいです。さらに{}、関数本体からを削除できます。
ジュゼッペ

入力いただきありがとうございます。codegolfでの私の最初の試みです。
ゼライト

2

MATL、6バイト

そんなに意地悪しないでください!*

!-ssZS

入力スタック順:

M
N

出力:

 1 = N wins  
-1 = M wins  
 0 = tie

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

!-ssZS
========
!           % transpose M
 -          % N - M^T using elementwise subtraction and implicit expansion
  s         % sum columns of the result
   s        % sum the resulting row vector
    ZS      % sign of the sum

*この回答は、貧弱で無防備な数字を意味することなくゴルフされました。


2

Java(OpenJDK 8)76 62バイト

a->b->Math.signum(a.average().orElse(0)-b.average().orElse(0))

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

入力は何でも構いませんので、IntStreamsを入力として使用することにしました。このような入力は、標準int[]を使用して取得できますArrays.stream(array)

出力は1、「N勝」、-1「M勝」、および0同点です。

保存する

  • @Zirconと@Xanderhallの両方の洞察から-14バイト!

入力を選択する方法は本当に賢いです!
デビッドコンラッド

1
@DavidConrad私は実際に昨日からこの回答の長いバージョンを持っていました(ちょうど追加しますjava.util.Arrays.stream(array).map(java.util.Arrays::stream))。今日この質問を読み直したときに初めて、この入力形式が他と同じように有効だと思いました。
オリビエグレゴワール

1
.orElse(0)実行可能な短縮.getAsDouble()でしょうか?
ジルコン

1
あなただけではなく、入力用の2つのストリームを取る場合は、(a,b)->Math.signum(a.average().orElse(0)-b.average().orElse(0));64バイトである
Xanderhall

これらは良いアイデアだけです、みんな!続ける:p
オリビエグレゴワール

1

Dyalog APL、14バイト

×(-/(+/÷≢)¨∘⊢)

1左が大きい¯1場合、右が0同点の場合。

どうやって?

¨∘⊢ 各リストについて

+/÷≢平均を計算します(+/合計÷長さで除算します)

-/ 平均を引く

× 結果のサイン


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.