"在两个项目之间插入"在4clojure.com上

时间:2017-06-12 14:12:53

标签: clojure

这是4clojure question #132。问题陈述是:"编写一个带有两个参数谓词,一个值和一个集合的函数;并返回一个新集合,其中值在每两个满足谓词的项之间插入。"。

我提出了以下解决方案:

(fn [pred value coll]
    (let [pairs (seq (zipmap coll (concat (rest coll) [0])))]
        (mapcat #(if (apply pred %) [(first %) value] [(first %)]) pairs)))

网站上的第一个单元测试失败,而它在我的机器上本地传递。我将在这里重现测试:

(= '(1 :less 6 :less 7 4 3) (____ < :less [1 6 7 4 3]))

我的问题是,我做错了什么?网站是否存在一些限制因素而我不遵守的解决方案?还是其他一些问题?

1 个答案:

答案 0 :(得分:2)

4clojure使用clojure 1.4版,你很可能使用1.8或1.9 alpha。 function exclude_pages($query) { if ( !is_admin() && $query->is_main_query() ) { $query->set('post_type', 'post'); } } add_action('pre_get_posts','exclude_pages'); 的结果排序有所不同,这就是它们不同的原因。

zipmap

您的解决方案恰好适用于更新版本的clojure,但是当您使用;; 1.9 alpha 15: (zipmap [1 2 3 4 5] [6 7 8 9 10]) => {1 6, 2 7, 3 8, 4 9, 5 10} ;; 1.4: (zipmap [1 2 3 4 5] [6 7 8 9 10]) => {5 10, 4 9, 3 8, 2 7, 1 6} 时,您依赖于地图的排序,这是不正确的。映射中k-v对的顺序是未定义的,因此您的解决方案只是在您当前实现它时才有机会。

如果给你一个无限的处理序列,你的解决方案无论如何都会失败。考虑一种不同的方法,您可以在行走时构建序列。

祝你好运!