R , 132 96 94 88 84 75 73 53 51 байт
-20 благодаря реализации J.Doe - еще 2 благодаря Giuseppe
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)]
Метод Sum Вместо добавления столбцов с 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
функцию обратного вектора. ЭВРИКА !!! Последнее изменение в окончательном решении состояло function
в том, pryr::f
чтобы сохранить еще 2 байта
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])