R , 132 96 94 88 84 75 73 53 51 bayt
-20, J.Doe'nun uygulaması sayesinde -2
function(x)x[order(colSums(sapply(x,intToBits)<1))]
Orijinal yayınım:
pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))
Çevrimiçi deneyin!
Bu sonuca varmadan önce birkaç farklı yöntem denedim.
Matris Yöntemi: İki sütun matrisi oluşturulmuş, bir giriş vektörü ile bir sütun, ikili gösterimin toplamından biri, sonra ben ikili toplamı sıraladım.
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),]}
Matris Olmayan: Gerçekleştirildi Matris fonksiyonunu atabilir ve bunun yerine bir ikili değer vektörü oluşturabilir, onları toplayabilir, sıralayabilir, sonra girdi vektörünü yeniden sıralamak için sıralı değerleri kullanabilirim.
function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}
Küçük değişiklikler
function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}
Daha Küçük Değişiklikler Her şeyi noktalı virgülle ayrılmış iki yerine bir kod satırına dönüştürme.
function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]
Toplama YöntemicolSums
Oluşturulan ikili matrisin sütunlarını eklemek yerine, "bitmiş" işleminden sapply
önce sütundaki öğeleri ekledim sapply
.
function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]
Rev için Azalan I gerçekten azalan kısaltmak istedim, ama bana R squawks ben kısaltmak çalışırsanız decreasing
içinde order
sipariş olarak istenen almak gerekliydi fonksiyonu, order
artan varsayılan, sonra hatırladım rev
bir vektör ters fonksiyonunu. EUREKA !!! Son çözümdeki son değişiklik 2 bayt daha tasarruf etmekti function
.pryr::f
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])