Mode (elemen paling umum) dari daftar


26

Tulis cuplikan untuk menghitung mode (angka paling umum) dari daftar bilangan bulat positif.

Misalnya, mode

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

adalah 1, karena itu terjadi maksimal 5 kali.

Anda dapat mengasumsikan bahwa daftar tersebut disimpan dalam variabel seperti ddan memiliki mode unik.

misal: Python, 49

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

Ini adalah , jadi solusi terpendek dalam byte menang.

Jawaban:


5

K5, 6 byte

*>#:'=

Yang pertama ( *) dari elemen yang menurun ( >) dari jumlah masing-masing ( #:') dari grup ( =). Selangkah demi selangkah:

  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

coba di browser Anda !


29

Python 2 - 18

max(d,key=d.count)

Karena jawaban python Anda sepertinya tidak bisa dicetak, saya berharap inilah yang Anda inginkan.

Tambahkan 6 byte untuk secara printnormal.


sempurna, pikir @globby perlu melihat masa depan :)
garg10may

12
Hal yang hebat tentang yang ini adalah bahkan tidak golf, itu hanya Pythonic. Satu-satunya hal yang telah golf adalah ruang antara d,dan key=.
wchargin

5
@WChargin: Eh, Pythonic akan menghindari runtime kuadratik dengan menggunakan defaultdict(int)atau Counter. Sesuatu seperti Counter(d).most_common()[0].
user2357112 mendukung Monica

25

Matlab / Oktaf, 7 5 byte

Tidak mengherankan ada fungsi bawaan untuk menemukan mode. Sebagai fungsi anonim:

@mode

Ini mengembalikan elemen yang paling umum terjadi dalam vektor input dengan ikatan pergi ke nilai yang lebih kecil.

Disimpan 2 byte berkat Dennis!


3
+1, jelas alat yang tepat untuk pekerjaan itu. Karena builtin, apa yang terjadi jika ada lebih dari satu jumlah frekuensi tertinggi?
Level River St

2
@steveverrill Menurut dokumentasi (jenis help mode): "Jika dua, atau lebih, nilai memiliki frekuensi 'mode` yang sama mengembalikan yang terkecil."
wchargin

1
Fungsi yang tidak disebutkan namanya tampaknya diizinkan (jawaban yang diterima adalah satu), sehingga Anda dapat mempersingkat ini menjadi @mode.
Dennis

@Dennis Terima kasih! Meskipun saya akui itu perasaan aneh untuk mengedit jawaban pertama saya di situs.
Alex A.

16

Pyth - 6

eo/QNQ

Cobalah online.

Mengharapkan input pada stdin like [4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8] . Ikatan diselesaikan oleh kejadian terakhir karena Python melakukan jenis stabil.

Urutkan daftar dengan menghitung nilai dalam daftar, lalu cetak nomor terakhir daftar.

Qdapat diganti dengan djika Anda diinisialisasi duntuk mengandung nilai sebelum mis=d[4 3 1 0 6 4 4 0 1 7 7 3 4 1 1 2 8)

Kode semu python-esque:

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

Penjelasan Lengkap:

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

Pyth's orderbyberjalan persis seperti Python sorteddengan orderbyargumen pertama yang menjadi keyargumen.


11

Mathematica, 25 byte

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

atau

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

Seperti dalam tantangan, ini mengharapkan daftar untuk disimpan d.

atau ... 15 byte

Tentu saja, Mathematica tidak akan menjadi Mathematica jika tidak memiliki built-in:

#&@@Commonest@d

Commonestmengembalikan daftar semua elemen yang paling umum (dalam kasus dasi), dan #&@@golf First@.


kasus lain untuk mthmca
Michael Stern

9

Ruby, 22 byte

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

Pada dasarnya port jawaban Mathematica saya, kecuali Ruby memiliki direct max_byjadi saya tidak perlu menyortir terlebih dahulu.


1
Saya akan menyarankan d.max_by d.method:counttapi itu sekitar satu juta (alias bahkan dua) byte lebih lama. Namun, perlu dicatat bahwa itu mungkin.
Dana Gugatan Monica

9

R, 33 25 byte

Terima kasih @Hugh atas bantuan yang dipersingkat:

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

Asli:

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

Ini menghitung frekuensi setiap elemen dalam vektor d, lalu mengembalikan nama kolom yang berisi nilai terbesar. Nilai yang dikembalikan sebenarnya adalah string karakter yang berisi angka. Itu tidak mengatakan di mana pun bahwa itu tidak apa-apa, jadi ...

Ada saran untuk mempersingkat ini!


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

9

CJam, 11 10 byte

A{A\-,}$0=

Mengasumsikan array dalam variabel yang disebut A. Ini pada dasarnya menyortir array berdasarkan kemunculan setiap angka dalam array dan kemudian mengambil elemen terakhir dari array.

Contoh penggunaan

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

Keluaran

6

1 byte disimpan berkat Dennis!

Cobalah online di sini


A{A\-,}$0=lebih pendek satu byte.
Dennis

1
Pada 0.6.5 bisa dilakukan dalam 8 byte:Ae`$e_W=
Martin Ender

@MartinEnder Umm ... tidak . Saya tahu Anda harus menyortir terlebih dahulu.
Erik the Outgolfer

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー whoops, Anda benar, membutuhkan 9 byte:$e`$e_W=
Martin Ender

8

Powershell 19

($d|group)[0].Count

(ini mengasumsikan array sudah aktif $d)


8

J - 12 char

Fungsi anonim. Urutkan daftar dari yang paling tidak umum, dengan mengambil item pertama.

(0{~.\:#/.~)
  • 0{ Pertama dari
  • ~. Barang unik
  • \: Diturunkan oleh
  • #/.~ Frekuensi

Cobalah sendiri.


Ini benar-benar 10 byte - fungsi dapat ditugaskan tanpa parens.
Conor O'Brien

6

JavaScript (ES6) 51

Hanya satu baris ekspresi menggunakan variabel yang dimuat sebelumnya d. Urutkan array berdasarkan frekuensi kemudian dapatkan elemen pertama.
Efek samping yang buruk, array asli diubah

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

Seperti biasa, menggunakan .map alih-alih. Mengurangi karena keseluruhan 1 char lebih pendek. Dengan .reduce it 'hampir solusi bersih, non-golf.

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

Akhirnya, solusi menggunakan fungsi, tidak mengubah array asli dan tanpa global (62 byte):

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

Uji konsol 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]

Keluaran 1

Array d menjadi:

[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]

Jangan melihat solusi 18 karakter di mana pun di masa depan untuk jujur.

EDIT: Saya berdiri terkoreksi, dan terkesan.


4

JavaScript, ES6, 71 byte

Agak panjang, bisa banyak bermain golf.

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

Ini menciptakan fungsi fyang bisa disebut seperti f([1,1,1,2,1,2,3,4,1,5])dan akan kembali1 .

Cobalah di Konsol Firefox terbaru Anda.


Di luar topik, tetapi saya baru menyadari betapa relevannya nama pengguna Anda dengan PCG.SE. : P
nyuszika7h

@ nyuszika7h heh. Meskipun saya sudah memiliki nama pengguna ini jauh sebelum saya tahu PPCG ada.
Pengoptimal

f=a=>(c=b=[],a.map(x=>b[x]++-1?0:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())lebih pendek 1 byte.
Bálint

4

05AB1E , 3 byte

(non-bersaing - pertanyaan mendahului bahasa)

.MJ

Penjelasan:

.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.

Jika Anda ingin menyimpan array dalam suatu variabel alih-alih menggunakan input, cukup dorong array ke stack di awal program.

Cobalah online!


3

C # - 49

Tidak bisa bersaing dengan C # tapi oh well

Dengan asumsi dadalah array

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


3

bash - 29 27 karakter

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

Menggunakannya:

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

yaitu "1" adalah mode, dan muncul lima kali.


sort|uniq -c|sort -nr|sed q menyimpan beberapa karakter
Digital Trauma

Saya memposting jawaban yang sama, tetapi Anda lebih cepat :)
pgy

@pgy - terima kasih - telah diperbarui!

3

GolfScript, 10 byte

a{a\-,}$0=

Dari jawaban ini saya menulis ke Tips untuk bermain golf di GolfScript . Mengharapkan input dalam array bernama a, mengembalikan hasil pada stack. (Untuk membaca input dari sebuah array pada stack, prepend :selama 11 byte; untuk membaca input dari stdin (dalam format [1 2 1 3 7]), juga prepend~ untuk 12 byte.)

Kode ini berfungsi dengan mengulangi larik input, mengurangi setiap elemen dari larik asli, dan menghitung jumlah elemen yang tersisa. Ini kemudian digunakan sebagai kunci untuk mengurutkan array asli, dan elemen pertama dari array yang diurutkan dikembalikan.

Demo online.

Ps. Terima kasih kepada Peter Taylor karena menunjukkan tantangan ini kepada saya .


3

Dyalog APL, 12 karakter

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

∘.=⍨d sama dengan d∘.=d , produk luar refleksif dari =. Ini menciptakan matriks boolean membandingkan setiap pasangan elemen di d.

+/ menjumlahkan matriks itu di sepanjang salah satu sumbu dan menghasilkan vektor.

nilai vektor, yaitu mengurutkannya dengan indeks. (Seperti kata mesin terbang, nilai dalam urutan menurun dan akan peringkat dalam urutan naik).

mengambil indeks pertama dari gradasi — indeks elemen terbesar dari d .

d[...] mengembalikan elemen itu.


+/∘.=⍨ddihitung untuk setiap elemen d. ⊢∘≢⌸ddihitung untuk setiap elemen ∪d, sehingga indeks tidak sesuai dengan d. -Balik: d←1 1 2 2 2. Untuk membuatnya bekerja: (∪d)[⊃⍒⊢∘≢⌸d]atau (⊃⍒⊢∘≢⌸d)⊃∪d.
ngn

3

Perl 6 , 21 byte

.Bag.invert.max.value

Contoh:

$_ = < 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…

Jika ada dasi itu akan mencetak yang lebih besar dari yang diikat.


The .BagMetode pada Daftar atau Array menciptakan hash diukur yang mengaitkan jumlah total berapa kali nilai tertentu terlihat dengan nilai tersebut.

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

The .invertMetode menciptakan Daftar pasangan di tas dengan kunci dan nilai bertukar. (Alasan kami menyebutnya untuk metode selanjutnya untuk melakukan apa yang kami inginkan)

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

The .maxMetode pada Daftar Pasangan mengembalikan Pair terbesar membandingkan kunci pertama dan dalam kasus dasi membandingkan nilai.
(Ini karena itu adalah bagaimana multi infix:<cmp>(Pair:D \a, Pair:D \b)menentukan mana yang lebih besar)

5 => 1

The .valueMetode mengembalikan nilai dari Pair. (Itu akan menjadi kunci yang kami kejar jika bukan karena .invertpanggilan sebelumnya)

1

Jika Anda ingin mengembalikan semua nilai yang diikat dalam kasus seri:

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

The .classifymetode mengembalikan daftar pasangan di mana tombol dari memanggil lambda Apapun  *.valuedengan masing-masing Pasangan.

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

Lalu kami menelepon .maxuntuk mendapatkan Pasangan terbesar.

"5" => [1 => 5]

Panggilan untuk .valuememberi kami Pasangan asli dari Tas (hanya satu dalam kasus ini)

1 => 5

Kemudian kita gunakan >>.keyuntuk memanggil .keymetode pada setiap Pair dalam daftar, sehingga kita berakhir dengan daftar nilai yang paling terlihat.

1

2

Java 8: 184 byte

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

Input A harus bertipe Integer[]. Catatan java.util.*dan java.util.stream.*perlu diimpor, namun dalam semangat oneliner mereka ditinggalkan.


downvoting karena ...?
PoweredByRice

Saya tahu ini sudah lebih dari dua tahun, tetapi Anda dapat menghapus spasi di (i->i,Collectors.counting()).
Kevin Cruijssen

2

Alat Bash + unix, 62 byte

Harapkan array di STDIN. Format input tidak masuk hitungan, asalkan angkanya bukan bilangan bulat negatif.

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

Diedit: lolos wildcard dalam argumen grep. Sekarang ini dapat dijalankan dengan aman di direktori yang tidak kosong. Berkat kerja manat.


1
Terbaik jika dijalankan di direktori kosong. Kalau tidak, [0-9]*bisa diperluas ke nama file yang cocok.
manatwork

Sebagai alternatif, berikan 'argumen grep.
Paŭlo Ebermann

2

Perl, 27 byte

$Q[$a{$_}++]=$_ for@F;pop@Q

Mengembalikan nilai paling umum terakhir dalam kasus seri.


2

PHP, 53 50 byte

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

Jalankan seperti ini:

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

Tweaks

  • Disimpan 3 byte dengan memanfaatkan kebebasan untuk menganggap input ditugaskan ke variabel d

2

Java 8, 83 Bytes

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

dharus a Collection<Integer>.


Jika Collectionsdapat diimpor secara statis:
59 Bytes

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

2

Haskell 78

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

Jika impor diabaikan, berarti 45 .


1
Anda dapat menyimpan 4 byte dengan menggunakan gaya point-free dan 2 byte dengan menggunakan maximumByalih-alih last.sortBy. Kode baru akan menjadi g=head.maximumBy(comparing length).group.sort.
Hjulle

1.) Fungsi anonim diizinkan, sehingga Anda dapat menghapus g=. 2.) Anda dapat mengganti maximumBy(comparing length)dengan snd.maximum.map((,)=<<length)yang tidak perlu impor Ord, untuk total 62 bytes: Cobalah secara online!
Laikoni


2

Brachylog , 5 byte

ọtᵒth

Cobalah online!

Ini sebenarnya bukan cuplikan, tapi saya tidak yakin apa yang akan terjadi ...

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

Gagal untuk input negatif
garg10mungkin

@ garg10may Gunakan garis bawah alih-alih tanda hubung, seharusnya berfungsi seperti itu
String Tidak Berhubungan

2

Clojure, 32 byte

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

(frequencies %)mengembalikan hash-map, yang dapat digunakan sebagai fungsi. Diberikan kunci, ia mengembalikan nilai yang sesuai :)

Panjang yang sama:

#(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;

Kode dan tes lengkap:

#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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.