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| +---------------+---------------+
解説が必要ですね。考え中。