J言語が人に近づく

J言語の特徴は、ループや再帰を明示的に使用せずに反復アルゴリズムを記述できることです。たとえば、すべての配列要素の合計は「+/として解かれ、すべての配列要素の平均は「+/%#」です。



JのさまざまなレビューがすでにHabréに複数回公開されています。で例えば、この記事とで、この1



Jは30年の歴史を持つ言語であり、現在も開発と改善を続けています。ただし、Jには「死角」が1つしかありませんでした。条件付き停止を使用した反復アルゴリズムです。このために、while構造を使用することが提案されました。休憩とペアになっています。続行します。



whileを使用します。 Jでは冗長で扱いにくいように見えます。また、暗黙の形式と比較して、速度が大幅に低下します。



また、この言語の9番目のバージョンでは、新しいユニオンFが追加されました(「fold」という単語の最初の文字にちなんで名付けられました)。







比較のために、whileを使用して問題を解決しましょう。新しいユニオンを使用する

条件は単純です:要素の2倍の値を含む元の配列から新しい配列を取得します。新しい配列の長さは外部で指定され、元の配列よりも短くなる場合があります。

最初に使用します。



t =: dyad define
c =. 0
i =. i.x
z =. $0
while. -. c = y
do. 
z =. z , (+: (c { i))
c =. >: c
end.
z
)
10 t 5
    0 2 4 6 8


そして今、新しいユニオンFを使用したソリューションです。ループを終了するための条件が動詞Zを使用してチェックされることを追加しましょう




COUNT =: 6
v=: dyad define
_2 Z: -.* COUNT =: <: COUNT
x
)
'' +: F:. v (i.10)
    0 2 4 6 8


ドキュメントは、F。がより便利になるだけでなく、より高速になることを約束しています。やがて、Jは人に近づく!



PS知識のある人は、この問題は周期的な構造と新しい構造の両方を使用しなくても簡単に解決できることに気付くかもしれません。必要な長さのサブアレイを抽出し、それを暗黙の形式で処理するだけで十分です。ただし、実際の問題では、サブアレイの長さが事前にわからず、アルゴリズムの操作中に停止条件が計算されることがよくあります。



All Articles