R , 132 96 94 88 84 75 73 53 51 bytes
-20 gracias a la implementación de J.Doe -2 más gracias a Giuseppe
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Mi post original:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
Pruébalo en línea!
Probé varios métodos diferentes antes de llegar a este resultado.
Método de matriz: Creé una matriz de dos columnas, una columna con el vector de entrada, una de la suma de la representación binaria, luego ordené la suma de binario.
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),]}
No matricial: me di cuenta de que podía descartar la función matricial y en su lugar crear un vector de valores binarios, sumarlos, ordenarlos y luego usar los valores ordenados para reordenar el vector de entrada.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Cambios menores
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Más cambios menores Convertir todo en una línea de código en lugar de dos separadas por un punto y coma.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Método de suma En lugar de agregar las columnas con colSums
la matriz binaria creada por sapply
, agregué los elementos en la columna antes de sapply
"terminar".
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Disminuir a Rev Realmente quería acortar la disminución, pero R me grita si trato de acortar decreasing
la order
función, que era necesaria para obtener el orden deseado como order
valores predeterminados para aumentar, luego recordé la rev
función de invertir un vector. EUREKA !!! El último cambio en la solución final fue function
a pryr::f
salvar más de 2 bytes
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])