【问题标题】:Insert string every nth element in a list of strings在字符串列表中每隔 n 个元素插入字符串
【发布时间】:2014-07-17 01:23:46
【问题描述】:

我是 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)))))

【问题讨论】:

  • 你遇到了什么错误?
  • 嗯,这很尴尬,好像 REPL 被窃听了什么的,但现在没有错误。但它给出了错误的输出。

标签: clojure lisp


【解决方案1】:

它是 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"

【讨论】:

  • 这还不错,但真的没有任何借口可以使用flatten。相反,你可以写类似(apply str (apply concat (interpose ["\n"] (partition n list))))
  • 这个方案的问题是,如果list的长度不是n的倍数,那么就不能按预期工作了。
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2020-08-13
相关资源
最近更新 更多