Clojure Death Note S01E01

看了本Clojure书(哪本?你猜!)决定刷刷题要不就要忘光了就又像之前的一百二十七种语言一样白看了。

于是上4Clojure洗刷刷洗刷刷。刷到第43题的时候,虽然做的结果对了,但是总觉得哪里不对,于是问clj总书记说,你看下面这哪里不对?

(fn [s n]
  (let [sc (count s) df (/ sc n) dd (quot sc n)]
    (partition-all 
      (if (= df dd) df (inc dd))
      (apply mapcat list (map vec (partition-all n s))))))

总书记说了两个字:好长。

我马上意识到判断是否整除起码是多余的,因为反正题里面是不管的。于是改成了:

(fn [s n]
  (partition-all
    (quot (count s) n)
    (apply mapcat list (map vec (partition-all n s)))))

总书记说:我是这样写的:

(fn [s n]
  (map #(take-nth n (nthnext s %)) (range 0 n)))

我立马膝盖一软就跪下了。

书记说:为啥要map vec,然后又mapcat list。用interleave不就行了?

我心想:卧槽,真的看的书全忘完了!改了之后有了我的最后的版本:

(fn [s n]
  (partition-all (quot (count s) n) (apply interleave (partition-all n s))))

书记说:挺新奇的想法。

想了想,新奇的想法来自于作为一只Prolog狗,默认是排除然后random access的数据类型和访问方式的。于是即使拿到了一个vector,呃,也要当做一个list用。

这是病,药不能停。