昼休みcoding

[http:/d.hatena.ne.jp/nowokay/20080717#1216294670]
via:[http:/d.hatena.ne.jp/yuki_neko_nyan/20080718/1216340919:itle]

(defun gen-perm (terms &optional (l nil))
  (unless l
    (setf l (length terms)))
  (labels
      ((iter (acc &rest arg)
         (if (= l (length acc)) (list acc)
             (let (sets)
               (dolist (term arg sets)
                 (setf sets
                       (append
                        (apply #'iter
                               (append acc (list term))
                               (remove term arg)) sets)))))))
    (apply #'iter nil terms)))

(defun test (l)
  (let ((len (1- (length (car l)))))
    (dotimes (i (1- (length l)) t)
      (when (string/= (subseq (elt l i) 1)
                      (subseq (elt l (1+ i)) 0 len))
        (return nil)))))

(defun problem (strings)
  (mapcar #'(lambda (l)
              (apply #'concatenate 'string
                     (car l)
                     (mapcar #'(lambda (s) (subseq s (1- (length s))))
                             (cdr l))))
          (remove-if-not #'test
                         (gen-perm (split-string strings #\,)))))

(problem "ABA,BAB,ABC,BCA,CAB,CAA,AAB")
; => ("CAABCABAB" "CAABABCAB" "CABCAABAB" "CABABCAAB")

はいはいBFBF
とりあえず7!程度ならxyzzyでも問題ないですね。

gen-permはProject Eulerで使ったやつ。
テスト関数受け取って随時フィルタして返すように書き換えてたんだけど、なんかバグって時間切れ。あとでなんとかしよう。というか全面的に書き換えたい。