列表的模式(最常见的元素)


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

这是,因此以字节为单位的最短解决方案为准。

Answers:


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 2014年

12
关于这一点的伟大之处在于它甚至不像高尔夫球,只是Pythonic。打高尔夫球的唯一一件事是d,和之间的空隙key=
wchargin 2014年

5
@WChargin:嗯,Pythonic将通过使用defaultdict(int)或来避免二次运行Counter。有点像Counter(d).most_common()[0]
user2357112支持Monica 2014年

25

Matlab /八度,7 5字节

毫不奇怪,这里有一个内置的功能来寻找模式。作为匿名函数:

@mode

这将返回输入向量中最常出现的元素,并且联系变为更小的值。

感谢Dennis,节省了2个字节!


3
+1,显然是完成工作的正确工具。由于它是内置的,如果有多个最高频率会发生什么?
Level River St

2
@steveverrill根据文档(类型help mode):“如果两个或两个以上的值具有相同的频率,'mode'将返回最小值。”
wchargin 2014年

1
似乎允许使用未命名的函数(可接受的答案是一个),因此您可以将其缩短为@mode
丹尼斯

@丹尼斯谢谢!尽管我承认在网站上编辑我的第一个答案是一种奇怪的感觉。
Alex 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执行稳定的排序,因此按最后一次出现解决关系。

通过计算列表中的值对列表进行排序,然后打印列表的最后一个数字。

Qd如果初始化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 的运行完全相同sortedorderby第一个参数是Python的key参数。


11

Mathematica,25个字节

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

要么

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

与挑战一样,这希望该列表存储在中d

或... 15个字节

当然,如果Mathematica没有内置的,它将不会是Mathematica:

#&@@Commonest@d

Commonest返回所有最常见元素的列表(如果打成平局),并且#&@@是golfed First@


mthmca的另一种情况
Michael Stern

9

Ruby,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])
休2014年

9

CJam,11个10字节

A{A\-,}$0=

假设该数组位于名为的变量中A。这基本上是根据数组中每个数字的出现对数组进行排序,然后选择数组的最后一个元素。

用法示例

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

输出量

6

感谢Dennis,节省了1个字节!

在这里在线尝试


A{A\-,}$0=短一个字节。
丹尼斯

1
从0.6.5开始,它可用8个字节来表示:Ae`$e_W=
Martin Ender

@MartinEnder嗯... 。我知道您需要先进行排序。
暴民埃里克(Erik the Outgolfer)

@ErikGolferエリックゴルファー哎呀,你是对的,需要9个字节:$e`$e_W=
Martin Ender


8

J-12个字符

匿名函数。从最常见到最不常见,以第一项排序。

(0{~.\:#/.~)
  • 0{ 首先
  • ~. 独特物品
  • \: 降序排列
  • #/.~ 频率

自己尝试一下。


这实际上是10个字节-可以在没有括号的情况下分配该函数。
科纳·奥布赖恩

6

JavaScript(ES6)51

仅使用预加载变量d的单行表达式。按频率对数组进行排序,然后得到第一个元素。
令人讨厌的副作用,原始数组已更改

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

像往常一样,使用.map代替.reduce,因为它总体上短了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 2014年

@ nyuszika7h嘿。尽管我早就拥有此用户名,但我什至不知道PPCG的存在。
Optimizer

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 2014年

我发布了相同的答案,但您的速度更快:)
pgy

@pgy-谢谢-已更新!

3

GolfScript,10个字节

a{a\-,}$0=

这个答案中,我写了《在GolfScript中打高尔夫球的技巧》。期望输入名为的数组中的a结果,并在堆栈上返回结果。(要从堆栈上的数组读取输入,请前置:11个字节;要从stdin读取输入(格式为[1 2 1 3 7]),也请前置~12个字节。)

该代码通过遍历输入数组,从原始数组减去每个元素并计算剩余元素的数量来工作。然后将其用作对原始数组进行排序的键,并返回已排序数组的第一个元素。

在线演示。

附言 感谢Peter Taylor 向我指出了这一挑战


3

Dyalog APL,12个字符

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

∘.=⍨d与...的d∘.=d反身外部产物相同=。它创建一个布尔矩阵,比较中的每对元素d

+/ 沿轴之一将矩阵求和并产生一个向量。

对向量进行分级,即按索引对其进行排序。(如字形所建议的那样,按降序排列,然后按升序排列。)

从等级中获取第一个索引-的最大元素的索引d

d[...] 返回该元素。


+/∘.=⍨d对的每个元素都计数d⊢∘≢⌸d对的每个元素进行计数∪d,因此索引与的索引不对应d。反例:d←1 1 2 2 2。使它起作用:(∪d)[⊃⍒⊢∘≢⌸d](⊃⍒⊢∘≢⌸d)⊃∪d
2014年

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每个键对调用任何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 => 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必须为类型Integer[]。请注意java.util.*java.util.stream.*需要将其导入,但是在精神上,它们被忽略了。


因为...而投票
PoweredByRice 2015年

我知道已经超过两年了,但是您可以删除处的空格(i->i,Collectors.counting())
凯文·克鲁伊森

2

Bash + Unix工具,62字节

期望在STDIN中使用该数组。只要数字是非负整数,输入格式就不会计数。

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

编辑:在grep参数中转义了通配符。现在,它可以在非空目录中安全运行。多亏了manatwork。


1
最好在空目录中运行。否则[0-9]*可能会扩展为匹配的文件名。
manatwork

或者,将'参数放在周围grep
圣保罗Ebermann

2

Perl,27个字节

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

如果出现平局,则返回最后一个最常见的值。


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)这并不需要进口Ord,共62个字节:网上试试吧!
Laikoni '17


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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.