โหมด (องค์ประกอบที่พบบ่อยที่สุด) ของรายการ


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)

เนื่องจากคำตอบหลามของคุณดูเหมือนจะไม่พิมพ์ฉันหวังว่านี่คือสิ่งที่คุณต้องการ

เพิ่ม 6 ไบต์printตามปกติ


สมบูรณ์แบบคิดว่า @globby ต้องการเห็นอนาคต :)
garg10may

12
สิ่งที่ยอดเยี่ยมเกี่ยวกับอันนี้ก็คือมันไม่ได้เล่นกอล์ฟมันเป็นเพียง Pythonic สิ่งเดียวที่ได้รับการแข็งแรงเล่นกอล์ฟเป็นพื้นที่ระหว่างและd, key=
wchargin

5
@WChargin: เอ๊ะ Pythonic จะหลีกเลี่ยงการรันไทม์กำลังสองโดยใช้หรือdefaultdict(int) สิ่งที่ชอบCounter Counter(d).most_common()[0]
user2357112 รองรับ Monica

25

Matlab / Octave ขนาด7 5 ไบต์

แปลกใจที่มีฟังก์ชั่นในตัวสำหรับการค้นหาโหมด ในฐานะที่เป็นฟังก์ชั่นที่ไม่ระบุชื่อ:

@mode

สิ่งนี้จะคืนค่าองค์ประกอบที่เกิดขึ้นบ่อยที่สุดในเวกเตอร์อินพุตพร้อมกับความสัมพันธ์ที่มีค่าน้อยกว่า

บันทึก 2 ไบต์ด้วยเดนนิส!


3
+1 เป็นเครื่องมือที่เหมาะสมสำหรับงานอย่างชัดเจน ในฐานะที่เป็น builtin จะเกิดอะไรขึ้นถ้ามีความถี่สูงสุดมากกว่าหนึ่งหมายเลข
เลเวลริเวอร์เซนต์

2
@steveverrill ตามเอกสาร (ประเภทhelp mode): "ถ้าสองค่าขึ้นไปค่าที่มีความถี่เดียวกัน 'mode` จะคืนค่าที่เล็กที่สุด"
wchargin

1
ดูเหมือนว่าฟังก์ชั่นที่ไม่มีชื่อจะได้รับอนุญาต (คำตอบที่ยอมรับคือหนึ่ง) ดังนั้นคุณสามารถย่อให้สั้นลง@modeได้
Dennis

@ เดนนิสขอบคุณ! แม้ว่าฉันจะยอมรับว่ามันเป็นความรู้สึกที่แปลกที่จะแก้ไขคำตอบแรกของฉันในเว็บไซต์
Alex A.

16

Pyth - 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-esque pseudo-code:

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 ถ้ามันไม่มีในตัว:

#&@@Commonest@d

Commonestผลตอบแทนรายชื่อขององค์ประกอบทั้งหมดที่พบมากที่สุด (ในกรณีที่มีการผูก) และเป็นแข็งแรงเล่นกอล์ฟ#&@@First@


อีกกรณีหนึ่งสำหรับ mthmca
Michael Stern

9

ทับทิมขนาด 22 ไบต์

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

โดยพื้นฐานแล้วพอร์ตของคำตอบใน Mathematica ของฉันยกเว้น Ruby มีคำสั่งโดยตรง max_byดังนั้นฉันไม่จำเป็นต้องเรียงลำดับก่อน


1
ฉันกำลังจะแนะนำd.max_by d.method:countแต่นั่นยาวประมาณหนึ่งล้าน (หรือไม่แม้แต่สอง) ไบต์ ถึงกระนั้นก็เป็นที่น่าสังเกตว่ามันเป็นไปได้
คดีฟ้องร้องกองทุนโมนิก้า

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])
ฮิวจ์

9

CJam, 11 10 ไบต์

A{A\-,}$0=

ถือว่าอาร์เรย์ในตัวแปรที่เรียกว่า Aถือว่าอาร์เรย์ในตัวแปรที่เรียกว่านี่เป็นการเรียงลำดับอาร์เรย์ตามการเกิดขึ้นของแต่ละหมายเลขในอาเรย์แล้วเลือกองค์ประกอบสุดท้ายของอาเรย์

ตัวอย่างการใช้งาน

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

เอาท์พุต

6

บันทึก 1 ไบต์ขอบคุณ Dennis!

ลองออนไลน์ได้ที่นี่


A{A\-,}$0=สั้นลงหนึ่งไบต์
เดนนิส

1
จาก 0.6.5 สามารถใช้งานได้ใน 8 ไบต์:Ae`$e_W=
Martin Ender

@MartinEnder Umm ... Nope ฉันรู้ว่าคุณต้องเรียงลำดับก่อน
Erik the Outgolfer

@ErikGolfer ーリックゴルーーขออภัยคุณต้องการ 9 ไบต์:$e`$e_W=
Martin Ender

8

พาวเวอร์เซลล์ 19

($d|group)[0].Count

(ซึ่งถือว่าอาร์เรย์เปิดอยู่แล้ว$d)


8

J - 12 ตัวอักษร

ฟังก์ชั่นไม่ระบุชื่อ เรียงลำดับรายการจากมากที่สุดไปหาน้อยที่สุดโดยจดรายการแรก

(0{~.\:#/.~)
  • 0{ ก่อนอื่น
  • ~. รายการที่ไม่ซ้ำ
  • \: ลดน้อยลงด้วย
  • #/.~ ความถี่

ลองด้วยตัวคุณเอง


นี่คือ 10 ไบต์จริงๆ - ฟังก์ชั่นสามารถกำหนดได้โดยไม่ต้อง parens
Conor O'Brien

6

JavaScript (ES6) 51

เป็นเพียงการแสดงออกของบรรทัดเดียวโดยใช้ตัวแปรที่โหลดไว้ d เรียงลำดับอาร์เรย์ตามความถี่จากนั้นรับองค์ประกอบแรก
ผลข้างเคียงที่น่ารังเกียจอาร์เรย์เดิมมีการเปลี่ยนแปลง

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

ตามปกติให้ใช้. map แทน .reduce เพราะภาพรวมสั้นลง 1 ถ่าน ด้วย. ทำให้มันเกือบเป็นทางออกที่สะอาดและไม่ใช่กอล์ฟ

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

ในที่สุดโซลูชันที่ใช้ฟังก์ชั่นไม่เปลี่ยนอาร์เรย์เดิมและไม่มี globals (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

@ nyuszika7h เฮ้ แม้ว่าฉันจะมีชื่อผู้ใช้นี้มานานก่อนที่ฉันจะรู้แม้กระทั่ง PPCG
เครื่องมือเพิ่มประสิทธิภาพ

f=a=>(c=b=[],a.map(x=>b[x]++-1?0:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())สั้นลง 1 ไบต์
Bálint

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" คือโหมดและมันจะปรากฏขึ้นห้าครั้ง


sort|uniq -c|sort -nr|sed qบันทึกอักขระสองสามตัว
Digital Trauma

ผมโพสต์คำตอบเดียวกัน แต่คุณได้เร็ว :)
pgy

@pgy - ขอบคุณ - ได้อัปเดตแล้ว!

3

GolfScript ขนาด 10 ไบต์

a{a\-,}$0=

จาก คำตอบนี้ผมเขียนถึงเคล็ดลับในการเล่นกอล์ฟใน GolfScript ต้องการอินพุตในอาร์เรย์ที่มีชื่อaส่งคืนผลลัพธ์บนสแต็ก (หากต้องการอ่านอินพุตจากอาร์เรย์บนสแต็ก:ให้เพิ่ม 11 ไบต์ก่อนเพื่ออ่านอินพุตจาก stdin (ในรูปแบบ[1 2 1 3 7]) และเพิ่ม~12 ไบต์ด้วย)

รหัสนี้ทำงานโดยวนซ้ำอาร์เรย์อินพุตลบแต่ละองค์ประกอบออกจากอาร์เรย์เดิมและนับจำนวนองค์ประกอบที่เหลือ นี่จะใช้เป็นคีย์เพื่อเรียงลำดับอาร์เรย์ดั้งเดิมด้วยและองค์ประกอบแรกของอาร์เรย์ที่เรียงลำดับจะถูกส่งกลับ

การสาธิตออนไลน์

ps ขอขอบคุณที่ปีเตอร์เทย์เลอร์ชี้ให้เห็นความท้าทายนี้ให้ฉัน


3

Dyalog APL, 12 ตัวอักษร

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

∘.=⍨dเป็นเช่นเดียวกับผลิตภัณฑ์ด้านนอกสะท้อนของd∘.=d มันจะสร้างเมทริกซ์บูลเปรียบเทียบคู่ขององค์ประกอบในทุก=d

+/ ผลรวมของเมทริกซ์นั้นตามแกนใดแกนหนึ่งและสร้างเวกเตอร์

ให้คะแนนเวกเตอร์นั่นคือเรียงลำดับตามดัชนี (ตาม glyphs แนะนำให้เรียงตามลำดับจากมากไปน้อยและจะให้คะแนนตามลำดับจากน้อยไปหามาก)

dเตะดัชนีแรกจากการจัดลำดับ-ดัชนีขององค์ประกอบที่ใหญ่ที่สุดของ

d[...] ส่งคืนองค์ประกอบนั้น


+/∘.=⍨ddนับสำหรับองค์ประกอบของแต่ละ ⊢∘≢⌸dนับสำหรับองค์ประกอบของแต่ละดังนั้นดัชนีไม่ตรงกับของ∪d counterexample:d d←1 1 2 2 2ที่จะทำให้มันทำงาน: หรือ(∪d)[⊃⍒⊢∘≢⌸d] (⊃⍒⊢∘≢⌸d)⊃∪d
ngn

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

.maxวิธีการในรายชื่อการจับคู่ผลตอบแทนที่ยิ่งใหญ่ที่สุดคู่เปรียบเทียบคีย์ครั้งแรกและในกรณีของการผูกเปรียบเทียบค่าที่
(นี่เป็นเพราะนั่นคือวิธีmulti infix:<cmp>(Pair:D \a, Pair:D \b)พิจารณาว่าอันไหนใหญ่กว่า)

5 => 1

.valueวิธีการส่งกลับค่าจากจับคู่ (มันจะเป็นกุญแจสำคัญที่เราเคยทำหากไม่ใช่เพื่อการ.invertโทรก่อนหน้านี้)

1

หากคุณต้องการคืนค่าทั้งหมดที่เชื่อมโยงในกรณีของเน็คไท:

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

.classifyวิธีการส่งกลับรายชื่อของคู่ที่กุญแจมาจากการเรียกแลมบ์ดาไม่ว่า  *.valueกับแต่ละคู่

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 => 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();

ป้อนข้อมูลต้องเป็นชนิด หมายเหตุและจำเป็นต้องนำเข้าอย่างไรก็ตามในวิญญาณออนไลน์ที่เหลือจะถูกนำออกInteger[]java.util.*java.util.stream.*


downvoting เนื่องจาก ...
PoweredByRice

ฉันรู้ว่ามันนานกว่าสองปี (i->i,Collectors.counting())แต่คุณสามารถลบช่องว่างที่
Kevin Cruijssen

2

Bash + unix tools, 62 ไบต์

คาดว่าอาร์เรย์ใน STDIN รูปแบบอินพุตไม่นับตราบใดที่ตัวเลขนั้นไม่ใช่จำนวนเต็มลบ

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

แก้ไข: หนีไวด์การ์ดในอาร์กิวเมนต์ grep ตอนนี้มันสามารถทำงานได้อย่างปลอดภัยในไดเรกทอรีที่ไม่ว่างเปล่า ต้องขอบคุณการจัดการ


1
ดีที่สุดถ้าทำงานในไดเรกทอรีว่าง มิฉะนั้น[0-9]*อาจขยายไปยังชื่อไฟล์ที่ตรงกัน
จัดการ

อีกวิธีหนึ่งคือใส่รอบอาร์กิวเมนต์' grep
Paŭlo Ebermann


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 Bytes

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

dCollection<Integer>จะต้องเป็น


หากCollectionsสามารถนำเข้าแบบคงที่:
59 ไบต์

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

If the imports are ignored, it's 45.


1
You can save 4 bytes by using point-free style and 2 bytes by using maximumBy instead of last.sortBy. The new code would become g=head.maximumBy(comparing length).group.sort.
Hjulle

1.) Anonymous functions are allowed, so you can drop the g=. 2.) You can replace maximumBy(comparing length) by snd.maximum.map((,)=<<length) which doesn't need to import Ord, for a total of 62 bytes: Try it online!
Laikoni


2

Brachylog, 5 bytes

ọtᵒth

Try it online!

This isn't really a snippet, but I'm not sure what would be...

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

It fails for negative input
garg10may

@garg10may Use an underscore instead of a hyphen, it should work that way
Unrelated String

2

Clojure, 32 bytes

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

(frequencies %) returns a hash-map, which can be used as a function. Given a key it returns the corresponding value :)

Equal length:

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

Full code and test:

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