例の問題
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")
名前空間の扱いが今イチ慣れてない。
順列ライブラリとか、遅延評価リストライブラリとか探せばあるんだろうか。