R , 132 96 94 88 84 75 73 53 51 byte
-20 grazie all'implementazione di J.Doe -2 in più grazie a Giuseppe
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Il mio post originale:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
Provalo online!
Ho provato diversi metodi prima di arrivare a questo risultato.
Metodo Matrix: ho creato una matrice a due colonne, una colonna con il vettore di input, una della somma della rappresentazione binaria, quindi ho ordinato la somma del 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),]}
Non matrice: realizzato che potrei lanciare la funzione matrice e invece creare un vettore di valori binari, sommarli, ordinarli, quindi utilizzare i valori ordinati per riordinare il vettore di input.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Modifiche minori
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Altre modifiche minori Conversione di tutto in una riga di codice anziché in due separati da un punto e virgola.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Metodo somma Invece di aggiungere le colonne con colSums
la matrice binaria creata da sapply
, ho aggiunto gli elementi nella colonna prima di sapply
"finito".
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Diminuendo al Rev. Volevo davvero accorciarlo diminuendo, ma R mi scricchiolava se cercavo di accorciare decreasing
la order
funzione, che era necessario per far order
aumentare l'ordine desiderato come impostazione predefinita, quindi mi sono ricordato della rev
funzione per invertire un vettore. EUREKA !!! L'ultima modifica nella soluzione finale è stata function
quella pryr::f
di salvare altri 2 byte
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])