Modo (elemento más común) de una lista


26

Escriba un fragmento para calcular el modo (número más común) de una lista de enteros positivos.

Por ejemplo, el modo de

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

es 1, porque ocurre el máximo de 5 veces.

Puede suponer que la lista se almacena en una variable como dy tiene un modo único.

por ejemplo: Python, 49

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

Este es el , por lo que gana la solución más corta en bytes.

Respuestas:


5

K5, 6 bytes

*>#:'=

El primero ( *) de los elementos descendentes ( >) del recuento de cada ( #:') del grupo ( =). Paso a paso:

  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

Pruébalo en tu navegador !


29

Python 2 - 18

max(d,key=d.count)

Como su respuesta de Python no parece imprimirse, espero que esto sea lo que desea.

Agregue 6 bytes para printnormalmente.


perfecto, creo que @globby necesita ver el futuro :)
garg10may 19/12/2014

12
Lo mejor de este es que ni siquiera es golf, es solo Pythonic. Lo único que se ha jugado al golf es un espacio entre d,y key=.
wchargin

55
@WChargin: Eh, Pythonic sería para evitar el tiempo de ejecución cuadrático utilizando defaultdict(int)o Counter. Algo así como Counter(d).most_common()[0].
user2357112 es compatible con Monica el

25

Matlab / Octave, 7 5 bytes

Como era de esperar, hay una función incorporada para encontrar modos. Como una función anónima:

@mode

Esto devuelve el elemento que ocurre más comúnmente en el vector de entrada con vínculos que van al valor menor.

¡Ahorré 2 bytes gracias a Dennis!


3
+1, claramente la herramienta adecuada para el trabajo. Como es una construcción, ¿qué sucede si hay más de un número de frecuencia más alta?
Level River St

2
@steveverrill De acuerdo con la documentación (tipo help mode): "Si dos o más valores tienen la misma frecuencia, 'modo' devuelve el más pequeño".
wchargin

1
Las funciones sin nombre parecen estar permitidas (la respuesta aceptada es una), por lo que podría acortar esto a @mode.
Dennis

@ Dennis Gracias! Aunque admito que es una sensación extraña editar mi primera respuesta en el sitio.
Alex A.

16

Pyth - 6

eo/QNQ

Pruébalo en línea.

Espera entrada en stdin like [4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]. Los empates se resuelven por última vez porque Python realiza tipos estables.

Ordena la lista por contar el valor en la lista, luego imprime el último número de la lista.

Qpodría reemplazarse dsi se inicializa dpara contener el valor antes, por ejemplo=d[4 3 1 0 6 4 4 0 1 7 7 3 4 1 1 2 8)

Seudocódigo de Python-esque:

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

Explicación completa:

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

Pyth's orderbycorre exactamente como Python sortedcon orderbyel primer argumento de ser el keyargumento.


11

Mathematica, 25 bytes

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

o

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

Como en el desafío, esto espera que la lista se almacene en d.

o ... 15 bytes

Por supuesto, Mathematica no sería Mathematica si no tuviera incorporado:

#&@@Commonest@d

Commonestdevuelve una lista de todos los elementos más comunes (en caso de empate) y #&@@es un campo de golf First@.


otro caso para mthmca
Michael Stern

9

Ruby, 22 bytes

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

Básicamente un puerto de mi respuesta de Mathematica, excepto que Ruby tiene un directo, max_byasí que no necesito ordenar primero.


1
Estaba a punto de sugerir, d.max_by d.method:countpero eso es aproximadamente un millón (es decir, ni siquiera dos) bytes más. Aún así, vale la pena señalar que es posible.
Financia la demanda de Mónica

9

R, 33 25 bytes

Gracias @Hugh por la ayuda acortando:

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

El original:

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

Esto calcula la frecuencia de cada elemento en el vector d, luego devuelve el nombre de la columna que contiene el valor más grande. El valor devuelto es en realidad una cadena de caracteres que contiene el número. No decía en ninguna parte que eso no estaba bien, así que ...

¡Cualquier sugerencia para acortar esto es bienvenida!


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

9

CJam, 11 10 bytes

A{A\-,}$0=

Asume la matriz en una variable llamada A . Básicamente, esto es ordenar la matriz en función de la aparición de cada número en la matriz y luego selecciona el último elemento de la matriz.

Ejemplo de uso

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

Salida

6

¡1 byte guardado gracias a Dennis!

Pruébalo en línea aquí


A{A\-,}$0=es un byte más corto.
Dennis

1
A partir de 0.6.5 es factible en 8 bytes:Ae`$e_W=
Martin Ender

@MartinEnder Umm ... nop . Sabía que primero debes ordenar.
Erik the Outgolfer

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー whoops, tienes razón, necesita 9 bytes:$e`$e_W=
Martin Ender

8

Powershell 19

($d|group)[0].Count

(esto supone que la matriz ya está encendida $d)



6

JavaScript (ES6) 51

Solo una expresión de línea simple usando la variable precargada d. Ordene la matriz por frecuencia y luego obtenga el primer elemento.
Efecto secundario desagradable, la matriz original se altera

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

Como de costumbre, usando .map en lugar de .reduce porque es 1 char más corto en general. Con .reduce es casi una solución limpia y sin golf.

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

Por fin, una solución que usa una función, sin cambiar la matriz original y sin globales (62 bytes):

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

Prueba en la consola 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]

Salida 1

La matriz d se convierte en:

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

No veo una solución de 18 caracteres en ninguna parte en el futuro para ser honesto.

EDITAR: Estoy corregido e impresionado.


4

JavaScript, ES6, 71 bytes

Un poco largo, se puede jugar mucho al golf.

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

Esto crea una función fque se puede llamar como f([1,1,1,2,1,2,3,4,1,5])y volverá 1.

Pruébalo en tu última consola de Firefox.


Fuera de tema, pero me acabo de dar cuenta de lo relevante que es su nombre de usuario para PCG.SE. : P
nyuszika7h

@ nyuszika7h heh. Aunque he tenido este nombre de usuario mucho antes incluso sé que existe PPCG.
Optimizador

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

4

05AB1E , 3 bytes

(no competitiva - la pregunta es anterior al idioma)

.MJ

Explicación:

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

Si desea almacenar la matriz en una variable en lugar de usar la entrada, simplemente empuje la matriz a la pila al inicio del programa.

Pruébalo en línea!


3

C # - 49

Realmente no puedo competir con C # pero bueno:

Suponiendo que des la matriz

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


3

bash - 29 27 caracteres

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

Utilizándolo:

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

es decir, "1" es el modo, y aparece cinco veces.


sort|uniq -c|sort -nr|sed qahorra un par de personajes
Trauma digital


@pgy - gracias - he actualizado!

3

GolfScript, 10 bytes

a{a\-,}$0=

De esta respuesta escribí a Consejos para jugar golf en GolfScript . Espera la entrada en una matriz llamada a, devuelve el resultado en la pila. (Para leer la entrada de una matriz en la pila, anteponer :11 bytes; para leer la entrada de stdin (en el formato [1 2 1 3 7]), también anteponer~ 12 bytes).

Este código funciona iterando sobre la matriz de entrada, restando cada elemento de la matriz original y contando el número de elementos restantes. Esto se usa como una clave para ordenar la matriz original y se devuelve el primer elemento de la matriz ordenada.

Demo en línea.

PD. Gracias a Peter Taylor por señalarme este desafío .


3

Dyalog APL, 12 caracteres

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

∘.=⍨des lo mismo que d∘.=d, producto externo reflexivo de =. Crea una matriz booleana que compara cada par de elementos d.

+/ suma esa matriz a lo largo de uno de los ejes y produce un vector.

califica el vector, es decir, lo ordena por índices. (Como sugieren los glifos, califica en orden descendente y calificaría en orden ascendente).

toma el primer índice de la calificación, el índice del elemento más grande de d.

d[...] devuelve ese elemento


+/∘.=⍨dcuenta para cada elemento de d. ⊢∘≢⌸dcuenta para cada elemento de ∪d, por lo que los índices no corresponden a los de d. Contraejemplo: d←1 1 2 2 2. Para que funcione: (∪d)[⊃⍒⊢∘≢⌸d]o (⊃⍒⊢∘≢⌸d)⊃∪d.
ngn

3

Perl 6 , 21 bytes

.Bag.invert.max.value

Ejemplo:

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

Si hay un empate, imprimirá el más grande de los que lo hicieron.


El .Bagmétodo en una Lista o una Matriz crea un hash cuantificado que asocia el recuento total de cuántas veces se vio un valor dado con ese valor.

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

El .invertmétodo crea una Lista de los pares en la bolsa con la clave y el valor intercambiado. (La razón por la que llamamos a esto es para que el próximo método haga lo que queramos)

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

El .maxmétodo en una Lista de pares devuelve el par más grande que compara las claves primero y en el caso de un empate que compara los valores.
(Esto es porque así es como multi infix:<cmp>(Pair:D \a, Pair:D \b)determina cuál es más grande)

5 => 1

El .valuemétodo devuelve el valor del par. (Hubiera sido la clave que buscábamos si no fuera por la .invertllamada anterior)

1

Si desea devolver todos los valores vinculados en caso de empate:

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

los .classify método devuelve una lista de pares de donde provienen las claves llamando a la Lambda Cualquiera  *.valuecon cada uno de los Pares.

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

Entonces llamamos .max para obtener el par más grande.

"5" => [1 => 5]

Un llamado a .value obtener los pares originales de la bolsa (solo uno en este caso)

1 => 5

Luego, usamos >>.keypara llamar al .keymétodo en cada par de la lista, de modo que terminemos con una lista de los valores más vistos.

1

2

Java 8: 184 bytes

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

La entrada A debe ser de tipo Integer[]. Tenga en cuenta java.util.*y java.util.stream.*debe importarse, sin embargo, en el Spirit Oneliner se omiten.


downvoting debido a ...?
PoweredByRice

Sé que han pasado más de dos años, pero puedes eliminar los espacios en (i->i,Collectors.counting()).
Kevin Cruijssen

2

Bash + herramientas unix, 62 bytes

Espera la matriz en el STDIN. El formato de entrada no cuenta, siempre que los números sean enteros no negativos.

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

Editado: comodín escapado en argumento grep. Ahora se puede ejecutar de forma segura en directorios no vacíos. Gracias a manatwork.


1
Mejor si se ejecuta en un directorio vacío. De [0-9]*lo contrario, puede expandirse a nombres de archivo coincidentes.
manatwork

Alternativamente, ponga 'el argumento a grep.
Paŭlo Ebermann

2

Perl, 27 bytes

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

Devuelve el último valor más común en caso de empate.


2

PHP, 53 50 bytes

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

Corre así:

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

Ajustes

  • Se guardaron 3 bytes haciendo uso de la libertad de asumir que la entrada se asigna a una variable d

2

Java 8, 83 bytes

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

ddebe ser a Collection<Integer>.


Si Collectionsse puede importar estáticamente:
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

Si se ignoran las importaciones, son 45 .


1
Puede guardar 4 bytes usando un estilo sin puntos y 2 bytes usando en maximumBylugar de last.sortBy. El nuevo código se convertiría g=head.maximumBy(comparing length).group.sort.
Hjulle

1.) Se permiten funciones anónimas, por lo que puede soltar el g=. 2.) Puede reemplazar maximumBy(comparing length)por el snd.maximum.map((,)=<<length)que no necesita importar Ord, para un total de 62 bytes: ¡ Pruébelo en línea!
Laikoni


2

Brachylog , 5 bytes

ọtᵒth

Pruébalo en línea!

Esto no es realmente un fragmento, pero no estoy seguro de qué sería ...

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

Falla por entrada negativa
garg10may

@ garg10may Use un guión bajo en lugar de un guión, debería funcionar de esa manera
Cadena no relacionada

2

Clojure, 32 bytes

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

(frequencies %)devuelve un mapa hash, que se puede usar como una función. Dada una clave, devuelve el valor correspondiente :)

Misma longitud:

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

Código completo y prueba:

#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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.