2014-07-17 173 views
3

我是Clojure的新手。在字符串列表中插入每個第n個元素的字符串

我正在開發一個井字遊戲

我試圖做一個函數,「格式」的板,這與位置鍵的數量和關鍵詞的地圖:x:o和對於值(:e代表空白)爲:e


我想在關鍵字的名稱列表中每3個插入一個換行符。

例如"x" "x" "x" "e" "e" "e" "e" "e" "e"應該轉換爲"x" "x" "x" "\n" "e" "e" "e" "\n" "e" "e" "e"然後我會連接這些字符串,以便我可以打印它。

(defn- newline-every 
    [n list] 
    (if (empty? list) 
    [] 
    (let [[fst snd] (split-at n list)] 
     (concat 
     (conj fst "\n") 
     (newline-every n snd))))) 
+0

你會得到什麼錯誤? – redditor

+0

嗯,這是尷尬,好像REPL被竊聽了什麼,但現在沒有錯誤。但是它輸出錯誤。 –

回答

4

這是Clojure,所以肯定有很多方法可以在一行中做到這一點。這裏有一個嘗試:

(flatten (interpose "\n" (partition n list)))) 

隨着用戶amalloy評論說,從未有使用flatten的藉口,所以這裏有一個更好的辦法:

(apply concat (interpose ["\n"] (partition n list)))) 

其中給出,從串序列開始(其都包含一個字符),你給:

... > (newline-every 3 ["x" "x" "x" "e" "e" "e" "e" "e" "e"]) 
("x" "x" "x" "\n" "e" "e" "e" "\n" "e" "e" "e") 

然後,您可以變換成一個字符串:

... > (apply str (newline-every 3 ["x" "x" "x" "e" "e" "e" "e" "e" "e"])) 
"xxx\neee\neee" 
+0

這並不壞,但真的沒有理由使用'flatten'。相反,你可以寫''apply str(apply concat(interpose [「\ n」](partition n list))))' – amalloy

+0

@amalloy:謝謝,修正! – TacticalCoder

相關問題