R , 132 96 94 88 84 75 73 53 51 byte
-20 cảm ơn việc triển khai của J.Doe -2 cảm ơn Giuseppe
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Bài viết gốc của tôi:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
Hãy thử trực tuyến!
Tôi đã thử một vài phương pháp khác nhau trước khi tôi nhận được kết quả này.
Phương pháp ma trận: Tạo một ma trận hai cột, một cột với vectơ đầu vào, một trong tổng của biểu diễn nhị phân, sau đó tôi sắp xếp trên tổng của nhị phân.
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),]}
Phi ma trận: Đã thực hiện Tôi có thể loại bỏ hàm ma trận và thay vào đó tạo ra một vectơ các giá trị nhị phân, tính tổng chúng, sắp xếp chúng, sau đó sử dụng các giá trị được sắp xếp để sắp xếp lại vectơ đầu vào.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Thay đổi nhỏ
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Nhiều thay đổi nhỏ hơn Chuyển đổi toàn bộ điều thành một dòng mã thay vì hai phân tách bằng dấu chấm phẩy.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Phương pháp tính tổng Thay vì thêm các cột bằng colSums
ma trận nhị phân được tạo bởi sapply
, tôi đã thêm các phần tử trong cột trước khi sapply
"kết thúc".
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Giảm đến Rev Tôi thực sự muốn rút ngắn giảm, nhưng tiếng kêu quang quác R với tôi nếu tôi cố gắng rút ngắn decreasing
trong order
chức năng, đó là điều cần thiết để có được thứ tự mong muốn như order
mặc định là ngày càng tăng, sau đó tôi nhớ các rev
chức năng để đảo ngược một vector. EUREKA !!! Sự thay đổi cuối cùng trong giải pháp cuối cùng là function
để pryr::f
tiết kiệm hơn 2 byte
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])