这是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]))
我的问题是,我做错了什么?网站是否存在一些限制因素而我不遵守的解决方案?还是其他一些问题?
答案 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对的顺序是未定义的,因此您的解决方案只是在您当前实现它时才有机会。
如果给你一个无限的处理序列,你的解决方案无论如何都会失败。考虑一种不同的方法,您可以在行走时构建序列。
祝你好运!