J言語の本を読んでいたら、次のような課題がありました。
f(n) = 5 n - 1 をJ言語で表現せよ。
1〜10 の数列について、実行し、一覧表にせよ。
回答は次のようなものでした。
N =: ] F =: (5: * N) - 1: i =: >: i.10 i ,: F i 1 2 3 4 5 6 7 8 9 10 4 9 14 19 24 29 34 39 44 49
自分だったら、どう書くかなぁ、と考えてみました。
(5&*) 3 15 (_1&+) 15 14 fx=:(_1&+)@(5&*) fx 3 14 fx i 4 9 14 19 24 29 34 39 44 49 i,:fx i 1 2 3 4 5 6 7 8 9 10 4 9 14 19 24 29 34 39 44 49
APLで書かれたライフゲームをJ言語に翻訳(昨日の記事)していて、APLではω(オメガ)という関数を使って式の中で使います。それに近いのがN =: ]なのですが、うまく使えていません。一方、J言語では動詞が並んで一つの動詞になった場合の挙動について、総括してトレインと呼び、基本的に二つ並んだ場合(フック)または三つ並んだ場合(フォーク)の繰り返しとして説明します。その流れを切る作用をするのが@(アトマーク)や@:(アトマークコロン)なのでその辺を試行錯誤すればたいていのことは済んでしまう。
とりあえず、わたしのやったやり方の方がわたし的には理解しやすいです。
以上
追記:
3次くらいの方程式ではどうか考えてみました。
f(x) = x^3 + x^2 - 2*x - 3 f(1) = - 3 f(2) = 5
(^&3) 2 8 (^&2) 2 4 (*&2) 2 4 ( (^&3) + (^&2)) 2 12 (_3&+)@( ( (^&3) + (^&2)) - (*&2)) 2 8 (_3&+)@( ( (^&3) + (^&2)) - (*&2)) 2 5 fx=:(_3&+)@( ( (^&3) + (^&2)) - (*&2)) i,:fx i 1 2 3 4 5 6 7 8 9 10 _3 5 27 69 137 237 375 557 789 1077 F=:( ( (N ^ 3:) + (N ^ 2:)) - (2:* N)) - 3: i,:F i 1 2 3 4 5 6 7 8 9 10 _3 5 27 69 137 237 375 557 789 1077
どちらもあまり気持ちよくないですね。
また考えます。