APL/J言語:読み書き

知っている言語に翻訳したり、知っている言語から新しい言語に翻訳したりするのは初歩にはとてもよい練習になります。以下に例を示します。

書かれていることを見ずにJ言語の作用を自分の言語で簡潔に定義してみましょう。その際、積極的にコンピュータのディクショナリーを使ったり、試行錯誤をしましょう。


f1=: <:(小なりコロン) 単項動詞としてデクリメント;二項動詞として小なりイコール f2=: f1&9 NB. 9より小さいか同じ f3=: f2 *. >:&2 NB. 2から9の間にあるかどうか(2と9を含む)
f4=: f3 *. <. = ] NB. 2と9の間にありかつ整数
f5=: f3 +. <. = ] NB. 2と9の間にあるかまたは整数

g1=: %&1.8 NB. 1.8で割った商
g2=: g1^:_1 NB. 1.8を掛けた積
g3=: -&32 NB. 32を引いた差
g4=: g3^:_1 NB. 32を足した和
g5=: g1@g3 NB. 華氏から摂氏への変換
g6=: g5^:_1 NB. 摂氏から華氏への変換

h1=: >./ NB. 単項動詞としてリストの最大値
h2=: h1-<./ NB. スプレッド。最大値マイナス最小値
NB. h2をparabola: b=:(-&2 * -&3) -:i.12に適用せよ。

   b=:(-&2 * -&3) -:i.12
   b
6 3.75 2 0.75 0 _0.25 0 0.75 2 3.75 6 8.75
   h1=: >./
   h2=:h1-<./
   h2 b
9

h3=: h1@]-i.@[*h2@]%

   10 h3 b
8.75 7.75 6.75 5.75 4.75 3.75 2.75 1.75 0.75 _0.25

h4=: h3

   10 h4 b
0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 1 1
1 0 0 0 0 0 0 0 0 0 1 1
1 1 0 0 0 0 0 0 0 1 1 1
1 1 0 0 0 0 0 0 0 1 1 1
1 1 1 0 0 0 0 0 1 1 1 1
1 1 1 1 0 0 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1

h5=: {&' *' @ h4 NB. バーチャート。10 h5 bを実行せよ。

   10 h5 b
            *
            *
            *
 *         **
 *         **
 **       ***
 **       ***
 ***     ****
 ****   *****
 ************

上記の定義を入力後、引数をつけないで動詞名のみを入力し、定義を表示させ、定義を解釈せよ。表示のさまざまな形式は9!:3 (2 4 5)によって見ることができる。
定義からJプログラムを作成する練習をせよ。

演習:
12.1 以下の演習はトピックごとにグループ化されていて通常のセクションのように読んでから解くようになっているが、トピックについてすでに熟知している読者は初めからプログラムを書いてもよい。

A. 数の性質
pn=: >:@i. NB. 正の数(e.g. pn 9)

   pn 9
1 2 3 4 5 6 7 8 9

rt=: pn |/ pn NB. 剰余テーブル

   rt 9
0 0 0 0 0 0 0 0 0
1 0 1 0 1 0 1 0 1
1 2 0 1 2 0 1 2 0
1 2 3 0 1 2 3 0 1
1 2 3 4 0 1 2 3 4
1 2 3 4 5 0 1 2 3
1 2 3 4 5 6 0 1 2
1 2 3 4 5 6 7 0 1
1 2 3 4 5 6 7 8 0

dt=: 0&=@rt NB. 倍数テーブル

   dt 9
1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0
0 0 1 0 0 1 0 0 1
0 0 0 1 0 0 0 1 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1

nd=: +/@dt NB. 約数の数

   nd 9
1 2 2 3 2 4 2 4 3

prt=: 2&=@nd NB. 素数テスト

   prt 9
0 1 1 0 1 0 1 0 0

prsel=: prt # pn 素数の抽出

   prsel 9
2 3 5 7

N=: >:@pn NB. 1を加える

   N 9
2 3 4 5 6 7 8 9 10

rtt=: ,@(N */ N) NB. 掛け算表のリスト化

   rtt 9
4 6 8 10 12 14 16 18 20 6 9 12 15 ...

aprt=: -.@(N e. rtt) NB. 素数テストの別解

   aprt 9
1 1 0 1 0 1 0 0 0

apsel=: aprt # N NB. 素数の抽出

   apsel 9
2 3 5 7

pfac=: q: NB. 素因数分解(Prime factors)

   pfac 400
2 2 2 2 5 5

first=: p:@i. NB. 素数のリスト

   first 9
2 3 5 7 11 13 17 19 23

B. 座標幾何(Coordinate Geometry)

ベクトル(またはポイント) p=:3 4と三角(テーブル) tri=: 3 2$ 3 4 6 5 7 2について実験を行え。

L=: %:@:(+/)@:*:"1 NB. ベクトルの長さ(直角三角形の斜辺の長さ)
NB. ランクについては20章を参照

   L p
5
   *: 3 4
9 16
   +/ *: 3 4
25
   %: +/ *: 3 4
5

LR=:L"1 NB. テーブルの行方向の長さ

   LR p
5
   L"1 tri
5 7.81025 7.28011
   (%:@:(+/)@:*:) tri
9.69536 6.7082
   (%:@:(+/)@:*:)"1 tri
5 7.81025 7.28011

disp=: ] - 1&|. NB. 行のディスプレイスメント
NB.ずらしてマイナスすることにより、となりの点からの相対座標となる。

   disp tri
_3 _1
_1  3
 4 _2
   tri
3 4
6 5
7 2
   p
3 4
   1 |. p
4 3
   |. p
4 3
   1 |. tri
6 5
7 2
3 4
   tri
3 4
6 5
7 2

LS=: LR@disp NB. 三角形の辺の長さ

   LS tri
3.16228 3.16228 4.47214

sp=: -:@(+/)@LS NB. 半周(Semiperimeter)

   sp tri
5.39835
   -: +/ LS tri
5.39835

H=: %:@(*/)@(sp,sp-LS) NB. 面積のヘロン(Heron)の公式

   H tri
5
   %: (*/) (sp,sp-LS) tri
5

det=: -/ . * NB.行列式(Determinant)

   ] a=: i.3 3
0 1 2
3 4 5
6 7 8
   det a
0
   m=: >1 6 4;4 1 0;6 6 8
   det m
_112

SA=: det@(,.&0.5) NB.符号付きエリア。 SA@|を実行せよ。

   SA@| m
0.5 5.5  3.5
3.5 0.5 _0.5
5.5 5.5  7.5
   m
1 6 4
4 1 0
6 6 8
   SA m
0

sa=:det@(],.%@!@

tet=:?4 3$9 
   tet
8 6 3
1 6 6
6 1 8
8 6 6
   sa tet
_17.5
   sa tri
_5