R , 132 96 94 88 84 75 73 53 51 байт
-20 завдяки реалізації J.Doe ще -2 завдяки Джузеппе
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Моя оригінальна публікація:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
Спробуйте в Інтернеті!
Я спробував кілька різних методів, перш ніж дійти до цього результату.
Матричний метод: Створено матрицю з двома стовпцями, один стовпець з вхідним вектором, одну з суми двійкового подання, потім я відсортував за сумою двійкового.
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),]}
Нематрична: Усвідомлена Я могла викинути матричну функцію і замість цього створити вектор бінарних значень, підсумувати їх, упорядкувати їх, а потім використати впорядковані значення для зміни порядку введення вектора.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Незначні зміни
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Більш незначні зміни Перетворення всієї речі в один рядок коду замість двох розділених крапкою з комою.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Метод підсумовування Замість того, щоб додавати стовпці із colSumsствореної компанією двійкової матриці sapply, я додав елементи в стовпчик перед sapply"завершеним".
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Зниження до Rev I дуже хотів скоротити зменшується, але R пронизливих у мене , якщо я намагаюся скоротити decreasingв orderфункції, яка необхідна для того, щоб отримати замовлення бажано , як по orderзамовчуванням для збільшення, то я згадав revфункцію зворотного вектора. EUREKA !!! Остання зміна в остаточному рішенні було functionдо , pryr::fщоб зберегти більше 2 байта
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])