1

LIST1行に一連の文字が含まれるファイル があります。各行には、「C」というカテゴリのラベルが付いています。例:

C: w r t y i o p s d f g h j k l z b n m
V: a e i o u
E: n m ng

C、V、Eのすべての組み合わせ(またはCとV、CとEなど)を使用して印刷したいのですdoseqが、一般的には、コンパイル時にネストされたコレクションがわからないためです。

つまり

"CV" [x y] (str x y ) 
"CVE" [x y z] (str x y z) 
"CVCV" [x y z a] (str x y z a)

私のコードword-generator.clj

(ns word-generator )
(use 'clojure.string)
(import 'java.io.File)
(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (line-seq r))))

(defn get-list [x lines]
  (first (remove nil?
  (for [num  (range (count lines)) ]
   (if (= (first(split (nth lines num) #"\s+")) x)
     (rest(split (nth lines num) #"\s+")))))))

(def sounds(get-lines "LIST")) ;; get the list


(def C (get-list "C:" sounds)) ;; map consonants 
(def V (get-list "V:" sounds)) ;; map vowels
(def E (get-list "E:" sounds)) ;; map end consonants
(def LI "CVE") ;; word structure 


(defn word-runner[carry args depth]
  (doseq [x C y V z E] (println (str x y z)))) ;; iterate and make the words

(defn runner[]
  ( (print "enter arg list: ")
    (def INPUT (read-line))
    (word-runner "" INPUT 0)))

コンパイル時にファイル内の行数を知らなくても、ファイル内で見つかった文字のすべてのシーケンスに対してネストされたループを実行するword-runnerように実装するにはどうすればよいですか?doseq

4

1 に答える 1

2

これは実際には組み合わせ論の問題であり、それほどループすることはありません。math.combinatoricscartesian-productライブラリの関数を使用して、問題を解決してください。

;; alternative implementation of "word-runner"
(defn print-cartesian-products [& seqs] 
    (doseq [combs (apply cartesian-product seqs)] 
        (println (apply str combs))))
于 2012-10-27T02:43:56.497 に答える