問題タブ [infix-notation]
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.
stack - 中置とスタックの優先順位を追加の演算子に拡張するにはどうすればよいですか?
中置とスタックの優先順位をどのように拡張して、演算子、、、、、、、、、、、を含めるの<
でしょうか。>
<=
>=
==
!=
!
&&
||
中置式を解析する場合、たとえばP + (Q – F) / Y#
、次のようになります。各シンボルには、操作の順序に関連する優先順位があります。/
および*
よりも優先度が高く+
なり-
ます。
これが私が持っている/理解している優先事項です:
design-patterns - Scalaの組み込み型にメソッドを追加することは可能ですか?
infix
組み込み型 (Double など) にメソッドを追加して、演算子を使用できるようにしたいと考えています。それは可能ですか?
parsing - infix、postfix、prefix 関数などをサポートする言語を作成できなかった理由は何ですか?
私は、中置、後置、前置、または複数の単語で構成される関数の定義を許可することで、DSL の作成に非常に適した言語を作成することを熟考してきました。たとえば、中置乗算演算子を次のように定義できます (multiply(X,Y) は既に定義されています)。
または、後置の「二乗」演算子:
または、変数が散在する 2 つのキーワードを含む C または Java スタイルの三項演算子:
明らかに、そのような言語にはあいまいさの余地がたくさんありますが、(型推論で) 静的に型付けされている場合、ほとんどのあいまいさは排除され、残っているものは構文エラーと見なすことができます (括弧を追加することで修正されます)。適切な)。
これを非常に困難にする、不可能にする、または単に悪い考えにする理由があるとは思いませんか?
編集:多くの人が、これまたはこのようなことを行う可能性のある言語を指摘してくれましたが、実際には、独自のパーサーを実装する方法、またはそうする場合に発生する可能性のある問題へのポインターに興味があります。
math - 単純な数式の文字列を評価する
チャレンジ
これが課題です (私自身の発明によるものですが、以前に Web の他の場所に登場したとしても驚かないでしょう)。
単純な数式の文字列表現である単一の引数を取り、それを浮動小数点値として評価する関数を作成します。「単純式」には、正または負の 10 進数、+、-、*、/、(、)のいずれかを含めることができます。式は (通常の)中置記法を使用します。演算子は、 BODMASのようにではなく、出現順に評価する必要がありますが、もちろん括弧は正しく観察する必要があります。関数は、任意の正しい結果を返す必要があります。この形の可能な表現。ただし、関数は不正な式 (つまり、構文が正しくないもの) を処理する必要はありません。
式の例:
ルール
ここで何らかの「不正行為」/狡猾さを予想しているので、事前に警告させてください! チートとは、eval
JavaScript や PHP などの動的言語で または同等の関数を使用すること、またはコードをオンザフライでコンパイルして実行することを指します。(ただし、「BODMAS なし」という私の仕様は、これをほぼ保証していると思います。) それ以外には、制限はありません。ここでいくつかの Regex ソリューションを期待していますが、それだけではありません。
ここでは、主に C#/.NET ソリューションに関心がありますが、他の言語も完全に受け入れられます (特に、関数型/混合型アプローチの場合は F# と Python)。答えとして(少なくともその言語については)最短または最も独創的な解決策を受け入れるかどうかはまだ決めていませんが、上記で禁止したものを除いて、任意の言語でのあらゆる形式の解決策を歓迎します!
私の解決策
C# ソリューションをここに投稿しました(403 文字)。更新: 私の新しいソリューションは、少し素敵な正規表現の助けを借りて、294 文字で古いソリューションを大幅に上回りました! これは、より軽い構文 (特に機能的/動的なもの) を使用する一部の言語によって簡単に打ち負かされるのではないかと考えており、正しいことが証明されていますが、誰かがまだ C# でこれを打ち負かすことができるかどうかに興味があります。
アップデート
私はすでにいくつかの非常に狡猾な解決策を見てきました。投稿してくれたすべての人に感謝します。私はまだそれらをテストしていませんが、人々を信頼し、少なくとも与えられたすべての例で動作すると仮定します.
注意点として、再入可能性 (つまり、スレッドセーフ) は関数の要件ではありませんが、おまけです。
フォーマット
簡単に比較できるように、すべての回答を次の形式で投稿してください。
言語
文字数:???
完全に難読化された機能:
クリア/半難読化機能:
それが取るアルゴリズム/巧妙なショートカットに関するメモ。
c - C言語を使用して中置式を計算する最も簡単な方法は何ですか?
ユーザーが中置式を文字列として入力するとします。C言語を使用してその式の結果を評価する最も簡単な方法は何ですか?
考えられる方法は、スタックを使用してポストフィックスに変換することですが、かなり長いプロセスです。仕事を簡単にするatoi()やeval( )などの関数を使用する方法はありますか?
f# - パイプライン演算子を使用して、返されたオブジェクトのメソッドを呼び出すことはできますか?
パイプライン中置演算子を使用して、返されたオブジェクトのメソッドを呼び出すことは可能ですか?
たとえば、メソッド(Method1)を持つ.Netクラス(Class1)があります。私は現在、次のようにコーディングできます。
私はそれをそのようにコーディングすることもできることを知っています
しかし、私はそれをパイプライン化できるようにしたいと思います(私は何をすべきかわからないところで以下の?を使用しています):
さらに、オブジェクトを返すメソッドがあり、そのメソッドがnullを返さなかった場合にのみそれを参照したいとします(そうでない場合はbail?)
または、わかりやすくするために、C#コードを次に示します。
c# - RPN 評価関数の最適化を支援する
私のパーサーは、最初に中置から後置に変換することによって PEMDAS 式を評価し、次に標準の後置評価規則を使用します。式を解析し、トークンをリストに保存します。プリコンパイルされた関数をキャッシュする予定なので、このプリコンパイルは問題ありません。
評価関数を最適化しようとしています (コードの Evaluate04 を参照)。私のハードウェアでは、600 ミリ秒未満で 1,000,000 件の評価を取得できます。正直なところ、これで十分速いと思います。式を取得するためのデータベース アクセス呼び出しよりもはるかに高速です。
皆さんがそれをより速くできるかどうかを見たかったのです。クラスのマイクロ最適化、完全なリファクタリング。それがどのように行われたかは問題ではありません。
これは私が取得できたのと同じくらい速いです。改善してもらえますか?
c - 式の記述: Infix、Postfix、および Prefix
私の仕事は、中置記法(変数、単項および二項演算子を含む)で式を読み取り、それをメモリに保存してから評価するアプリ(残念ながらCで)を作成することです。また、正確性のチェックも実行する必要があります。
例えば:
3*(A+B)-(-2-78)*2+(0*A)
すべての値を取得したら、プログラムで計算する必要があります。
質問は次のとおりです。これを行う最善の方法は何ですか?(最適化と検証を使用して)
ツリーのベースとして選択する表記法は?
式をツリーで表現する必要がありますか? もしそうなら、私はそれを簡単に最適化できます(0またはsmthを返すノードをドロップするだけです)。
乾杯、
c++ - スタックに挿入するプレフィックス
C ++でプレフィックスをインフィックスに実装しようとしていますが、これがこれまでのところです。入力は、たとえば次のようにする必要があります。
そして出力:
しかし、代わりに私は得る:
それが私がこれまでに書いたコードです:
c++ - 論理条件の C++ インフィックスからプレフィックスへの変換
C++ で 1 つの式を評価したい。それを評価するために、式をプレフィックス形式に変換したいと考えています。
ここに例があります
可能な方法を次に示します。
Here And、Or、Notは予約語であり、括弧 (" ( ", ) ) はスコープに使用されます
優先順位が高くない
Andは次の優先順位が Not に設定されます
Orは And の次の優先順位に設定されます
区切り文字に使用されるWHITE SPACE 。Expression には、 TAB、NEWLINEなどの他の要素はありません
算術式は必要ありません。私は評価を行うことができますが、誰かが文字列をプレフィックス表記に変換するのを手伝ってくれますか?