APL/J言語:nub(重複を取り除く)

APL/J言語:nub(重複を取り除く)
ほかの言語だとuniqと同じようなJ言語の動詞に~.(チルダドット、ナブ)というのがあります。nubは英和辞典で引くと要旨とか要点とかいう意味のようです。考えてみればuniqを重複を取り除く、という意味に使うのも無理な話でどっちもどっちですね。

   ~. 0 1 2 3 4 3 2 1 0 0 0
0 1 2 3 4
   y=: 3 3 $ 'abcabcdef'
   y;(~.y);(~.3);($~.3)
 +---+---+-+-+
 |abc|abc|3|1|
 |abc|def| | |
 |def|   | | |
 +---+---+-+-+

=(イコール)を単項動詞として使うと、自己分類表(self-classification table)を返します。これはたてが種類数、よこが要素数の1と0から成る表でこんな感じ。

   = 2 3 2 3 2 2 3
1 0 1 0 1 1 0
0 1 0 1 0 0 1

同じ要素に1が立ちます。
さて、ある関数がとても時間のかかる関数だとして、f yを実行するのにf~.yをやってからyの自己分類表であるべき計算結果に展開するというのがJボキャブラリーに載っていました。

   f=: *:  NB.自乗する関数とする
   f y=: 2 7 1 8 2 8 1 8
4 49 1 64 4 64 1 64
   ,.&.>(~. ; f@~. ; = ; (f@~.(+/ .*)=) ; f)y
 +-+--+---------------+--+--+
 |2| 4|1 0 0 0 1 0 0 0| 4| 4|
 |7|49|0 1 0 0 0 0 0 0|49|49|
 |1| 1|0 0 1 0 0 0 1 0| 1| 1|
 |8|64|0 0 0 1 0 1 0 1|64|64|
 | |  |               | 4| 4|
 | |  |               |64|64|
 | |  |               | 1| 1|
 | |  |               |64|64|
 +-+--+---------------+--+--+
   NUB=: 1 : 'x@~. +/ . * ='           NB. 副詞の定義
   *: NUB y
4 49 1 64 4 64 1 64
   nubindex=: ~. i. ]
   (nubindex ; (nubindex { ~.)) y
 +---------------+---------------+
 |0 1 2 3 0 3 2 3|2 7 1 8 2 8 1 8|
 +---------------+---------------+

解説が必要ですね。考え中。