R , 132 96 94 88 84 75 73 53 51 byte
-20 Berkat implementasi J.oe -2 Lebih banyak terima kasih kepada Giuseppe
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Posting asli saya:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
Cobalah online!
Saya mencoba beberapa metode yang berbeda sebelum saya sampai pada hasil ini.
Metode Matriks: Membuat matriks dua kolom, satu kolom dengan vektor input, salah satu dari jumlah representasi biner, lalu saya urutkan berdasarkan jumlah biner.
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-Matriks: Menyadari bahwa saya dapat membuang fungsi matriks dan sebagai gantinya membuat vektor nilai-nilai biner, menjumlahkannya, memesannya, lalu menggunakan nilai yang diurutkan untuk menyusun ulang vektor input.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Perubahan kecil
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Lebih Banyak Perubahan Kecil Mengubah seluruh hal menjadi satu baris kode alih-alih dipisahkan oleh tanda titik koma.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Metode Sum Alih-alih menambahkan kolom dengan colSums
matriks biner yang dibuat oleh sapply
, saya menambahkan elemen dalam kolom sebelum sapply
"selesai."
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Penurunan untuk Rev Aku benar-benar ingin mempersingkat menurun, tetapi R squawks pada saya jika saya mencoba untuk mempersingkat decreasing
dalam order
fungsi, yang diperlukan untuk mendapatkan pesanan yang diinginkan sebagai order
default untuk meningkat, maka saya teringat rev
fungsi untuk membalikkan vektor. EUREKA !!! Perubahan terakhir dalam solusi akhir adalah function
untuk pryr::f
menyelamatkan 2 byte lagi
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])