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)]
การลดลงของ Revฉันต้องการลดระยะทางให้สั้นลง แต่ R squawks ที่ฉันถ้าฉันพยายามdecreasing
ทำให้order
ฟังก์ชันสั้นลงซึ่งจำเป็นต้องได้รับคำสั่งที่ต้องการเป็นorder
ค่าเริ่มต้นที่เพิ่มขึ้นจากนั้นฉันจำได้ว่าrev
ฟังก์ชันเพื่อย้อนกลับเวกเตอร์ EUREKA !!! การเปลี่ยนแปลงล่าสุดในการแก้ปัญหาสุดท้ายคือfunction
เพื่อpryr::f
ที่จะประหยัดมากขึ้น 2 ไบต์
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])