今日の一行
今日の一行(お題)flips への解答
組み合わせの数え上げは util.combinations にあると教えて頂きました。
自然数のリストを並べ替えて、それをもとに引数を並び替える、というのがダサい。生成された関数では、すでに並び替えが終わっている、と言う風に出来ないだろうか?
生成された関数が引数の数をチェックしないのもダサい。
(use util.combinations) (use srfi-1) (define (keysort key value) (map cdr (sort (fold acons () key value) (lambda (x y) (< (car x) (car y)))))) (define (flips-n n) (lambda (f) (map (lambda (x) (lambda args (apply f (keysort x args)))) (permutations (iota n 1))))) (define (main args) (map (lambda (f) (f 'a 'b 'c)) ((flips-n 3) print)))
修正: 自然数の生成に iota を使うように。
さらに修正: alist を acons で作るように