考えてみましょう

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-17 01:43:25984ブラウズ

Mull It Over

コード 2024 の出現 3 日目

パート 1

パート2が怖い

パズルの入力を覗いてみたら、とても怖くなってしまいました。

その後、パート 1 で何をしなければならないかを読んで、一時的に安心しました。

  • mul(N,N) のすべてのインスタンスを検索するだけです

これには簡単な正規表現を使用できます!

正規表現を使用してすべての有効な mul を検索する

かっこをエスケープすることを忘れないようにしなければなりませんでしたが、こうして正常に動作する正規表現が得られました。

/mul\((\d*),(\d*)\)/g
  • これはすべての有効な mul 部分と一致します
  • 各ペアの各桁のキャプチャ グループを作成します

次に、各一致に対して適切な抽出と計算を行う必要があります

アルゴリズムを書く

完全に動作するコードは次のとおりです:

let total = [...input.matchAll(/mul\((\d*),(\d*)\)/g)].reduce(
  (total, match) => {
    total += match
      .slice(1, 3)
      .map(Number)
      .reduce((a, b) => a * b);
    return total;
  },
  0
);
  • すべての一致を見つけて配列に展開します
  • 次に、それぞれを反復処理して、値を 0 から累積します
  • 各一致について、インデックス 1 と 2 の 2 つのキャプチャされたグループのみを取得します
  • 数値に変換します
  • それらを製品に還元します
  • その金額を現在の合計に追加します

入力例に対する正しい答えを生成します。

パズル入力を試してみると...

正解です!!!

深呼吸....

............パート 2

パート 2

ああ、それはそれほど悪くない

入力にはさまざまな単語が含まれているため、考慮すべきあらゆる種類の新しいルールが追加されるだろうと考えました。

ありがたいことに、有効な mul ステートメントの開始と終了として機能する新しい単語は 2 つだけです。

これは、各 do() と don't() にインデックスを付け、解析する mul ステートメントの適切な部分を検索することで、有効なステートメントの各部分を分離する演習のように感じられます。

条件フラグのインデックス付け

正規表現を使用して do() と don't() のすべての出現に一致させたいです:

/don't\(\)|do\(\)/g

これにより、入力文字列のパスに沿ってチェックポイントが交互に存在するはずです。

そうであれば、do() チェックポイントと don't() チェックポイントの間の部分文字列を抽出し、muls をチェックできます。

入力例と完全な入力の両方について確認させてください。

フラグとそのインデックスを分離するための私のアルゴリズムは次のとおりです:

let flags = [...input.matchAll(/don't\(\)|do\(\)/g)].map((el) => {
  return [el[0], el.index];
});

確認済み:

  • 例の代替条件
  • 入力に信頼できるパターンがありません: 複数の do() と don't() が連続しています

これは少し複雑になります。

新しい戦略

物事が有効になったので、最初の don't() までインデックス 0 から取得する必要があります。したがって、そのインデックスを見つける必要があります。そして、その部分文字列を確認してください。

それ以降、後続の don't() をすべてスキップして、次の do() を探すことができます。

これを新しい開始インデックスとして、次の don't() を見つける必要があります。それが私の新たな終点です。その部分文字列を確認してください。

そして、次の do() を見つけて、次の don't() を見つけて、部分文字列をチェックすることを繰り返します。

これは while ループのように感じられます。

アルゴリズムを作成するときに、さらに詳しくわかります。

新しい、より長いアルゴリズム

パターンの欠如した禁止事項の発生順序を処理するための多くの条件:

/mul\((\d*),(\d*)\)/g

嬉しいことに、入力例に対して正しい答えが生成されます。

パズル入力を処理した後、何が生成されますか?

...

正解です!!!

ただし、チェックする前に、チェックする部分文字列の開始インデックスと終了インデックスをそれぞれ確認するためのコンソール ロギング ステートメントを追加しました。

配列内のフラグの順序と比較してみました。

すべてが正しいと思われたので、送信しました。

そして正解が出ました!

なんと楽しくてやりがいのある気持ちでしょう!

また早い日が始まりました。また苦労して獲得した 2 つの金星です。

4 日目へ!

以上が考えてみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。