アナグラムは順列という概念のよい例です。
w=: 'STOP' 3 2 0 1 { w POST 2 3 1 0 { w OPTS 3 0 2 1 { w PSOT
上記{(左波かっこ、左ブレイス)の左側引数はそれ自身がリストi.4の順列ベクトルです。
pを順列ベクトルとすると、p&C.(ラージシードット)とp&{(左波かっこ、左ブレイス)は同じ結果を返します。しかし、サイクル関数C.(ラージシードット)はこれ以外の場合は{(左波かっこ、左ブレイス)とはまったく違います。特に、C. pは順列pのサイクル表現になります。
]c=: C. p=: 2 4 0 1 3 +---+-----+ |2 0|4 3 1| +---+-----+ c C. 'ABCDE' CEABD C. c 2 4 0 1 3 p C. 'ABCDE' CEABD c +---+-----+ |2 0|4 3 1| +---+-----+ C. c 2 4 0 1 3 C. p +---+-----+ |2 0|4 3 1| +---+-----+
ボックスの中の要素はその中で入れ替わる位置のリストです。この例ではポジション3の要素がポジション4に行き、要素1が3に行き、要素4が1に行きます。
順列は全部のテーブルnの階乗(!n)個の順列を昇順に並べるたときの位置(インデックス)によって指定できます。これは、アナグラムインデックスA.(ラージエイドット)です。対応する順列は関数A.(ラージエイドット)を用いて見ることができます。
1 A. 'ABCDE' ABCED A. 0 1 2 4 3 1 (i.!3) A. i.3 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 (i.!3) A. 'ABC' ABC ACB BAC BCA CAB CBA
演習:
24.1
a=:'abcdef'
b=: i. 6
c=: i. 6 6
について、下記の演習を行え。
a=:'abcdef' b=: i. 6 c=: i. 6 6 f=: 1&A. NB.最後の2要素を入れ替える g=: 3&A. NB.最後の3要素を回転する h=: 5&A. NB.最後の3要素を逆にする i=:
24.2 下記の表現について実験し、C.(ラージシードット)の引数の短縮形について述べよ。その後、辞書の定義と比較せよ。
2 1 4 C. b=:i.6 NB.左側引数に対応する値を抜き出し末尾に付加する 0 3 5 2 1 4 (<2 1 4) C. b NB.2の位置に1を入れ、1に4を入れ、4に2を入れる 0 4 1 3 2 5 (3 1;5 0) C. b NB.3に1を入れ、1に3を入れる。また5に0を入れ、0に5を入れる 5 3 2 1 4 0
24.3 acというプログラムを作り、すべての順列のサイクル表示による一覧表を作成せよ。
ac=: C.@(i.@! A. i.) ac 3 +-----+---+-+ |0 |1 |2| +-----+---+-+ |0 |2 1| | +-----+---+-+ |1 0 |2 | | +-----+---+-+ |2 0 1| | | +-----+---+-+ |2 1 0| | | +-----+---+-+ |1 |2 0| | +-----+---+-+
解説:ac 3は下記と同値。
C.(0 1 2 3 4 5) A. (0 1 2)