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 d
y 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 código de golf , por lo que gana la solución más corta en bytes.
code-golf
array-manipulation
garg10may
fuente
fuente
d,
ykey=
.defaultdict(int)
oCounter
. Algo así comoCounter(d).most_common()[0]
.Matlab / Octave,
75 bytesComo era de esperar, hay una función incorporada para encontrar modos. Como una función anónima:
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!
fuente
help mode
): "Si dos o más valores tienen la misma frecuencia, 'modo' devuelve el más pequeño".@mode
.Pyth - 6
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.
Q
podría reemplazarsed
si se inicializad
para 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:
Explicación completa:
Pyth's
orderby
corre exactamente como Pythonsorted
conorderby
el primer argumento de ser elkey
argumento.fuente
Mathematica, 25 bytes
o
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
devuelve una lista de todos los elementos más comunes (en caso de empate) y#&@@
es un campo de golfFirst@
.fuente
Ruby, 22 bytes
Básicamente un puerto de mi respuesta de Mathematica, excepto que Ruby tiene un directo,
max_by
así que no necesito ordenar primero.fuente
d.max_by d.method:count
pero 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.R,
3325 bytesGracias @Hugh por la ayuda acortando:
El original:
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!
fuente
names(sort(-table(d))[1])
CJam,
1110 bytesAsume 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
Salida
¡1 byte guardado gracias a Dennis!
Pruébalo en línea aquí
fuente
A{A\-,}$0=
es un byte más corto.Ae`$e_W=
$e`$e_W=
Powershell 19
(esto supone que la matriz ya está encendida
$d
)fuente
J - 12 char
Función anónima. Ordena la lista de más a menos común, tomando el primer elemento.
0{
Primero de~.
Artículos únicos\:
Desglosado por#/.~
FrecuenciasPruébalo por ti mismo.
fuente
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
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.
Por fin, una solución que usa una función, sin cambiar la matriz original y sin globales (62 bytes):
Prueba en la consola FireFox / FireBug
Salida 1
La matriz d se convierte en:
fuente
Python - 32
No veo una solución de 18 caracteres en ninguna parte en el futuro para ser honesto.
EDITAR: Estoy corregido e impresionado.
fuente
JavaScript, ES6, 71 bytes
Un poco largo, se puede jugar mucho al golf.
Esto crea una función
f
que se puede llamar comof([1,1,1,2,1,2,3,4,1,5])
y volverá1
.Pruébalo en tu última consola de Firefox.
fuente
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.05AB1E , 3 bytes
(no competitiva - la pregunta es anterior al idioma)
Explicación:
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!
fuente
C # - 49
Realmente no puedo competir con C # pero bueno:
Suponiendo que
d
es la matrizd.GroupBy(i=>i).OrderBy(a=>a.Count()).Last().Key;
fuente
bash -
2927 caracteresUtilizándolo:
es decir, "1" es el modo, y aparece cinco veces.
fuente
sort|uniq -c|sort -nr|sed q
ahorra un par de personajesGolfScript, 10 bytes
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 .
fuente
Dyalog APL, 12 caracteres
d[⊃⍒+/∘.=⍨d]
∘.=⍨d
es lo mismo qued∘.=d
, producto externo reflexivo de=
. Crea una matriz booleana que compara cada par de elementosd
.+/
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 ded
.d[...]
devuelve ese elementofuente
+/∘.=⍨d
cuenta para cada elemento ded
.⊢∘≢⌸d
cuenta para cada elemento de∪d
, por lo que los índices no corresponden a los ded
. Contraejemplo:d←1 1 2 2 2
. Para que funcione:(∪d)[⊃⍒⊢∘≢⌸d]
o(⊃⍒⊢∘≢⌸d)⊃∪d
.Perl 6 , 21 bytes
Ejemplo:
Si hay un empate, imprimirá el más grande de los que lo hicieron.
El
.Bag
mé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.El
.invert
mé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)El
.max
mé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)El
.value
método devuelve el valor del par. (Hubiera sido la clave que buscábamos si no fuera por la.invert
llamada anterior)Si desea devolver todos los valores vinculados en caso de empate:
los
.classify
método devuelve una lista de pares de donde provienen las claves llamando a la Lambda Cualquiera*.value
con cada uno de los Pares.Entonces llamamos
.max
para obtener el par más grande.Un llamado a
.value
obtener los pares originales de la bolsa (solo uno en este caso)Luego, usamos
>>.key
para llamar al.key
método en cada par de la lista, de modo que terminemos con una lista de los valores más vistos.fuente
Java 8: 184 bytes
La entrada A debe ser de tipo
Integer[]
. Tenga en cuentajava.util.*
yjava.util.stream.*
debe importarse, sin embargo, en el Spirit Oneliner se omiten.fuente
(i->i,Collectors.counting())
.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.
Editado: comodín escapado en argumento grep. Ahora se puede ejecutar de forma segura en directorios no vacíos. Gracias a manatwork.
fuente
[0-9]*
lo contrario, puede expandirse a nombres de archivo coincidentes.'
el argumento agrep
.Perl, 27 bytes
Devuelve el último valor más común en caso de empate.
fuente
PHP,
5350 bytesCorre así:
Ajustes
d
fuente
Java 8, 83 bytes
d
debe ser aCollection<Integer>
.Si
Collections
se puede importar estáticamente:59 bytes
fuente
Haskell 78
Si se ignoran las importaciones, son 45 .
fuente
maximumBy
lugar delast.sortBy
. El nuevo código se convertiríag=head.maximumBy(comparing length).group.sort
.g=
. 2.) Puede reemplazarmaximumBy(comparing length)
por elsnd.maximum.map((,)=<<length)
que no necesita importarOrd
, para un total de 62 bytes: ¡ Pruébelo en línea!Haskell ,
4239 bytesPruébalo en línea!
Editar: Thans a Zgarb para -3 bytes
fuente
sum
es innecesario aquí.Brachylog , 5 bytes
Pruébalo en línea!
Esto no es realmente un fragmento, pero no estoy seguro de qué sería ...
fuente
Clojure, 32 bytes
(frequencies %)
devuelve un mapa hash, que se puede usar como una función. Dada una clave, devuelve el valor correspondiente :)Misma longitud:
fuente
Scala, 32
fuente
C ++ 119
Código completo y prueba:
fuente