Answers:
max(d,key=d.count)
由于您的python答案似乎无法打印,因此我希望这是您想要的。
print
通常添加6个字节。
d,
和之间的空隙key=
。
defaultdict(int)
或来避免二次运行Counter
。有点像Counter(d).most_common()[0]
。
毫不奇怪,这里有一个内置的功能来寻找模式。作为匿名函数:
@mode
这将返回输入向量中最常出现的元素,并且联系变为更小的值。
感谢Dennis,节省了2个字节!
help mode
):“如果两个或两个以上的值具有相同的频率,'mode'将返回最小值。”
@mode
。
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
第一个参数是Python的key
参数。
Last@SortBy[d,d~Count~#&]
要么
#&@@SortBy[d,-d~Count~#&]
与挑战一样,这希望该列表存储在中d
。
当然,如果Mathematica没有内置的,它将不会是Mathematica:
#&@@Commonest@d
Commonest
返回所有最常见元素的列表(如果打成平局),并且#&@@
是golfed First@
。
A{A\-,}$0=
假设该数组位于名为的变量中A
。这基本上是根据数组中每个数字的出现对数组进行排序,然后选择数组的最后一个元素。
用法示例
[1 2 3 4 4 2 6 6 6 6]:A;A{aA\/,}$W=
输出量
6
感谢Dennis,节省了1个字节!
A{A\-,}$0=
短一个字节。
Ae`$e_W=
$e`$e_W=
仅使用预加载变量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]
有点长,可以打很多球。
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控制台上尝试一下。
f=a=>(c=b=[],a.map(x=>b[x]++-1?0:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())
短1个字节。
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
保存几个字符
a{a\-,}$0=
从这个答案中,我写了《在GolfScript中打高尔夫球的技巧》。期望输入名为的数组中的a
结果,并在堆栈上返回结果。(要从堆栈上的数组读取输入,请前置:
11个字节;要从stdin读取输入(格式为[1 2 1 3 7]
),也请前置~
12个字节。)
该代码通过遍历输入数组,从原始数组减去每个元素并计算剩余元素的数量来工作。然后将其用作对原始数组进行排序的键,并返回已排序数组的第一个元素。
附言 感谢Peter Taylor 向我指出了这一挑战。
∘.=⍨d
与...的d∘.=d
反身外部产物相同=
。它创建一个布尔矩阵,比较中的每对元素d
。
+/
沿轴之一将矩阵求和并产生一个向量。
⍒
对向量进行分级,即按索引对其进行排序。(如字形所建议的那样,⍒
按降序排列,然后⍋
按升序排列。)
⊃
从等级中获取第一个索引-的最大元素的索引d
。
d[...]
返回该元素。
+/∘.=⍨d
对的每个元素都计数d
。 ⊢∘≢⌸d
对的每个元素进行计数∪d
,因此索引与的索引不对应d
。反例:d←1 1 2 2 2
。使它起作用:(∪d)[⊃⍒⊢∘≢⌸d]
或(⊃⍒⊢∘≢⌸d)⊃∪d
。
.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
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.*
需要将其导入,但是在精神上,它们被忽略了。
(i->i,Collectors.counting())
。
期望在STDIN中使用该数组。只要数字是非负整数,输入格式就不会计数。
grep -o [0-9]\*|sort|uniq -c|sort -n|awk 'END{print $2}'
编辑:在grep参数中转义了通配符。现在,它可以在非空目录中安全运行。多亏了manatwork。
[0-9]*
可能会扩展为匹配的文件名。
'
参数放在周围grep
。
import Data.List
import Data.Ord
g=head.maximumBy(comparing length).group.sort
如果忽略导入,则为45。
maximumBy
代替可以保存2个字节last.sortBy
。新代码将变为g=head.maximumBy(comparing length).group.sort
。
g=
。2)您可以替换maximumBy(comparing length)
通过snd.maximum.map((,)=<<length)
这并不需要进口Ord
,共62个字节:网上试试吧!
ọ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).
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;
}