APL/J言語:順列(permutations)

アナグラムは順列という概念のよい例です。

   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)