1

私はclojureにまったく慣れていないので、まだ学ぼうとしています...まあたくさんのもの。今、私はいくつかの出力を正しく表示しようとして立ち往生しています。これが私の関数です:

;function 7 - display the board
(defn display [small medium large]
(let [board (loop [i 0 boardVector [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
          ;(prn (bit-test small i)(bit-test medium i)(bit-test large i))
          (if (< i 16)
           (cond
             ;nothing exists
             (and (not(bit-test small i))(not(bit-test medium i))(not(bit-test large i)))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 0)))
             ;only small bit exists
             (and (bit-test small i)(not(bit-test medium i))(not(bit-test large i)))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 1)))
             ;small and medium exists on square
             (and (bit-test small i)(bit-test medium i)(not(bit-test large i)))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 3)))
             ;only medium exists on square
             (and (not(bit-test small i))(bit-test medium i)(not(bit-test large i)))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 2)))
             ;medium and large exists on square
             (and (not(bit-test small i))(bit-test medium i)(bit-test large i))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 6)))
             ;only large exists on square
             (and (not(bit-test small i))(not(bit-test medium i))(bit-test large i))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 4)))
             ;all three exists on square
             (and (bit-test small i)(bit-test medium i)(bit-test large i))
               (recur (+ i 1) (assoc boardVector i (+ (nth boardVector i) 7)))
               )
           boardVector)
         )
    ]
(prn  board)
)
)

これが私が引数として渡すために使用しているものです:

(display 2r1001000100 2r101001000 2r111000000)

この関数はビット変数(長さが16以下...)を受け取り、設定されているビットに応じて最終的なベクトルを計算します。スモールは1の価値があり、ミディアムは2の価値があり、ラージは4の価値があります。これが、スモールとラージが同時に設定されていない可能性を除いて、それぞれの異なる可能性を概説する条件ステートメントがある理由です。

とにかく、それが意味をなさない場合は、実際の質問があります:次のように表示される現在の出力を取得するにはどうすればよいですか?

[0 0 1 2 0 0 7 4 6 1 0 0 0 0 0 0]
nil

このように表示するには?

0 0 1 2
0 0 7 4
6 1 0 0
0 0 0 0

apply、map、str、interposeなどの関数を使用してみましたが、何が間違っているのか理解できませんでした。現在、出力は副作用として表示されていますが(これが正しい名前だと思います...)、prn関数の出力から常にnilが返されます。どちらかを取り除く方法を知らない。助けていただければ幸いです!

4

1 に答える 1

1

それを4つのグループに分割し、各グループを印刷します。

(dorun (map #(apply println %) (partition-all 4 r)))
0 0 1 2
0 0 7 4
6 1 0 0
0 0 0 0

またはfor式を使用する:

(dorun (for [line (partition-all 4 r)] (apply println line)))
0 0 1 2
0 0 7 4
6 1 0 0
0 0 0 0

またはを使用してdoseq

(doseq [line (partition-all 4 r)] (apply println line))
0 0 1 2
0 0 7 4
6 1 0 0
0 0 0 0

dorunとの例には(またはdoall)が必要です。これらは怠惰であり、返されたシーケンスが消費されない限り、実際には何も出力されないためです。とシーケンスを呼び出すと、printlnはシーケンス自体ではなく、引数としてシーケンスの内容を取得します。これにより、余分な括弧が印刷されなくなります。formapapplyprintln

于 2012-10-20T18:50:09.113 に答える