6

n0 から 2^n-1 までの 2進数を生成したいと思います。3桁の例「000」「001」「010」「111」(10進数で0~7)。私が使用した方法は、java.lang.Integer.toBinaryString()メソッドを使用し、次のように必要に応じてゼロを追加することです。

(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)))))

このコードを使用すると、このように必要なものを生成できます。3 桁の場合:

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

しかし、このコードは少し冗長に見えます。これを行うためのより良い方法またはより多くのclojure方法はありませんか?

4

2 に答える 2

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からの選択に関してです。

(defn binary-permutation [n]
  (map (partial apply str) (selections [0 1] n)))
于 2012-08-22T06:50:27.443 に答える
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))))
于 2012-08-22T12:19:48.113 に答える