R , 132 96 94 88 84 75 73 53 51 bytes
-20 graças à implementação de J.Doe -2 mais graças a Giuseppe
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Minha postagem original:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
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.
function(x){m=matrix(c(x,colSums(sapply(x,function(y){as.integer(intToBits(y))}))),nc=2,nr=length(x));m[order(m[,2],decreasing=T),]}
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.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Pequenas alterações
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Mais pequenas alterações Convertendo tudo para uma linha de código em vez de duas separadas por ponto e vírgula.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Método Sum Em vez de adicionar as colunas com colSums
a matriz binária criada por sapply
, adicionei os elementos na coluna antes de sapply
"terminar".
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Diminuindo para Rev Eu realmente queria diminuir a diminuição, mas R grita comigo se eu tentar diminuir decreasing
a order
função, necessária para obter a ordem desejada como order
padrão para aumentar, então lembrei da rev
função de reverter um vetor. EUREKA !!! A última mudança na solução final foi function
para pryr::f
salvar mais 2 bytes
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])