例の問題

CLの練習で適当に書いた。いったい何を訴えたいのかよくわからないコードになった。
解き方はいたって普通。

(require :alexandria)
(require :cl-ppcre)

(defun perms (n xs list fn)
  (if (zerop n)
      (funcall fn list)
      (loop for x in xs do
           (perms (1- n) xs (append list (list x)) fn))))

(defun perms-list (n xs)
  (let ((result nil))
    (perms n xs nil #'(lambda (x) (push x result)))
    result))

(defun solve (n)
  (let* ((xs (perms-list n (coerce "AGCT" 'list)))
         (xs (mapcar (alexandria:curry #'concatenate 'string) xs)))
    (remove-if-not (alexandria:curry #'cl-ppcre:scan ".*AAG.*") xs)))

(solve 5)

;;=> ("TTAAG" "TCAAG" "TGAAG" "TAAGT" "TAAGC" "TAAGG" "TAAGA" "TAAAG" "CTAAG"
;;    "CCAAG" "CGAAG" "CAAGT" "CAAGC" "CAAGG" "CAAGA" "CAAAG" "GTAAG" "GCAAG"
;;    "GGAAG" "GAAGT" "GAAGC" "GAAGG" "GAAGA" "GAAAG" "ATAAG" "ACAAG" "AGAAG"
;;    "AAGTT" "AAGTC" "AAGTG" "AAGTA" "AAGCT" "AAGCC" "AAGCG" "AAGCA" "AAGGT"
;;    "AAGGC" "AAGGG" "AAGGA" "AAGAT" "AAGAC" "AAGAG" "AAGAA" "AAAGT" "AAAGC"
;;    "AAAGG" "AAAGA" "AAAAG")

名前空間の扱いが今イチ慣れてない。
順列ライブラリとか、遅延評価リストライブラリとか探せばあるんだろうか。