問題タブ [tacit-programming]
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 の Euler 56 の正しい答えが得られないのはなぜですか?
Project Euler の問題のうち 84 を解決しましたが、ほとんどは Haskell でした。J. _ _
現在、問題 56を解決しようとしています。Haskellですでに解決しているので、正しい答えが何であるかをすでに知っていることを強調させてください。とても簡単で、些細な問題です。答えはここでは言いません。
Jでの私の解決策は次のとおりです。
これにより、目的の結果よりも少ない数値が生成されます。つまり、どこか間違っている。そこにいるJ-ersは理由を知っていますか? それは非常に簡単で、完全に力ずくなので、私は困惑しています。
tacit-programming - Jでioをファイルするにはどうすればよいですか?
ファイルなどの読み取りと書き込みができるようにしたいのですが、どうすればよいですか?
tacit-programming - Jのユニークな機能は何ですか?
私は C、Fortran、Python、R、Matlab、およびいくつかの Lisp のバックグラウンドを持っており、Haskell についていくつか読んだことがあります。J や APL ファミリーの他の言語で、より一般的な言語では実装されていないユニークなアイデア/例は何ですか? 何が欠けているのかを見つけることに常に興味があります...
void - Jの無効動詞
オンラインで J を使用する方法を学んでおり、この言語を使用して古い Java の割り当てをやり直しています。オペランドを取らない動詞を作成する方法、または結果を返す方法を知りたいです。その理由は次のとおりです。動詞を入力できるようにしたいと思いgo
ます。一連のコードを単独で実行し、実行時に生成されるデータを保存する動詞を呼び出してみましょう。ただし、何も表示されません。これの全体的な目標は、少なくともvoid returnChange()
メソッドを必要とする自動販売機クラスとインターフェースを最終的に再現できるようにすることです。
haskell - J スタイルの副詞、フォークなどは、主流の関数型言語のライブラリを介してエミュレートされていますか?
動詞、副詞、フォークなどを介した超凝縮された暗黙のプログラミングの J スタイルのエミュレーションが、主流の関数型言語のライブラリを介して試みられたことはありますか?
もしそうなら、結果はどのくらい成功しましたか?
そうでない場合、これを不可能にする技術的な問題はありますか?それとも、実行する価値がないだけですか?
私は特に、関数型プログラミングの基本概念に直接対応していないように見えるフォークのような構造に興味があります。
functional-programming - ポイントフリーコードをいじっていますか?
ポイントフリープログラミングを試すために、Factor 言語と J 言語を学んでいます。言語の基本的な仕組みは明確に見えますが、アルゴリズムの設計にどのようにアプローチするかを理解するのは簡単ではありません。
私にとって特に混乱の原因は、さまざまなパラメーターを簡単に試すことができるようにコードを構造化する方法です。これは、Mathematica と Matlab が非常に得意とする類のものを意味します。アルゴリズムを設定して変数を操作し、何が起こるかを観察します。
明示的な変数なしでこれを行うにはどうすればよいですか? たぶん、私はこれについてすべて間違って考えています。ポイントフリープログラミングでこれにどのようにアプローチすればよいですか?
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時間投稿できません。それでは投稿しますので、たくさんの調査をして答えないでください。
haskell - テンプレートHaskellのポイントフリースタイル
次のテンプレートHaskell関数を考えてみましょう。
方程式の右辺からラムダ式を削除し、composeQ
ポイントフリースタイルを使用して書き込むことは可能ですか?