आर , 132 96 94 88 84 75 73 53 51 बाइट्स
-20 के जे। डो के कार्यान्वयन के लिए धन्यवाद -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)]
रेव को घटाना मैं वास्तव में कम हो रही छोटा करने के लिए चाहता था, लेकिन मुझ पर आर squawks अगर मैं छोटा करने के लिए कोशिश decreasing
में order
समारोह है, जो आदेश के रूप में वांछित पाने के लिए जरूरी हो गया था order
बढ़ाने के लिए चूक है, तो मुझे याद है rev
एक वेक्टर उल्टा करने के लिए कार्य करते हैं। यूरेका !!! अंतिम समाधान में पिछले परिवर्तन किया गया function
करने के लिए pryr::f
2 और बाइट्स को बचाने के लिए
function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])