非負の整数 n とユーザー定義の不等式の任意のセット (外部テキスト ファイルなど) が与えられた場合、n が不等式を満たすかどうか、満たす場合はどの不等式かを判断したいと考えています。
ポイント一覧はこちら。
n = 0: 1
n < 5: 5
n = 5: 10
n が 5 に等しい数字を引くと、10 ポイントを獲得できます。
n が 5 未満の場合、5 点を獲得します。
n が 0 の場合、1 ポイントを獲得します。
コロンの左側が「条件」、右側が「値」です。
すべてのエントリは次の形式になります。
n1 op n2: val
このシステムでは、平等が不平等よりも優先されるため、それらが現れる順序は最終的には問題になりません。入力は非負の整数ですが、中間および結果は非負ではない場合があります。結果は数値でさえないかもしれません (例: 文字列かもしれません)。私は、最も基本的な不等式のみを受け入れるように設計しました。これは、パーサーを簡単に作成できるようにするためです (そして、このアイデアが実現可能かどうかを確認するため)。
私のプログラムには 2 つのコンポーネントがあります。
構造化された入力を読み取り、データ構造を構築して条件とそれに関連する結果を格納するパーサー。
引数 (負でない整数) を取り、結果 (または、例のように、私が受け取るポイント数) を返す関数
リストがハードコーディングされている場合、それは簡単な作業です。case-when または if-else ブロックを使用するだけで完了です。しかし、問題はそれほど簡単ではありません。
上部のリストを思い出してください。任意の数の (不) 等号を含めることができます。おそらく上記のような3つしかありません。何もないかもしれませんし、10、20、50、あるいは 1000000 あるかもしれません。基本的に、m >= 0 の場合、m 個の不等式を持つことができます。
数値 n と、任意の数の条件と結果を含むデータ構造が与えられた場合、それがいずれかの条件を満たしているかどうかを判断し、関連付けられた値を返すことができるようにしたいと考えています。上記の例のように、5 を渡すと、関数は 10 を返します。
条件と値のペアは、そのままの形では一意ではありません。同じ (不) 等式で値が異なる複数のインスタンスが存在する場合があります。例えば:
n = 0: 10
n = 0: 1000
n > 0: n
最後のエントリに注意してください: n が 0 より大きい場合、それは取得したものと同じです。
複数の不等式が満たされる場合 (例: n > 5、n > 6、n > 7)、それらすべてを返す必要があります。それが効率的にできない場合は、それを満たした最初のものだけを返し、残りを無視することができます。しかし、リスト全体を取得できるようにしたいと考えています。
私はこれについてしばらく考えていて、2 つのハッシュ テーブルを使用する必要があると考えています。
等式は扱いが簡単です。条件をキーとして取得し、値のリストを用意するだけです。次に、n がハッシュに含まれているかどうかをすばやく確認し、適切な値を取得します。
ただし、不平等については、どのように機能するかわかりません。できるだけ少ない計算ステップでこの問題を解決する方法を知っている人はいますか? これを O(n) 時間で簡単に達成できることは明らかです。各 (不) 等式を 1 つずつ実行するだけです。しかし、このチェックがリアルタイムで行われるとどうなるでしょうか? (例: 常に更新)
たとえば、100 個の不等式があり、そのうちの 99 個が値 > 100 をチェックし、他の 1 個が値 <= 100 をチェックしている場合、47 を渡すときにそれらの 99 個の不等式をわざわざチェックする必要がないことは明らかです。
データを格納するために任意のデータ構造を使用できます。パーサー自体は前処理され、一度だけ実行する必要があるため、計算には含まれませんが、データの解析に時間がかかりすぎると問題になる可能性があります。
私は Ruby を使用しているので、データの「いじり」やデータの解釈方法に関しては、より柔軟なオプションがあると思います。