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)))))]))
オンラインでお試しください!
この結果に至る前に、いくつかの異なる方法を試しました。
マトリックス法: 2列のマトリックスを作成し、1列に入力ベクトル、2進表現の合計の1つを作成してから、2進数の合計でソートしました。
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-Matrix:実現されて、行列関数を捨てて、代わりにバイナリ値のベクトルを作成し、それらを合計し、順序付けしてから、順序付けられた値を使用して入力ベクトルを並べ替えることができました。
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)]}
その他のマイナーな変更セミコロンで区切られた2行ではなく、1行のコードに全体を変換します。
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に減少することは本当に減少を短くしたかったのですdecreasing
が、order
関数を短くしようとするとRは私を驚かせます。これはorder
デフォルトとして増加するデフォルトの順序を取得するために必要でしたがrev
、ベクトルを逆にする関数を思い出しました。ユーレカ!!!最終ソリューションの最後の変更は、さらに2バイトを節約function
するpryr::f
ことでした
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])