リストのモード(最も一般的な要素)


26

スニペットを記述して、正の整数のリストのモード(最も一般的な数)を計算します。

たとえば、モード

d = [4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]

1、それは5倍の最大値を発生するので、。

リストは、などの変数に格納されd、一意のモードを持っていると想定できます。

例:Python、49

max(((i,d.count(i))for i in set(d)), key=lambda x:x[1])

これはであるため、バイト単位の最短ソリューションが優先されます。

回答:


5

K5、6バイト

*>#:'=

グループ()の各()のカウントの*降順要素(>)の最初()。ステップバイステップ:#:'=

  i
4 3 1 0 6 1 6 4 4 0 3 1 7 7 3 4 1 1 2 8

  =i
4 3 1 0 6 7 2 8!(0 7 8 15
 1 10 14
 2 5 11 16 17
 3 9
 4 6
 12 13
 ,18
 ,19)

  #:'=i
4 3 1 0 6 7 2 8!4 3 5 2 2 2 1 1

  >#:'=i
1 4 3 7 6 0 8 2

  *>#:'=i
1

ブラウザで試してみてください


29

Python 2〜18

max(d,key=d.count)

あなたのPythonの答えは印刷されないようですので、私はこれがあなたが望むものであることを期待しています。

print通常は6バイトを追加します。


完璧です、@ globbyは未来を見る必要があると思います:)
garg10may 14

12
これについての素晴らしいところは、それがゴルフでさえなくて、それがただPythonicであることです。ゴルフされているのは、d,との間のスペースだけですkey=
wchargin 14

5
@WChargin:ええ、Pythonicはdefaultdict(int)またはを使用して2次ランタイムを回避しますCounter。のようなものCounter(d).most_common()[0]
user2357112は、Monicaを14

25

Matlab / Octave、7 5バイト

当然のことながら、モードを見つけるための組み込み関数があります。無名関数として:

@mode

これにより、入力ベクトルで最も一般的に発生する要素が返され、より小さな値に結び付けられます。

デニスのおかげで2バイト節約できました!


3
+1、明らかに仕事に適したツール。ビルトインなので、最高周波数が複数ある場合はどうなりますか?
レベルリバーセント14

2
@steveverrillドキュメント(type help mode)によると:「2つ以上の値が同じ頻度である場合、「モード」は最小値を返します。」
wchargin 14

1
名前のない関数は許可されているようです(受け入れられた答えは1つです)ので、これをに短縮できます@mode
デニス

@デニスありがとう!サイトで最初の回答を編集するのは奇妙な気持ちだと認めていますが。
アレックスA.

16

パイス -6

eo/QNQ

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

のようなstdinへの入力を期待します[4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]。Pythonは安定した並べ替えを実行するため、最後に出現することで関係が解決されます。

リスト内の値をカウントしてリストをソートし、リストの最後の番号を出力します。

Qたとえば、前に値を含むdように初期化した場合に置き換えることができますd=d[4 3 1 0 6 4 4 0 1 7 7 3 4 1 1 2 8)

Python風の擬似コード:

Q=eval(input());print(sorted(Q,key=Q.count)[-1])

完全な説明:

            : Q=eval(input()) (implicit)
e           : ... [-1]
 o   Q      : orderby(lambda N: ...,Q)
  /QN       : count(Q,N)

Pythのorderby正確Pythonのような実行sortedしてorderbyいるの最初の引数keyの引数。


11

Mathematica、25バイト

Last@SortBy[d,d~Count~#&]

または

#&@@SortBy[d,-d~Count~#&]

チャレンジと同様に、これはリストがに保存されることを想定していますd

または... 15バイト

もちろん、組み込みのMathematicaがない場合、MathematicaはMathematicaになりません。

#&@@Commonest@d

Commonest(タイの場合)すべての最も一般的な要素のリストを返し、#&@@golfedありますFirst@


mthmcaの別のケース
マイケルスターン

9

ルビー、22バイト

d.max_by{|i|d.count i}

基本的にはMathematicaの答えの移植版ですが、Rubyには直接的なものがあるmax_byため、最初にソートする必要はありません。


1
私は提案しようとしてd.max_by d.method:countいましたが、それは約100万(別名2でもない)バイトです。それでも、それが可能であることは注目に値します。
ファンドモニカの訴訟

9

R、33 25バイト

ヘルプ短縮に@Hughに感謝します。

names(sort(-table(d))[1])

オリジナル:

v=table(d);names(v[which.max(v)])

これは、ベクターの各要素の頻度を計算しd、最大値を含む列の名前を返します。返される値は、実際には数値を含む文字列です。それは大丈夫ではないことをどこにも言わなかったので...

これを短縮するための提案は大歓迎です!


2
names(sort(-table(d))[1])
ヒュー14

9

CJam、11 10バイト

A{A\-,}$0=

という変数の配列を想定していますA。これは基本的に、配列内の各数値の出現に基づいて配列をソートし、配列の最後の要素を選択します。

使用例

[1 2 3 4 4 2 6 6 6 6]:A;A{aA\/,}$W=

出力

6

デニスのおかげで1バイト節約できました!

こちらからオンラインでお試しください


A{A\-,}$0=1バイト短くなります。
デニス14

1
0.6.5のとおり、それは8つのバイトでなんとかです:Ae`$e_W=
マーティン・エンダー

@MartinEnderうーんいいえ。最初にソートする必要があることは知っていました。
エリックアウトゴルファー16

@ErikGolferエリックゴルファーおっと、あなたは右、9バイト必要があります:$e`$e_W=
マーティン・エンダー

8

Powershell 19

($d|group)[0].Count

(これは、配列がすでにオンになっていると仮定しています$d



6

JavaScript(ES6)51

プリロードされた変数dを使用する1行の式。頻度で配列をソートし、最初の要素を取得します。
厄介な副作用、元の配列が変更されます

d.sort((a,b)=>d.map(w=>t+=(w==b)-(w==a),t=0)&&t)[0]

いつものように、.reduceの代わりに.mapを使用すると、全体として1文字短くなります。.reduceを使用すると、ほとんどクリーンでゴルフのないソリューションになります。

d.sort((a,b)=>d.reduce((t,w)=>t+(w==b)-(w==a),0))[0]

最後に、元の配列を変更せず、グローバル(62バイト)なしで関数を使用するソリューション:

F=d=>[...d].sort((a,b)=>d.reduce((t,w)=>t+(w==b)-(w==a),0))[0]

FireFox / FireBugコンソールでテストする

d=[4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]
d.sort((a,b)=>x.map(w=>t+=(w==b)-(w==a),t=0)&&t)[0]

出力 1

d配列は次のようになります。

[1, 1, 1, 1, 1, 4, 4, 4, 4, 3, 3, 3, 0, 6, 6, 0, 7, 7, 2, 8]

5

Python-32

max((x.count(i),i)for i in x)[1]

正直なところ、18文字のソリューションは将来どこにも見られません。

編集:私は修正され、感銘を受けました。


4

JavaScript、ES6、71バイト

少し長く、たくさんゴルフできます。

f=a=>(c=b=[],a.map(x=>b[x]?b[x]++:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())

これにより、のfように呼び出すことができf([1,1,1,2,1,2,3,4,1,5])、を返す関数が作成されます1

最新のFirefoxのコンソールで試してください。


トピック外ですが、ユーザー名がPCG.SEにどの程度関連しているかに気付きました。:P
nyuszika7h 14

@ nyuszika7hへへ。このユーザー名は、PPCGが存在することを知る前からありましたが。
オプティマイザー14

f=a=>(c=b=[],a.map(x=>b[x]++-1?0:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())1バイト短くなります。
バリント

4

05AB1E、3バイト

(非競合-質問は言語より前のものです)

.MJ

説明:

.M  # Gets the most frequent element in the [implicit] input
  J # Converts to a string, needed as the program would output "[1]" instead of "1" without this.

入力を使用する代わりに変数に配列を保存する場合は、プログラムの開始時に配列をスタックにプッシュするだけです。

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


3

C#-49

C#を使用して実際に競合することはできませんが、まあ:

仮定するとはd配列です

d.GroupBy(i=>i).OrderBy(a=>a.Count()).Last().Key;


3

bash- 29 27文字

sort|uniq -c|sort -nr|sed q

それを使用して:

sort|uniq -c|sort -nr|sed q
4
3
1
0
6
1
6
4
4
0
3
1
7
7
3
4
1
1
2
8
[ctrl-D]
5 1

つまり、「1」がモードであり、5回表示されます。


sort|uniq -c|sort -nr|sed q数人のキャラクターを救う
デジタルトラウマ14

私は同じ答えを投稿しましたが、あなたはより速かったです:)
pgy 14

@pgy-ありがとう-更新しました!

3

GolfScript、10バイト

a{a\-,}$0=

この回答から私はGolfScriptでのゴルフのヒントを書きました。という配列の入力を予期し、aスタックに結果を返します。(スタック上の配列から入力を読み取るには:、11バイトを追加します。標準入力から入力を読み取るには(形式[1 2 1 3 7])、~12バイトを追加します。)

このコードは、入力配列を反復処理し、元の配列から各要素を減算し、残っている要素の数をカウントすることで機能します。これは、元の配列をソートするキーとして使用され、ソートされた配列の最初の要素が返されます。

オンラインデモ。

追伸 この挑戦を指摘してくれたピーターテイラーに感謝します


3

Dyalog APL、12文字

d[⊃⍒+/∘.=⍨d]

∘.=⍨dは、と同じですがd∘.=d、の再帰的な外積です=。の要素のすべてのペアを比較するブール行列を作成しdます。

+/ 軸の1つに沿ってその行列を合計し、ベクトルを生成します。

ベクトルを等級付けします。つまり、インデックスで並べ替えます。(グリフが示唆するように、降順で評価し、昇順で評価します。)

グレーディングから最初のインデックス、つまりの最大要素のインデックスを取得しますd

d[...] その要素を返します。


+/∘.=⍨dの各要素についてカウントしますd⊢∘≢⌸dはの各要素に対してカウントする∪dため、インデックスはのインデックスに対応しませんd。反例:d←1 1 2 2 2。動作させるには:(∪d)[⊃⍒⊢∘≢⌸d]または(⊃⍒⊢∘≢⌸d)⊃∪d
ngn 14

3

Perl 6、21バイト

.Bag.invert.max.value

例:

$_ = < 4 3 1 0 6 1 6 4 4 0 3 1 7 7 3 4 1 1 2 8 >».Int;

say .Bag.invert.max.value; # implicitly calls $_.Bag…

タイがある場合、タイの大きい方を印刷します。


.Bagリストまたは配列のメソッドは、指定された値がその値に表示された回数の総数を関連付ける定量化されたハッシュを作成します。

bag(4(4), 3(3), 1(5), 0(2), 6(2), 7(2), 2, 8)

この.invertメソッドは、キーと値が交換されたバッグ内のペアのリストを作成します。(これを呼び出す理由は、次のメソッドが必要なことを行うためです)

4 => 4,  3 => 3,  5 => 1,  2 => 0,  2 => 6,  2 => 7,  1 => 2,  1 => 8

.maxList of Pairs のメソッドは、最初にキーを比較し、タイが値を比較する場合、最大のペアを返します。
(これは、multi infix:<cmp>(Pair:D \a, Pair:D \b)どちらが大きいかを決定する方法であるためです)

5 => 1

この.valueメソッドは、ペアから値を返します。(.invert以前の呼び出しではなかった場合、それは我々が求めていたキーだったでしょう)

1

同点の場合に結びついたすべての値を返したい場合:

say @list.Bag.classify(*.value).max.value».key

この.classifyメソッドは、キーが*.value各ペアでWhatever lambda を呼び出しているペアのリストを返します  。

1 => [2 => 1, 8 => 1],
2 => [0 => 2, 6 => 2, 7 => 2],
3 => [3 => 3],
4 => [4 => 4],
5 => [1 => 5]

次に.max、最大のペアを取得するために呼び出します。

"5" => [1 => 5]

.valueバッグからオリジナルのペアを取得するための呼び出し(この場合は1つのみ)

1 => 5

次に、リスト内のすべてのペアでメソッド>>.keyを呼び出すために使用し.key、最も見られた値のリストを作成します。

1

2

Java 8:184バイト

Stream.of(A).collect(Collectors.groupingBy(i -> i, Collectors.counting())).entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).findFirst().get().getKey();

入力AはtypeでなければなりませんInteger[]。注意java.util.*してjava.util.stream.*、彼らは取り残されoneliner必要性はしかし精神で、インポートします。


...によるダウン投票
PoweredByRice

2年以上経っていますが、でスペースを削除できます(i->i,Collectors.counting())
ケビンCruijssen

2

Bash + Unixツール、62バイト

STDINの配列が必要です。数値が負でない整数である限り、入力形式はカウントされません。

grep -o [0-9]\*|sort|uniq -c|sort -n|awk 'END{print $2}'

編集:grep引数のワイルドカードをエスケープしました。空でないディレクトリで安全に実行できるようになりました。マナトワークに感謝します。


1
空のディレクトリで実行する場合に最適です。そうし[0-9]*ないと、一致するファイル名に展開される場合があります。
マナトワーク

または、'への引数を囲みますgrep
パエロエベルマン


2

PHP、53 50バイト

<?=array_flip($c=array_count_values($d))[max($c)];

次のように実行します。

echo '<?php $d=$argv;?><?=array_flip($c=array_count_values($d))[max($c)]; echo"\n";' | php -- 4 3 1 0 6 1 6 4 4 0 3 1 7 7 3 4 1 1 2 8

微調整

  • 入力が変数に割り当てられていると仮定する自由を利用して、3バイトを節約しました d

2

Java 8、83バイト

d.stream().max((x,y)->Collections.frequency(d,x)-Collections.frequency(d,y)).get();

dでなければなりませんCollection<Integer>


Collections静的にインポートできる場合:
59バイト

d.stream().max((x,y)->frequency(d,x)-frequency(d,y)).get();

2

ハスケル78

import Data.List
import Data.Ord
g=head.maximumBy(comparing length).group.sort

インポートが無視される場合、45です。


1
ポイントフリースタイルを使用すると4バイト、のmaximumBy代わりにを使用すると2バイト節約できますlast.sortBy。新しいコードはになりg=head.maximumBy(comparing length).group.sortます。
Hjulle

1.)無名関数が許可されているため、をドロップできますg=。2.)あなたは置き換えることができますmaximumBy(comparing length)によってsnd.maximum.map((,)=<<length)これをインポートする必要はありませんOrd62バイトの合計:オンラインそれをお試しください!
ライコニ


2

Brachylog、5バイト

ọtᵒth

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

これは実際にはスニペットではありませんが、どうなるかわかりません...

         The output is
    h    the first element of
   t     the last element of
ọ        a list of [value, number of occurrences] pairs corresponding to
         the input,
  ᵒ      sorted ascending by
 t       their last elements (the numbers of occurrences).

負の入力では失敗します
garg10may

@ garg10mayハイフンの代わりにアンダースコアを使用すると、そのように動作するはずです
無関係な文字列

2

Clojure、32バイト

#(apply max-key(frequencies %)%)

(frequencies %)関数として使用できるハッシュマップを返します。キーを指定すると、対応する値を返します:)

等しい長さ:

#(last(sort-by(frequencies %)%))


1

C ++ 119

int *a=std::max_element(x,x+n);int z=0,b=0,c=0;for(int i=0;i<=*a;i++){c=std::count(x,x+n,i);if(c>b){b=c;z=i;}}return z;

完全なコードとテスト:

#include <iostream>
#include <algorithm>
#include <vector>

int m(int *x,int n)
{
int *a=std::max_element(x,x+n);int z=0,b=0,c=0;for(int i=0;i<=*a;i++){c=std::count(x,x+n,i);if(c>b){b=c;z=i;}}return z;
}

int main()
{
int d[] = {4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8};
std::cout<<m(d,20);
return 0;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.