在字符串列表的第n个元素中插入字符串

Nic*_*yka 4 lisp clojure

我是Clojure的新手。

我正在开发井字游戏

我正在尝试制作一个“格式化”面板的功能,该功能是一张以位置编号作为键,关键字: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)))))
Run Code Online (Sandbox Code Playgroud)

Tac*_*der 5

这是Clojure,所以肯定有很多方法可以一齐完成。这是一种尝试:

(flatten (interpose "\n" (partition n list))))
Run Code Online (Sandbox Code Playgroud)

正如使用者amalloy所评论的那样,永远不会有使用的借口flatten,因此这是一种更好的方法:

(apply concat (interpose ["\n"] (partition n list))))
Run Code Online (Sandbox Code Playgroud)

从给定的字符串序列(都包含一个字符)开始给出:

... > (newline-every 3 ["x" "x" "x" "e" "e" "e" "e" "e" "e"])
("x" "x" "x" "\n" "e" "e" "e" "\n" "e" "e" "e")
Run Code Online (Sandbox Code Playgroud)

然后可以将其转换为字符串:

... > (apply str (newline-every 3 ["x" "x" "x" "e" "e" "e" "e" "e" "e"]))
"xxx\neee\neee"
Run Code Online (Sandbox Code Playgroud)