問題タブ [j]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
j - J では、サフィックス "__" は何をしますか?
私は J で大規模なコード ベースを管理しており、いくつかのまれな関数と変数は__
(2 つのアンダースコア) で終わります。
通常、__
ロケール内の何かを参照するために使用されます。
しかし、私はこれを持っています:
次のように宣言されています。
それは静的関数の別の構文ですか? すべてのロケールでアクセスできますか?
編集:
私が収集できる限り、それはローカルではありません。このように宣言された変数:
=.
ローカルに見えますが、別の関数から参照できます。同様に、「into locale」宣言は常に「locale に対してグローバル」です (Foo__Bar =.
そしてFoo__Bar =:
同じです)。
j - Jの連鎖動詞
さまざまな型を含む箱入り行列があるとします。
そして列記述子:
タイプに応じて、列ごとにこのマトリックスに動詞を適用したいと考えています。動詞 DoString と DoNum を使用します。
編集: 列記述子は重要です。使用する動詞の決定は、型自体ではなく、それらに基づいて行われます。実際には、いくつかのタイプの文字列、数値、さらには日付 (J では数値) を使用できます。
chain
の各行に適用するにはどうすればよいmatrix
ですか? 動詞自体は、渡された値がボックス化されているかどうかを処理できます。それで問題ありません。|:
また、行列 ( ) は非常に大きくなる可能性があるため、転置は避けたいと思います。
j - J では、1!:2&4 は LF を CRLF に置き換えます。LFのままにしておく方法はありますか?
J が Apache からの要求に応答できるように、J 用に変更された boot.ijs スクリプトがあります。
基本的に、httpd.conf には次のようなものがあります。
これは、すべての *.ijs URL を J に送信するように Apache に指示します。
J は、次のように標準出力に書き込むことで応答できます。
私が作成したバイナリ データ (Excel ファイル) があり、詳細はこちらのように、質問者のブラウザに送り返したいと考えています。ただし、ファイル自体では、すべての LF が CRLF に変更されます。
この動作は、jconsole.exe で「観察」できます。上記の echo の宣言を入力し、次のコマンドを送信します。
echo LF
コンソールでは CR が 1 行で書かれているだけなので、各 の後にもう 1 行あることがわかります。本質的に、J は LF を CRLF に変換します。
質問: どのようにしてそれをオフにし、J が実際に出力するように求められているものを尊重するようにしますか?
j - Jで接続詞を定義するときの奇妙な長さのエラー
Jで副詞や接続詞をいじっていて、奇妙な問題に遭遇しました。persistence
数のデジタル積またはデジタル合計を計算するときに生成される数の進行を表示するために使用できると呼ばれる単純な副詞を定義しました。
+ S 234
私たちに与え234 9
ます。次に、これを使用して、数の持続性を計算する別の副詞を作成しました。
+ P 234
私たちに与え1
ます。ここで、2の加法持続性を持つ30未満のすべての数値を検索しS
、各数値に対して生成されたリストを表示するとします。
これにより、次のリストが生成されます。
ここまでは順調ですね。さて、これを接続詞に変えたいと思いました。その左側には永続化に使用する動詞が含まれ、右側にはリストを制限するために使用される数が含まれています。(2
上記の例では。)その接続詞の私の定義は次のとおりです。
Jコンソールに式を入力すると+ Q 2
、次のようになります。
これは正確に正しいので、などの引数を使用して完全な式を実行すると、正常にi.30
機能します。
ただし、式+ Q 2 i.30
をJコンソールに入力すると、「長さエラー」が返されます。なぜ?!+ Q 2
正確に同等ではありません+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0
か?
私は完全に困惑しています。私は何が欠けていますか?接続詞の定義の内側と外側の両方でランクを試してみました。わからない。
j - ループなしで APL または J の要素の頻度をカウントする方法
2 つのリストがあるとします。1 つはテキストt
、もう 1 つは文字のリストですc
。各文字がテキストに何回出現するかを数えたい。
これは、次の APL コードで簡単に実行できます。
ただし遅いです。外積を取り、各列を合計します。
これは、n と m が と のサイズである O(nm) アルゴリズムt
ですc
。
もちろん、t
文字ごとに読み取り、この問題を O(n+m) で解決する手続き型プログラムを APL で作成できます (完全なハッシュを想定)。
ループ(または条件付き)なしでAPLでこれをより速く行う方法はありますか? Jでの解法も承ります。
編集: 実際には、テキストが文字のリストよりもはるかに短い場所でこれを行っています(文字は非ASCIIです)。テキストの長さが20で、文字リストの長さが数千である場所を検討しています。
n が m より小さい場合、単純な最適化があります。
w には t の文字のみが含まれるため、テーブル サイズは t のみに依存し、c には依存しません。このアルゴリズムは O(n^2+m log m) で実行されます。ここで、m log m は交差操作を実行する時間です。
ただし、誰かが巨大なテキスト ファイルを渡した場合に備えて、サブ 2 次アルゴリズムが引き続き推奨されます。
functional-programming - J 句 '(2&*~) 15 7 3 1' がテーブルを生成するのはなぜですか? また、その特定のテーブルが生成されるのはなぜですか?
以上が台詞です。最後はトレースと最終結果です。このフレーズがモナドであることは理解しています。〜のおかげで、左と右の引数があることも理解しています。'15 7 3 1(2&*) 15 7 3 1' を実行すると、同じ出力が発生します。また、右の表は 1、3、7、15 の 2 の累乗であり、他のエントリは 2 の累乗の基数倍であることがわかりますが、その理由がわかりません。
関連する注意事項として、これは Rosetta Code Web サイトのエトピア乗算からのフレーズです (実際、これも同様に、私がそれを理解しようとしてここまでたどり着きました) および '(1>.<.@-:)^: a:' はフレーズです。
しかし、 (1>.<.@-:)^: 27 はそれ自体のボックス化されたバージョンを返し、27 回実行されると予想します。
関連する 3 つの質問の最後 (これらはすべてエトピア乗算コードの分解に関連しています) では、完全なコードは次のように与えられます。
そしてそれは次のように自明に置き換えることができます:
そして、それはうまくいきます!成功に打ちのめされた私は、コマンド ラインで動作するモナド double があると思ったとき、完全に崖から落ちました。
また、double 演算子は、定数が付加された double よりも高速である必要があります。おそらく、double は単にシフトするだけなので、
うまくいくでしょう...しかし、そうではありません。
大文字や接続詞などを試しましたが、何も機能せず、常に「ドメイン エラー」と表示されます。私が得られない方法で倍増テーブルを作成するために、コードが動的に呼び出されるモナドに依存していると考え始めています。
唯一の良い点は、J 動詞の奇数が奇数のテストとは何の関係もないことです。
プログラムがどのように機能するかについての英語の説明を付けて、誰かが私にこれらのことを説明できますか? アルゴリズムがどのように機能するかではなく、アルゴリズムをどのように実装するかです。1970 年に IBM 1130 APL で遊んでいたときのことを思い出します。これは、8k ワードで実行される APL インタープリターであり、言うまでもなく、制限がありました。たとえば、ロールはありましたが、取引はありませんでした。インタープリターは、メモリから段階的に出入りし、1130 はコード オーバーレイをサポートし、サブルーチンをグループに分割し、あるグループが別のグループを呼び出すと、新しいグループをディスクからロードします (はい、8k での疑似スワッピング)。そこで、さまざまなスキームを使用して、deal のバージョンを作成しました。ランダムに、シークせずにフェーズ インおよびフェーズ アウトできるバージョンを見つけました。他と同じように高速です。自分が何をしているのかわからなかったので、シークせずに実行されるものになるまで、ラヴェルや無意味な代入を追加し、行をまたがってステートメントを分割したり、それらを組み合わせたりし続けました。(シークしていた 52 取引 52 には 45 秒かかる場合があります)。
そして昨夜、J で 150,000 番目のフィボナッチ数を計算しました。これは 64 ビット バージョンでなければならず、1 時間 17 分かかりました。私は正確な算術演算を使用しました。数字は 31349 桁で、1012838344936638038 で始まります...そして、1130 ではこれを計算することはできなかったことに気付きました。数字は適合しないため、そのうちの 3 つが必要であり、最大のものを作成しました。 32kの16ビットワードがありました。これができる言語を学びたいのですが、ドキュメントに欠けているものがあります。
フィボナッチ 脚注:
j - この J プログラムに 2 つ目のフック/フォークを追加しようとすると、予期しない結果が生じます。誰でも理由を説明できますか?
私はいつもインデックスエラーになります。
ポイントは、2 つの数値を出力することです。1 つはリストの最初の数値と同じで、2 番目の数値はその数値が繰り返される回数と同じです。
したがって、これはうまくいきます:
最初の数字をリストの残りの数字と比較します。次に、and 圧縮の挿入を行います。これにより、1 の連続した文字列がある限り、1 が得られます。これは、and が壊れて失敗し、ゼロが出てくるとです。
次に、別の括弧のセットを追加し、リストからリード要素を再度取得し、何らかの方法でそれらの数値を記録できると考えました。最終的なアイデアは、元のリストにベクトルの逆数を適用する別の段階を持つことです。次に $: を使用して、同じ動詞の再帰的な適用に戻ります。クイックソートの例のようなもので、ある程度理解していると思っていましたが、そうではないと思います。
でも近づかない。人々が回答に対して適切な信用を得られるように、これを別の質問として尋ねます。
functional-programming - Jのインプレースでリストの要素を変更することはできますか?
私はJでlookandsay(OEIS A005150)の実装で遊んでいますwhile.
。タイプ制御構造を使用して、両方とも非常に単純な2つのバージョンを作成しました。1つは繰り返し、もう1つはループします。私は強迫的であるため、バージョンで比較タイミングを実行し始めました。
見て、言うのは、s、1つ、2つなどのシーケンス1 11 211211111221です。
リストの初期の要素(最大約20)の場合、ループバージョンが優先されますが、その量はごくわずかです。30前後のタイミングでは、再帰バージョンが勝ちます。スタックスペースがそれをサポートするのに十分である場合、再帰バージョンが優先される可能性があります。その理由を調べましたが、それは中間結果の処理に関係していると思います。シーケンスの30番目の数字は5808桁です。(32番目の数字、9898桁、34番目、16774。)
再帰で問題を実行しているときは、再帰呼び出しで中間結果を保持できます。最後にスタックを解除すると、結果の処理が最小限になるように結果が作成されます。
リストバージョンでは、結果を保持するための変数が必要です。ループを繰り返すたびに、結果に2つの要素を追加する必要があります。
問題は、私が見ているように、既存の配列を完全に再割り当てせずに変更する方法をJで見つけることができないことです。だから私は言っている
開始時にoに値がない可能性があるoに要素を配置します。それは著しく遅いかもしれません
ポイントは、ほつれがないと結果が間違った形になるということです。なんとなくi.0から形を継承しています。
ただし、} amendのような関数でさえ、リストを変更せず、変更が加えられたリストを返します。リストを保存する場合は、リストを割り当てる必要があります。割り当てられたリストのサイズが大きくなるにつれて(番号を最初から最後まで歩いて次の番号を作成するにつれて)、割り当てにはさらに時間がかかるように見えます。この割り当ては、要素32、9898桁を作成し、再帰バージョンでは時間がかからないのに対し、要素20(408桁)はループバージョンでは時間がかからないことを私が確認できる唯一のことです。
再帰バージョンは、次のようにリターンを構築します。
上記の行は、関数からの戻り行と再帰の両方であるため、呼び出しが文字列の最後に到達し、すべてがアンスタックされると、戻りベクトル全体が一度に構築されます。
APLでは、次のようなことを言うことができると思いました。
しかし、NARS2000でこれを試してみると、インデックスエラーが発生することがわかりました。私は他のAPLにアクセスできません。APLPlusのこのイディオムを覚えているかもしれませんが、APL\360またはAPL\1130でこのように機能したとは思えません。私はそれを完全に覚えていないかもしれません。
Jでそれを行う方法を見つけることができません。それを行う方法がない可能性がありますが、次の考えは、結果を保持できる配列を事前に割り当て、個々のエントリを変更することです。それを行う方法もわかりません。つまり、JはAPLイディオムをサポートしていないようです。
これは、言語の純粋さのために許可されていない副作用の1つですか?
インタプリタは、またはそのバリアントの一部を、内部的a=. a,foo
にファストパスする必要があるものとして認識していますか?a[>:#a]=.foo
これは再帰バージョンであり、そのためだけのものです。私はさまざまなバージョンを試しましたが、プログラムが長いほど遅くなり、一般的に複雑になるほど遅くなると思います。一般に、プログラムはチェーン化できるため、n番目の数値が必要な場合は、lookandsay ^:n]yを実行できます。いくつかの最適化を試しましたが、問題は、出力を送信する環境がわからないことです。プログラムの次のイテレーションに送信していることがわかった場合は、大きな数ではなく、数字の配列として送信します。
また、コードの暗黙のバージョンを作成する方法を理解できれば、コードを短くする必要があるものをコードに追加すると、実行時間が長くなるという私の発見に基づいて、実行速度が速くなると思います。
生成された数字の特徴に興味がありました。1から始めると、数字が3より大きくなることはありません。3より大きい数字から始めると、シングルトンとして存続します。また、何かから始めることで、生成された数字に数字を入れることもできます。 888888888のように、1つの9が含まれ、番号の最後に1つの8が含まれる番号が生成されます。ただし、シングルトンを除いて、3を超える数字はありません。
編集:私はもう少し測定をしました。私はもともと、ベクトルまたはスカラーのいずれかを受け入れるようにプログラムを作成していました。内部的にはベクトルを使用するという考えです。コードのあるレイヤーから別のレイヤーにベクトルを渡すことを考えていましたが、それでも左の引数を使用してコードを制御する可能性があります。トップレベルのベクトルを渡すと、コードは非常に高速に実行されるため、非常に長い数値をベクトルから数字に変換することで、ほとんどのCPUが消費されていると思います。再帰ルーチンは、再帰するときに常にベクトルを渡します。これが、ループとほぼ同じ速度である理由である可能性があります。
それは私の質問を変えません。
これに対する答えがありますが、3時間投稿できません。それでは投稿しますので、たくさんの調査をして答えないでください。
list - この J コードを統合する
私は J を学んでいて、基本的なことから始めています。100 未満の 3 と 5 の倍数を追加します。次のコードで取得しました。
しかし、もっと簡単な方法があるはずです。このコードをきれいにする方法はありますか? ありがとう。
j - Windows 7でJ gtkターミナルに一重引用符を入力する方法
J のプログラミングを始めたばかりです。
gtk ターミナルでは、実行時に次のように表示されます。
こんにちは世界
しかし、一重引用符を入力すると、gtk ターミナルでは ' ではなく ' としてレンダリングされます。そして、プログラムを実行すると、インタープリターは「スペルエラー」と言います。ターミナルに ' を入力できる唯一の方法は、メモ帳に入力して gtk ターミナルに貼り付けることです。私はそれが面倒だと思います。
今私の質問は次のとおりです: gtk ターミナルで ' を入力する簡単な方法はありますか? 私はWindows 7 64ビットバージョン、Jの64ビットバージョン、バージョンj64-701を持っています。