Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add a -main to handle command line arguments and clean up *-monkey argument handling, some minor style tweaks, make read-words read from a file. |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
06eff72cda3393a5a3e69a740b2f0711 |
| User & Date: | mwm@mired.org 2010-09-07 02:37:38.000 |
Context
|
2010-11-22
| ||
| 23:18 | Add a trailing newline. check-in: b23579bfb1 user: mwm@mired.org tags: trunk | |
|
2010-09-07
| ||
| 02:37 | Add a -main to handle command line arguments and clean up *-monkey argument handling, some minor style tweaks, make read-words read from a file. check-in: 06eff72cda user: mwm@mired.org tags: trunk | |
|
2010-09-06
| ||
| 00:47 | Add the word monkey source code. check-in: 1a04a6f9bc user: mwm@mired.org tags: trunk | |
Changes
Changes to clojure/monkey.clj.
1 2 | ;;;; A variable-order word monkey (markov chain of words. | > > | > > > > | | < | > | | | > | | > > > | | | | | > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
;;;; A variable-order word monkey (markov chain of words.
(ns monkey (:gen-class)
(:use [clojure.contrib.duck-streams :only (reader)])
(:use [clojure.contrib.str-utils2 :only (split blank?)])
(:use [clojure.contrib.command-line :only (with-command-line)]))
(def *maxgen* 1000) ; default maximum number of objects to generate
(def *prefix-len* 2) ; default prefix length
(defn read-words [file]
(letfn [(read-unfiltered []
(when-let [line (read-line)]
(concat (split line #"[\s]+") (read-unfiltered))))]
(with-open [rdr (reader file)]
(binding [*in* rdr] (remove blank? (read-unfiltered))))))
(defn add-map [markov-map prefix-plus]
(let [prefix (vec (butlast prefix-plus))]
(assoc markov-map prefix (conj (markov-map prefix) (last prefix-plus)))))
(defn build-map [prefix-len col]
(reduce add-map {} (partition (inc prefix-len) 1
(concat (repeat prefix-len nil) (col) [nil]))))
(defn generate [markov-map prefix]
(let [suffixes (markov-map (vec prefix))]
(when-let [suffix (nth suffixes (rand-int (count suffixes)))]
(lazy-cat [suffix] (generate markov-map (concat (rest prefix) [suffix]))))))
(defn word-monkey
([file] (word-monkey file *prefix-len* *maxgen*))
([file prefix-len] (word-monkey file prefix-len *maxgen*))
([file prefix-len maxgen]
(let [markov-map (build-map prefix-len (fn [] (read-words file)))]
(dorun (dec maxgen)
(map println (generate markov-map (repeat prefix-len nil)))))))
(defn character-monkey
([file] (character-monkey file *prefix-len* *maxgen*))
([file prefix-len] (character-monkey file prefix-len *maxgen*))
([file prefix-len maxgen]
(let [markov-map (build-map prefix-len (fn [] (slurp file)))]
(dorun (dec maxgen)
(map print (generate markov-map (repeat prefix-len nil)))))))
(defn -main [& arguments]
(with-command-line arguments
"Run a character or word monkey."
[[char-monkey? c? "Run a character monkey instead of a word monkey."]
args]
(if (< 0 (count args) 4)
(apply (if char-monkey? character-monkey word-monkey)
(cons (first args) (map #(Integer/parseInt %) (rest args))))
(binding [*out* *err*]
(println "Usage: monkey [-c|--char-monkey] file [prefix-len [maxout]]"))))
(flush))
|