2012-08-22 6 views
6

में एन अंकों की बाइनरी संख्याएं उत्पन्न करना मैं n 0 से 2^एन -1 के बाइनरी संख्याएं उत्पन्न करना चाहता हूं। 3 अंकों के उदाहरण के लिए, "000", "001", "010", ..., "111" (दशमलव में 0 से 7)। , मैं उत्पन्न कर सकते हैं क्या मैं इस तरह चाहते हैं तो इस कोड के साथक्लोजर

(defn pad-zero [s n] 
    (str (reduce str (repeat (- n (count s)) "0")) s)) 

(defn binary-permutation [n] 
    (map (fn [s] (pad-zero s n)) 
     (map #(Integer/toBinaryString %) (range 0 (Math/pow 2 n))))) 

: जिस तरह से मैं इस्तेमाल किया java.lang.Integer.toBinaryString() विधि का उपयोग करें और शून्य जोड़ने यदि आवश्यक हो तो निम्नलिखित की तरह है। 3 अंकों के लिए:

(binary-permutation 3) 
=> ("000" "001" "010" "011" "100" "101" "110" "111") 

लेकिन यह कोड थोड़ा वर्बोज़ देखते हैं। क्या ऐसा करने के लिए बेहतर या अधिक क्लोजर तरीका नहीं हैं?

उत्तर

7

आप clojure.pprint से स्वरूपण cl-format का उपयोग कर को आसान बनाने में कर सकते हैं:

(defn binary-permutation [n] 
    (map (partial cl-format nil "~v,'0B" n) (range 0 (Math/pow 2 n)))) 

तुम भी पता चला है कि (Math/pow 2 n)(bit-shift-left 1 n) के बराबर है दिलचस्पी हो सकती है।

एक और तरीका है व्यक्त करने के लिए इस clojure.math.combinatorics से selections की अवधि में होगा:

(defn binary-permutation [n] 
    (map (partial apply str) (selections [0 1] n))) 
+0

'सीएल-format' क्यों करें? – noahlz

+1

@noahz cl-format सामान्य लिस्प से आउटपुट स्वरूपण फ़ंक्शन है जो क्लोजर (अन्य भाषाओं में printf के समान) में उपलब्ध है। ओपी कर रहा था क्योंकि यह सिर्फ गद्दीदार बाइनरी संख्याओं को आउटपुट करना थोड़ा आसान बनाता है। एक कीस्ट्रोक सहेजा जा रहा है। यदि आपके पास कोई विकल्प भी पोस्ट करने के लिए स्वतंत्र महसूस करता है। –

+1

@noahz और यदि आप पूछ रहे हैं कि इस फ़ंक्शन के एक संस्करण को दूसरे पर क्यों उपयोग करें। मुझे यकीन नहीं है। मैं कहूंगा कि रेंज आधारित संस्करण ग्रोक के लिए थोड़ा आसान है। यह सिर्फ गिन रहा है। लेकिन संयोजक समाधान भी दिलचस्प है। –

2
(defn binary-permutation [n] 
    (for [x (range (Math/pow 2 n))] 
    (apply str (reverse (take n (map #(bit-and 1 %) (iterate #(bit-shift-right % 1) x))))))) 

(defn pad-zero [s n] 
    (apply str (take-last n (concat (repeat n \0) s))))