2014-07-17 277 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

相关问题