リスト内の各原子に交互に別の動詞を適用する動詞をjの動詞を定義するにはどうすればよいですか?
-
24-10-2019 - |
質問
Jで次の名前を定義したと想像してみてください。
m =: >: i. 2 4 5
これは次のように見えます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
このリストのリストの各リストに適用されるランク1のモナディック動詞を作成したいと思います。 2倍になります(+:
)または1を追加します(>:
)リスト内の各代替アイテムに。この動詞を最初の行に適用する場合、私たちは取得します 2 3 6 5 10
.
各アイテムと交互になるブール人のリストを取得するのはかなり簡単です。 0 1 $~{:$ m
私たちに与えます 0 1 0 1 0
. 。私は思った、 ああ! のようなものを使います +:
`>: @.
いくつかの表現が続きますが、私はそれをうまく機能させることはできませんでした。
助言がありますか?
アップデート
以下は機能しているように見えますが、おそらくJ Proによってよりエレガントなものにリファクタリングできます。
poop =: monad define (($ y) $ 0 1 $~{:$ y) ((]+:)`(]>:) @. [)"0 y )
解決
ランク1で斜め動詞を使用します(/."1
) - 各リストの連続的な要素に適用されます。
動詞を渡すことができます /.
そして、それらを順番に適用し、周期的に拡張します。
+:`>: /."1 m
2
3
6
5
10
12
8
16
10
20
22
13
26
15
30
32
18
36
20
40
42
23
46
25
50
52
28
56
30
60
62
33
66
35
70
72
38
76
40
80
他のヒント
私は長い時間を過ごしてそれを見ました、そして私は理由を知っていると信じています ,@
議論の形を回復するために働きます。
括弧付きのフレーズに対する引数の形状は、ランクが変更されている場合でも、右側の引数の形状です。 "
コンジュゲート(まあ、それはトレースがそれを呼んだものであり、私はそれが副詞だと思った)。もしも ,
モナディックだったので、それはラベルであり、結果はベクター、または少なくともravelへの副詞に基づいて入力よりも低いランクになります。これは、接続詞を取り出した場合に起こることです - ベクトルを取得します。
だから私が起こっていると信じているのは、結合が作っているということです ,
ダイアディックのように振る舞います ,
これは付録と呼ばれます。付録は、アプリがあるものに追加するものを変更します。それはまだ形状を持っているだけでなく、入力の形状に中間ベクトルを変えることになります。
今、私はおそらく間違っています。しかし $,"0@(+:
>:/。) "1>:i。24 5-> 2 4 5 1 1`は、私のケースが証明されたと思った。
(、@(+: `>:/。)" 1 a)動作しますが、(* 2 1 $〜$)@(+ 0 1 $〜$) "1 a)も機能しています(および私の簡単なテストでは、大きな配列での約20倍高速です)。