きしださんの問題

http://d.hatena.ne.jp/nowokay/20080717#1216294670
めちゃめちゃかっこわるいコードだけど、一応答えは出た。

(use srfi-1)
(use util.combinations)

(define (three-letters lst)
  (define (ok? lst)
    (if (null? (cdr lst)) #t
	(if (equal? (list (cadr (car lst)) (caddr (car lst)))
		    (list (car (cadr lst)) (cadr (cadr lst))))
	    (ok? (cdr lst))
	    #f)))
  (define (shape-up lst)
    (append (map car lst) (cdr (car (reverse lst)))))
  (map shape-up (filter ok? (permutations lst))))

(define test-data '((A B A) (B A B) (A B C) (B C A) (C A B) (C A A) (A A B)))
(define ng-data '((A B A) (B A B) (A B C) (C A B) (C A A) (A A B)))

;;(print (three-letters test-data))
((C A B A B C A A B) (C A B C A A B A B) (C A A B A B C A B) (C A A B C A B A B))

;;(print (three-letters ng-data))
()

とりあえず無駄大杉
まともにやるなら、少しずつ木を作っていって、最後までたどりついたやつをピックアップする感じかな?