3
((1&{~+/)*./\(=1&{))1 1 1 3 2 4 1

私はいつもインデックスエラーになります。

ポイントは、2 つの数値を出力することです。1 つはリストの最初の数値と同じで、2 番目の数値はその数値が繰り返される回数と同じです。

したがって、これはうまくいきます:

*./\(=1&{)1 1 1 3 2 4 1
1 1 1 0 0 0 0

最初の数字をリストの残りの数字と比較します。次に、and 圧縮の挿入を行います。これにより、1 の連続した文字列がある限り、1 が得られます。これは、and が壊れて失敗し、ゼロが出てくるとです。

次に、別の括弧のセットを追加し、リストからリード要素を再度取得し、何らかの方法でそれらの数値を記録できると考えました。最終的なアイデアは、元のリストにベクトルの逆数を適用する別の段階を持つことです。次に $: を使用して、同じ動詞の再帰的な適用に戻ります。クイックソートの例のようなもので、ある程度理解していると思っていましたが、そうではないと思います。

でも近づかない。人々が回答に対して適切な信用を得られるように、これを別の質問として尋ねます。

4

4 に答える 4

2

このようなものを探していましたか?

f=.{.,+/@:({. E. ])

NB.f 1 1 1 3 2 4 1
NB.1 4
于 2012-07-02T22:51:32.940 に答える
0
   (0&{ , +/@(*./\)@(= 0&{)) 1 1 1 3 2 4 1
1 3

あなたの質問から、それがあなたが試みていた最初の結果であるかどうかはよくわかりませんか?

これは、最初の要素が繰り返される回数を取得するためのより簡単な方法かもしれません。

   =/\ 1 1 1 3 2 4 1
1 1 1 0 0 0 0

次のようなものになりたいという印象を受けますか?(リスト内の連続した繰り返しの数を示します)

  ([: #/.~ 0 , [: +/\ 2 ~:/\ ]) 1 1 1 3 2 2 4 1
3 1 2 1 1
于 2011-10-01T05:53:22.813 に答える
0

J のインデックスは 0 なので、代わりにこれを試してください。

((0&{~+/)*./\(=0&{))1 1 1 3 2 4 1
于 2011-09-15T21:25:32.693 に答える
0

パート1

配列から最初の項目を取得する動詞が組み込まれて{.いるので、最初の部分は完了です。

パート2

2 番目の部分では、これを組み合わせることができe.ます。ベクトルを指定すると、要素が発生する場所を示すテーブルが返されます。

   e. 1 3 1 1
1 0 1 1
0 1 0 0
1 0 1 1
1 0 1 1

最初の行 (または列!) を使用します。

   {.e. 1 3 1 1
1 0 1 1

この結果を合計します。

   +/{.e. 1 3 1 1
3

混ぜる

パート 1 と 2 を組み合わせて 2 要素のリストにすることは、2 項,(追加)で実現されます。

(result of {.) , (result of sum of first row (or column!) of e.)

私はいつもごまかして、明示的から暗黙的なコンバーター ( 13 :) を次のようなものに使用します。

   13 : '({.y) , +/{. e.y'
{. , [: +/ [: {. e.

[:しかし、この時点で、これは(キャップ)で少し扱いが難しく、 NMR の答えはより明確であることに気付くかもしれません。

ここまで読んで特典

;(の代わりに を使用して) ボックス化された配列を返す場合,、この関数を数値以外のリストに拡張できます。

   f =: 13 : '({.y) ; +/{. e.y'
   f  'abracadabra'
┌─┬─┐
│a│5│
└─┴─┘
于 2015-06-24T01:37:52.653 に答える