#:g1: cl-permutationの紹介

Posted 2014-10-09 01:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の282日目です。

cl-permutationとはなにか

 cl-permutationは、Robert Smith氏作の専用のデータ構造を使ったpermutationを扱うライブラリです。

パッケージ情報

パッケージ名cl-permutation
Quicklisp
CLiKiCLiki: cl-permutation
Quickdocscl-permutation | Quickdocs
CL Test Grid: ビルド状況cl-permutation | CL Test Grid

インストール方法

(ql:quickload :cl-permutation)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 使い方はシンプルに、

(perm:make-perm 1 2 3)
;=>  #<PERM:PERM 1 2 3>

でpermutationの1つが作れます。制限として1から要素は要素の個数までの連続した数値である必要があります。

 他リストに変換したり、配置をシークエンスにマップしたり、n個の集合の置換をなめる構文、様々なユーティリティがあります。

(perm:perm-to-list (perm:make-perm 1 2 3))
;=>  (1 2 3)

(perm:doperms (p 3) (print (perm:permute p '(a b c)))) ;>> ;>> (A B C) ;>> (A C B) ;>> (C A B) ;>> (C B A) ;>> (B C A) ;>> (B A C) ;=> NIL

(perm:permute (perm:random-perm 10) (*:iota 10 100)) ;=> (103 108 102 101 100 105 104 107 109 106)

(loop :with s := '(:a :b :c) :with g := (perm:make-perm-generator (length s)) :for e := (funcall g) :while e :collect (perm:permute e s)) ;=> ((:A :B :C) (:A :C :B) (:C :A :B) (:C :B :A) (:B :C :A) (:B :A :C))

 その他、似たようなものとして、循環する配列も用意されています。

(perm:cycle-ref (perm:make-cycle 1 2 3) 8)
;=>  3

まとめ

 今回は、cl-permutationを紹介してみました。
毎度自作したりしがちなところですが、まとまったライブラリになっていると便利ですね。

comments powered by Disqus