Принимая во внимание комментарий ОП по вопросу - который полностью меняет игру! - это можно написать очень просто:
(let [doubletons (partition 2 1 [1 2 3 5 6])
increment? (fn increment? [[x y]]
(== (inc x) y))]
(cons (ffirst doubletons)
(map second (take-while increment? doubletons))))
;; returns (1 2 3)
Обратите внимание, что это на самом деле ленивый. Я ожидаю, что это не будет держаться за голову doubletons
благодаря очистке местных жителей. Другая версия:
(cons (first [1 2 3 5 6])
(map second (take-while increment? (partition 2 1 [1 2 3 5 6]))))
Оригинальная версия вопроса более веселая! :-) Сверхпростое решение для этого может быть построено с использованием вышеупомянутого, но, конечно, это будет значительно менее производительным, чем использование reduce
. Я посмотрю, есть ли у меня что-нибудь существенно отличающееся от решений Змилы и Днолена - и все же достаточно эффективное - чтобы добавить к этой части этой темы позже. (Не очень вероятно, я думаю.)