Objetivo
Escreva uma função ou programa que classifique uma matriz de números inteiros em ordem decrescente pelo número de 1's presentes em sua representação binária. Nenhuma condição de classificação secundária é necessária.
Exemplo de lista classificada
(usando números inteiros de 16 bits)
Dec Bin 1's
16375 0011111111110111 13
15342 0011101111101110 11
32425 0111111010101001 10
11746 0010110111100010 8
28436 0000110111110100 8
19944 0100110111101000 8
28943 0000011100011111 8
3944 0000011111101000 7
15752 0011110110001000 7
825 0000000011111001 6
21826 0101010101000010 6
Entrada
Uma matriz de números inteiros de 32 bits.
Saída
Uma matriz dos mesmos números inteiros classificados como descrito.
Pontuação
Esse é o código golf para o menor número de bytes a ser selecionado em uma semana.
Respostas:
J (11)
Esta é uma função que leva uma lista:
Se você quiser dar um nome, custa um caractere extra:
Explicação:
\:
: classificar para baixo em+/
: soma de"1
: cada linha de#:
: representação bináriafonte
\:1#.#:
que salva alguns bytes.JavaScript, 39
Atualização: Agora menor que o Ruby.
40.
Explicação:
q é uma função recursiva. Se x ou y forem 0, ele retornará
x-y
(um número negativo se x for zero ou um número positivo se y for zero). Caso contrário, ele remove o bit mais baixo (x&x-1
) de x e ye repete.Versão anterior (42)
fonte
~y
funcionar em vez de-!y
?!x|-!y
se torna diferente de zero.~
realmente não se encaixa, pois é diferente de zero para muitas entradas (incluindo zero)Ruby 41
Teste:
fonte
Python 3 (44):
fonte
Lisp comum, 35
logcount
retorna o número de 'on' bits em um número. Para uma listal
, temos:Como uma função autônoma, e no que basearemos a contagem de bytes:
fonte
Python 3,
90777267 caracteres.Nossa solução obtém uma entrada da linha de comando e imprime o número em ordem decrescente (67 caracteres) ou crescente (66).
Ordem decrescente
Obrigado a @daniero , pela sugestão de usar um sinal de menos na contagem de 1 para reverter isso, em vez de usar uma fatia para reverter a matriz no final! Isso efetivamente salvou 5 caracteres.
Apenas para publicá-lo, a versão da ordem crescente (que foi a primeira que fizemos) levaria um caractere a menos.
Ordem crescente :
Obrigado a @Bakuriu pela sugestão = lambda x… . ; D
fonte
0
sempre fará parte da sua saída; Isso não está correto.raw_input()
e soltar alguns caracteres?[]
interiorsorted
. Além disso, a saída deste programa é o número de 1s nos números da entrada classificados, mas você deve exibir o número recebido na entrada, classificado usando o número de1
s. Algo como:print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))
estaria correto.JavaScript [76 bytes]
onde
a
é uma matriz de entrada de números.Teste:
fonte
..
funciona? Meu entendimento é que, sex = 5
então seeval(x + r)
torna oeval(5..toString(2).match(/1/g).length)
que, suponho, é inválido. Obrigado.'string'.length
ou[1,2,3].pop()
. No caso de números, você pode fazer o mesmo, mas lembre-se de que, após um único ponto, o analisador procurará uma parte fracionária do número que espera um valor flutuante (como em123.45
). Se você usar um inteiro você deve "dizer" o analisador de que uma parte fracionária é vazio, definindo um ponto extra antes de abordar uma propriedade:123..method()
.match(/1/g).length
porreplace(/0/g,"")
.a.sort(function(x,y){r='..toString(2).match(/1/g).length';return eval(y+r+-x+r)})
Mathematica 30
Uso:
fonte
k [15 caracteres]
Exemplo 1
Exemplo 2 (todos os números são 2 ^ n -1)
fonte
Mathematica 39
IntegerDigits[#,2]
converte um número base 10 na lista de 1 e 0.Tr
soma os dígitos.Caso de teste
fonte
Java 8 -
87/11381/11160/8060/74/48 caracteresEste não é um programa java completo, é apenas uma função (um método, para ser exato).
Ele assume que
java.util.List
ejava.lang.Long.bitCount
é importado e tem 60 caracteres:Se nenhum material pré-importado for permitido, aqui está com 74 caracteres:
Adicione mais 7 caracteres, se for necessário
static
.[4 anos depois] Ou, se preferir, pode ser um lambda (obrigado @KevinCruijssen pela sugestão), com 48 bytes:
fonte
Integer.bitCount(x)<Integer.bitCount(y)?-1:1;
? Você precisa do-1,0,1
comportamento?<Integer>
espaço com?Long
, que poupar espaço :)a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
Python 2.x - 65 caracteres (bytes)
Na verdade, são 66 caracteres, 65 se fizermos isso uma função (então você precisa de algo para chamá-lo, que é lamer para apresentar).
Demonstração no Bash / CMD:
fonte
sum(int(d)for d in bin(x)[2:])
parasum(map(int,bin(x)[2:]))
print sorted(input(),key=lambda x:-bin(x).count('1'))
Matlab, 34
Entrada em 'a'
Funciona para números não negativos.
fonte
C - 85 bytes (
108106 bytes)Versão portátil no GCC / Clang / onde quer que
__builtin_popcount
esteja disponível (106 bytes):Versão ultracondensada, não portátil, apenas funcional para MSVC (85 bytes):
A primeira nova linha incluída na contagem de bytes, por causa do
#define
, os outros não são necessários.A função a ser chamada está de
s(array, length)
acordo com as especificações.É possível codificar
sizeof
na versão portátil para salvar outros 7 caracteres, como algumas outras respostas em C fizeram. Não tenho certeza de qual deles vale mais em termos de relação comprimento / usabilidade, você decide.fonte
sizeof l
salva um byte. O horrivelmente feio#define p-__builtin_popcount(
pode ajudar a salvar outro.PowerShell v3,
615853O ScriptBlock do
Sort-Object
cmdlet retorna uma matriz de 1 para cada 1 na representação binária do número.Sort-Object
classifica a lista com base no comprimento da matriz retornada para cada número.Executar:
fonte
$f={
é redundante,while
->for
,-band1
->%2
,-des
->-d
e outros truques de golfe. Está claro. Você pode explicar como trabalhar$args|sort{@(1,1,...,1)}
? Isso funciona! Como a classificação compara matrizes sem explícito.Count
? onde ler sobre isso? Obrigado!help Sort-Object -Parameter property
Não sei onde a propriedade de classificação padrão para tipos está definida, mas para matrizes é Contagem ou Comprimento.$args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-des
dá um resultado errado. Portanto, não éCount
. É muito interessante. Obrigado novamente.ECMAScript 6, 61
Assume que
z
é a entradaDados de teste
Obrigado, escova de dentes para a solução mais curta.
fonte
z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)
(e obrigado pelo voto positivo).R ,
1329694888475735351 bytes-20 graças à implementação de J.Doe -2 mais graças a Giuseppe
Minha postagem original:
Experimente online!
Eu tentei vários métodos diferentes antes de chegar a esse resultado.
Método da matriz: Criou uma matriz de duas colunas, uma coluna com o vetor de entrada, uma da soma da representação binária e, em seguida, classifiquei a soma do binário.
Não matriz: percebi que eu poderia jogar fora a função da matriz e criar um vetor de valores binários, somar, ordená-los e depois usar os valores ordenados para reordenar o vetor de entrada.
Pequenas alterações
Mais pequenas alterações Convertendo tudo para uma linha de código em vez de duas separadas por ponto e vírgula.
Método Sum Em vez de adicionar as colunas com
colSums
a matriz binária criada porsapply
, adicionei os elementos na coluna antes desapply
"terminar".Diminuindo para Rev Eu realmente queria diminuir a diminuição, mas R grita comigo se eu tentar diminuir
decreasing
aorder
função, necessária para obter a ordem desejada comoorder
padrão para aumentar, então lembrei darev
função de reverter um vetor. EUREKA !!! A última mudança na solução final foifunction
parapryr::f
salvar mais 2 bytesfonte
Haskell, 123C
Esta é a primeira maneira que pensei em resolver isso, mas aposto que há uma maneira melhor de fazer isso. Além disso, se alguém souber uma maneira de jogar golfe nas importações de Haskell, eu ficaria muito interessado em ouvi-la.
Exemplo
Versão não destruída (com explicações)
fonte
mod
,n`mod`2
? Tem a mesma precedência que multiplicação e divisão.CoffeeScript (94)
Código legível (212):
Otimizado (213):
Ofuscante (147):
Os operadores ternários são excessivamente longos (129):
Ainda por muito tempo, pare de transmitir (121):
Final (94):
fonte
Smalltalk (Smalltalk / X), 36 (ou talvez 24)
entrada em a; classifica destrutivamente um:
versão funcional: retorna uma nova matriz classificada:
existe ainda uma variante mais curta (passando o nome ou a função como argumento) em 24 caracteres. Mas (suspiro) ele será o mais alto por último. Pelo que entendi, isso não foi solicitado, por isso não considero isso como pontuação de golfe:
fonte
PHP 5.4+ 131
Eu nem sei por que me preocupo com PHP, neste caso:
Uso:
fonte
Scala, 58
fonte
DFSORT (produto de classificação IBM Mainframe) 288 (cada linha de origem possui 72 caracteres, deve ter espaço na posição um)
Apenas por diversão e sem matemática.
Pega um arquivo (pode ser executado a partir de um programa que usou uma "matriz") com os números inteiros. Antes da classificação, ele converte os números inteiros em bits (em um campo de 16 caracteres). Em seguida, altera os 0s nos bits para nada. ORDENAR Descendente do resultado dos bits alterados. Cria o arquivo classificado apenas com os números inteiros.
fonte
C
fonte
C #,
8889Editar: ordem decrescente adiciona um caractere.
fonte
Javascript 84
Inspirado por outras respostas javascript, mas sem eval e regex.
fonte
Javascript (82)
fonte
Postscript, 126
Como a lista de valores pelos quais classificamos é conhecida de antemão e é muito limitada (32), essa tarefa pode ser realizada facilmente, mesmo que não haja uma classificação interna, escolhendo valores correspondentes para 1 .. 32. (É O (32n)? Provavelmente).
O procedimento espera a matriz na pilha e retorna a matriz 'classificada'.
Ou, ritualmente sem espaço em branco e legibilidade:
Então, se salvo em
bits.ps
nele, pode ser usado assim:Eu acho que efetivamente é o mesmo que este Perl (ainda não há Perl aqui também):
Embora isso , ao contrário do Postscript, possa ser facilmente jogado:
fonte
C -
124111Implementado como um método e usando a biblioteca padrão para a classificação. Um ponteiro para a matriz e o tamanho devem ser passados como parâmetros. Isso funcionará apenas em sistemas com ponteiros de 32 bits. Em sistemas de 64 bits, alguns caracteres precisam ser gastos especificando definições de ponteiro.
Recuo para facilitar a leitura
Exemplo de chamada:
fonte
Java 8: 144
Em forma expandida:
Como você pode ver, isso funciona convertendo
args
para paraStream<String>
e depois paraStream<Integer>
com aInteger::decode
referência de função (menor queparseInt
ouvalueOf
) e, em seguida, classificando porInteger::bitCount
, colocando-o em uma matriz e imprimindo-o.Os fluxos tornam tudo mais fácil.
fonte