Escreva um trecho para calcular o modo (número mais comum) de uma lista de números inteiros positivos.
Por exemplo, o modo de
d = [4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]
é 1
, porque ocorre no máximo 5 vezes.
Você pode assumir que a lista é armazenada em uma variável como d
e possui um modo exclusivo.
por exemplo: Python, 49
max(((i,d.count(i))for i in set(d)), key=lambda x:x[1])
Isso é código-golfe , então a solução mais curta em bytes vence.
code-golf
array-manipulation
garg10may
fonte
fonte
d,
ekey=
.defaultdict(int)
orCounter
. Algo comoCounter(d).most_common()[0]
.Matlab / Octave,
75 bytesSem surpresa, há uma função interna para encontrar modos. Como uma função anônima:
Isso retorna o elemento de ocorrência mais comum no vetor de entrada, com os vínculos indo para o valor menor.
Economizou 2 bytes graças a Dennis!
fonte
help mode
): "Se dois ou mais valores tiverem a mesma frequência, 'mode` retornará o menor."@mode
.Pitão - 6
Experimente online.
Espera entrada no stdin como
[4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]
. Os laços são resolvidos pela última ocorrência porque o Python executa classificações estáveis.Classifica a lista por contar o valor na lista e, em seguida, imprime o último número da lista.
Q
pode ser substituído pord
se você inicializoud
para conter o valor antes, por exemplo=d[4 3 1 0 6 4 4 0 1 7 7 3 4 1 1 2 8)
Pseudo-código em estilo Python:
Explicação completa:
O Pyth é
orderby
executado exatamente como o Python,sorted
comorderby
o primeiro argumento sendo okey
argumento.fonte
Mathematica, 25 bytes
ou
Como no desafio, isso espera que a lista seja armazenada
d
.ou ... 15 bytes
Obviamente, o Mathematica não seria o Mathematica se não tivesse um built-in:
Commonest
retorna uma lista de todos os elementos mais comuns (em caso de empate) e#&@@
é um jogo de golfeFirst@
.fonte
Ruby, 22 bytes
Basicamente, uma porta da minha resposta do Mathematica, exceto que Ruby tem uma direta,
max_by
então eu não preciso classificar primeiro.fonte
d.max_by d.method:count
mas isso é cerca de um milhão (também conhecido como nem dois) bytes mais. Ainda assim, vale a pena notar que é possível.R,
3325 bytesObrigado @Hugh pela redução de ajuda:
O original:
Isso calcula a frequência de cada elemento no vetor e
d
, em seguida, retorna o nome da coluna que contém o maior valor. O valor retornado é na verdade uma sequência de caracteres que contém o número. Não dizia em lugar nenhum que isso não estava bem, então ...Quaisquer sugestões para encurtar isso são bem-vindas!
fonte
names(sort(-table(d))[1])
CJam,
1110 bytesAssume a matriz em uma variável chamada
A
. Isso basicamente classifica a matriz com base na ocorrência de cada número na matriz e, em seguida, escolhe o último elemento da matriz.Exemplo de uso
Saída
1 byte economizado graças ao Dennis!
Experimente online aqui
fonte
A{A\-,}$0=
é um byte mais curto.Ae`$e_W=
$e`$e_W=
Powershell 19
(isso pressupõe que a matriz já está ativada
$d
)fonte
J - 12 caracteres
Função anônima. Classifica a lista do mais ao menos comum, obtendo o primeiro item.
0{
O primeiro de~.
Itens exclusivos\:
Ordenado por#/.~
FrequênciasExperimente você mesmo.
fonte
JavaScript (ES6) 51
Apenas uma expressão de linha única usando a variável pré-carregada d. Classifique a matriz por frequência e obtenha o primeiro elemento.
Efeito colateral desagradável, a matriz original é alterada
Como de costume, use .map em vez de .reduce porque é 1 char mais curto no geral. Com o .reduce, é quase uma solução limpa e sem golfe.
Por fim, uma solução usando uma função, sem alterar a matriz original e sem globais (62 bytes):
Teste no console do FireFox / FireBug
Saída 1
A matriz d se torna:
fonte
Python - 32
Não veja uma solução de 18 caracteres em nenhum lugar no futuro para ser honesto.
EDIT: Eu estou corrigido, e impressionado.
fonte
JavaScript, ES6, 71 bytes
Um pouco longo, pode ser jogado muito.
Isso cria uma função
f
que pode ser chamada comof([1,1,1,2,1,2,3,4,1,5])
e retornará1
.Experimente no seu console mais recente do Firefox.
fonte
f=a=>(c=b=[],a.map(x=>b[x]++-1?0:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())
é 1 byte mais curto.05AB1E , 3 bytes
(não concorrente - a pergunta é anterior ao idioma)
Explicação:
Se você deseja armazenar a matriz em uma variável em vez de usar a entrada, basta empurrar a matriz para a pilha no início do programa.
Experimente online!
fonte
C # - 49
Não é possível competir usando C #, mas tudo bem:
Assumindo que
d
é a matrizd.GroupBy(i=>i).OrderBy(a=>a.Count()).Last().Key;
fonte
bash -
2927 caracteresUsando isso:
ou seja, "1" é o modo e aparece cinco vezes.
fonte
sort|uniq -c|sort -nr|sed q
salva dois caracteresGolfScript, 10 bytes
A partir desta resposta , escrevi para Dicas para jogar golfe no GolfScript . Espera a entrada em uma matriz chamada
a
, retorna o resultado na pilha. (Para ler a entrada de uma matriz na pilha, adicione:
11 bytes; para ler a entrada de stdin (no formato[1 2 1 3 7]
), também adicione~
12 bytes.)Esse código funciona iterando sobre a matriz de entrada, subtraindo cada elemento da matriz original e contando o número de elementos restantes. Isso é usado como uma chave para classificar a matriz original e o primeiro elemento da matriz classificada é retornado.
Demonstração online.
Ps. Agradeço a Peter Taylor por apontar esse desafio para mim .
fonte
Dyalog APL, 12 caracteres
d[⊃⍒+/∘.=⍨d]
∘.=⍨d
é o mesmo qued∘.=d
, produto externo reflexivo de=
. Ele cria uma matriz booleana comparando cada par de elementosd
.+/
soma essa matriz ao longo de um dos eixos e produz um vetor.⍒
classifica o vetor, ou seja, classifica-o por índices. (Como sugerem os glifos,⍒
classifica em ordem decrescente e⍋
classifica em ordem crescente.)⊃
pega o primeiro índice da classificação - o índice do maior elemento ded
.d[...]
retorna esse elemento.fonte
+/∘.=⍨d
conta para cada elemento ded
.⊢∘≢⌸d
conta para cada elemento de∪d
, para que os índices não correspondam aos ded
. Contra-exemplo:d←1 1 2 2 2
. Para fazer funcionar:(∪d)[⊃⍒⊢∘≢⌸d]
ou(⊃⍒⊢∘≢⌸d)⊃∪d
.Perl 6 , 21 bytes
Exemplo:
Se houver um empate, ele imprimirá o maior dos empatados.
O
.Bag
método em uma Lista ou Matriz cria um hash quantificado que associa a contagem total de quantas vezes um determinado valor foi visto com esse valor.O
.invert
método cria uma lista dos pares na sacola com a chave e o valor trocado. (O motivo pelo qual chamamos isso é o próximo método para fazer o que queremos)O
.max
método em uma Lista de pares retorna o maior par comparando primeiro as chaves e, no caso de empate, comparando os valores.(Isso ocorre porque é assim
multi infix:<cmp>(Pair:D \a, Pair:D \b)
que determina qual é maior)O
.value
método retorna o valor do par. (Seria a chave que buscávamos se não fosse pela.invert
ligação anterior)Se você deseja retornar todos os valores que empataram no caso de empate:
O
.classify
método retorna uma lista de pares em que as chaves estão chamando o lambda Whatever*.value
com cada um dos pares.Então chamamos
.max
para obter o maior par.Uma ligação para
.value
obter os pares originais do saco (apenas um neste caso)Em seguida,
>>.key
chamamos o.key
método em todos os pares da lista, para que terminemos com uma lista dos valores mais vistos.fonte
Java 8: 184 bytes
A entrada A deve ser do tipo
Integer[]
. Observejava.util.*
ejava.util.stream.*
precisa ser importado, no entanto, no espírito de delineamento, eles são deixados de fora.fonte
(i->i,Collectors.counting())
.Ferramentas Bash + unix, 62 bytes
Espera a matriz no STDIN. O formato de entrada não conta, desde que os números sejam números inteiros não negativos.
Editado: curinga escapada no argumento grep. Agora ele pode ser executado com segurança em diretórios não vazios. Graças à manatwork.
fonte
[0-9]*
pode ser expandido para nomes de arquivos correspondentes.'
o argumento paragrep
.Perl, 27 bytes
Retorna o último valor mais comum em caso de empate.
fonte
PHP,
5350 bytesExecute assim:
Tweaks
d
fonte
Java 8, 83 bytes
d
deve ser aCollection<Integer>
.Se
Collections
pode ser importado estaticamente:59 bytes
fonte
Haskell 78
Se as importações são ignoradas, são 45 .
fonte
maximumBy
vez delast.sortBy
. O novo código se tornariag=head.maximumBy(comparing length).group.sort
.g=
. 2.) Você pode substituirmaximumBy(comparing length)
pelosnd.maximum.map((,)=<<length)
que não precisa importarOrd
, para um total de 62 bytes: Experimente online!Haskell ,
4239 bytesExperimente online!
Edit: Thans para Zgarb por -3 bytes
fonte
sum
desnecessário aqui.Braquilog , 5 bytes
Experimente online!
Este não é realmente um trecho, mas não tenho certeza do que seria ...
fonte
Clojure, 32 bytes
(frequencies %)
retorna um mapa de hash, que pode ser usado como uma função. Dada uma chave, ele retorna o valor correspondente :)Comprimento igual:
fonte
Scala, 32
fonte
C ++ 119
Código e teste completos:
fonte