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)]
数总和法而不是用加列colSums
由创建的二元矩阵的sapply
,我之前加列元素sapply
“完了。”
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
下降到启我真的想缩短减少,但在我[R叫声,如果我尽量缩短decreasing
在order
功能,这是必要的,以获得所需的顺序作为order
违约增加,然后我想起了rev
功能逆转的向量。EUREKA !!!最终解决方案中的最后一个更改是function
要pryr::f
多保存2个字节
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])