質問
私は現在、魅力的なJプログラミング言語を学んでいますが、私が理解できなかったことの1つは、リストのフィルタリング方法です。
任意のリストがあるとします 3 2 2 7 7 2 9
そして、私は2を削除したいのですが、他のすべてを変えないままにしておきます。つまり、私の結果は 3 7 7 9
. 。一体どうやってこれを行うのですか?
解決
短い答え
2 (~: # ]) 3 2 2 7 7 2 9
3 7 7 9
長い答え
私はあなたのために答えを持っていますが、あなたがいくつかの詳細に精通する前に。どうぞ。
モナド、ダイアド
2つのタイプがあります 動詞 Jで: モナド と ダイアド. 。前者は1つのパラメーターのみを受け入れ、後者は2つのパラメーターを受け入れます。
たとえば、唯一の引数をaに渡します 単項 動詞 #
, 、呼ばれます 集計, 、リスト内の要素の数を数えます。
# 3 2 2 7 7 2 9
7
動詞 #
, 、2つの引数(左と右)を受け入れると呼ばれます コピー, 、そうです ダイアディック また、左のリストのそれぞれの要素で指定されていると同じくらい数回正しいリストから要素をコピーするために使用されます(リストにも唯一の要素があるかもしれません):
0 0 0 3 0 0 0 # 3 2 2 7 7 2 9
7 7 7
フォーク
の概念があります フォーク jでは、それが彼らの議論に適用される一連の3つの動詞であり、ダイアディカルにまたはモナデーに。
これが一種の図です フォーク 私は最初のスニペットで使用しました:
x (F G H) y
G
/ \
F H
/ \ / \
x y x y
動詞が彼らの議論に適用される順序を説明します。したがって、これらのアプリケーションが発生します。
2 ~: 3 2 2 7 7 2 9
1 0 0 1 1 0 1
~:
(等しくない)はです ダイアディック この例では、引数が等しくないときに真のブール値のリストになります 2
. 。これが F
図に従ってアプリケーション。
次のアプリケーションは次のとおりです H
:
2 ] 3 2 2 7 7 2 9
3 2 2 7 7 2 9
]
(身元) モナド またはa ダイアド, 、しかし、それは常に動詞に渡された正しい引数を返します(反対の動詞があります、 [
戻ってきます。はい、左の引数です! :)
ここまでは順調ですね。 F
と H
アプリケーションがそれに応じてこれらの値を返した後:
1 0 0 1 1 0 1
3 2 2 7 7 2 9
実行する唯一のステップはです G
動詞アプリケーション。
先に述べたように、動詞 #
, 、それです ダイアディック (2つの引数を受け入れます)、左引数のそれぞれの位置で数回指定されたとおりに、正しい引数の項目を複製することができます。したがって:
1 0 0 1 1 0 1 # 3 2 2 7 7 2 9
3 7 7 9
リストをフィルタリングしました 2
s。
参照
少し異なる種類 フォーク, 針 他の霊長類(上記のものを含む)は、これら2つのドキュメントで説明されています。
- 簡単なJリファレンス (175キブ)
- 簡単-J。世界で最も注目すべきプログラミング言語の紹介 (302キブ)
他の有用な情報源は次のとおりです jsoftwareサイト と 彼らのウィキ インターネットのいくつかのメールリストアーカイブ。
他のヒント
それが明確であることを確認するために、直接的な方法 - 元の質問に答える - これは次のとおりです。
3 2 2 7 7 2 9 -. 2
これは戻ります
3 7 7 9
より精巧な方法 - ブールを生成し、それを使用してベクトルを圧縮する - はより無作法です。
非常に長い投稿で他の質問に答えること、最初の要素とそれが発生する回数を返すことは、単にこれです。
({. , {. +/ .= ]) 1 4 1 4 2 1 3 5
1 3
これは、「{。」を使用したフォークです。最初の項目を取得するには、「{。 +/。=]」を取得するには、最初のアイテムが各要素に等しく、「」、これらの2つの部分を連結するための中央の動詞として「」と "、"、 "、"、 "{。 +/。=]を取得します。
また:
2 ( -. ~ ]) 3 2 2 7 7 2 9
3 7 7 9
これを行うには百万の方法があります - 漠然と、これらのことは厳密に左から右に評価されないことを悩ませています。私は古いAPLプログラマーであり、私は物事を右から左から左から左に考えています。 。
それが私がいくつかの数を引き出したいと思っていたプログラムに入れようとしていたものであり、数が一定だったなら、私は次のことをします:
(#~ 2&~:) 1 3 2 4 2 5
1 3 4 5
これはフックのようなものだと思います。式の右半分は2ではない真理ベクトルを生成し、左側のOctothorpeには、真理ベクトルがコピーする左の引数であり、ベクトルが正しい引数であるように、引数が交換されます。フックが引数コピーを備えたフォークよりも速いか遅いかどうかはわかりません。
+/3<+/"1(=2&{"1)/:~S:_1{;/5 6$1+i.6
156
この上記のプログラムは、「Yatzee Diceのすべての可能な組み合わせのために、1つのロールに4つまたは5つの一致する数字があるか」という質問に答えます。ボックス内のすべての順列が生成され、各ボックスを個別に並べ替え、副作用としてボックス化し、列2を抽出し、自分の列2と比較して、これまでに書いたことができた唯一の成功したフォークまたはフックでコラム2と比較します。理論は、5、3またはそれ以上のリストに表示される数字がある場合、リストを並べ替えると、中央の数値が最大の周波数で表示される数値になるということです。私は他の多くのフックやフォークを試みましたが、私が手に入れていないものがあるので、すべてが失敗しました。とにかく、その真実のテーブルはベクトルに縮小され、5つのサイコロの各グループが中央値の数と一致した回数を正確に知っています。最後に、その数は3と比較され、成功した比較の数(3、つまり4または5)がカウントされます。
このプログラムは、「シンボル1〜5から作られたすべての可能な8桁の数字について、繰り返し、4で何人が分割されますか?」という質問に答えます。
最初の25内の数が4で割り切れ、乗算できる数だけを決定する必要があることを知っていますが、プログラムは多かれ少なかれ即座に実行されます。ある時点で、私はこのプログラムのはるかに複雑なバージョンを持っていて、ベース5で数値を生成して、個々の数字が0から4の間に、そのように生成された数値に1が追加され、ベース10に入れられます。 1+(8$5)#:i.5^8
+/0 = 4 |、(8 $ 10)#。 > {;/ 8 5 $ 1+i.5 78125動詞の列車と選択だけがある限り、問題はありません。動詞内で議論を繰り返さなければならないようにして、フォークやフックを使用することを余儀なくされたとき、私は迷子になり始めます。
たとえば、ここに私が仕事をすることができないものがあります。
((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
最初の番号をリストの残りの部分と比較します。それから私はanと圧縮の挿入を行います - そして、これは私が1の壊れていない文字列を持っている限り、私に1つを与えます。
その後、別のパレンズのセットを追加し、リストから再びリード要素を取得し、何らかの形でそれらの数字を記録できると思いました。最終的なアイデアは、ベクトルの逆を元のリストに適用する別の段階を持つことです。次に、$:を使用して、同じ動詞を再帰的に適用するために戻ります。 QuickSortの例のようなもので、私はある種の理解だと思っていましたが、そうではないと思います。
しかし、私は近づくことさえできません。私はこれを別の質問として尋ね、人々が答えるための適切な信用を得るようにします。