パズルの入力を覗いてみたら、とても怖くなってしまいました。
その後、パート 1 で何をしなければならないかを読んで、一時的に安心しました。
これには簡単な正規表現を使用できます!
かっこをエスケープすることを忘れないようにしなければなりませんでしたが、こうして正常に動作する正規表現が得られました。
/mul\((\d*),(\d*)\)/g
次に、各一致に対して適切な抽出と計算を行う必要があります
完全に動作するコードは次のとおりです:
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 );
入力例に対する正しい答えを生成します。
パズル入力を試してみると...
正解です!!!
深呼吸....
............パート 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]; });
確認済み:
これは少し複雑になります。
物事が有効になったので、最初の don't() までインデックス 0 から取得する必要があります。したがって、そのインデックスを見つける必要があります。そして、その部分文字列を確認してください。
それ以降、後続の don't() をすべてスキップして、次の do() を探すことができます。
これを新しい開始インデックスとして、次の don't() を見つける必要があります。それが私の新たな終点です。その部分文字列を確認してください。
そして、次の do() を見つけて、次の don't() を見つけて、部分文字列をチェックすることを繰り返します。
これは while ループのように感じられます。
アルゴリズムを作成するときに、さらに詳しくわかります。
パターンの欠如した禁止事項の発生順序を処理するための多くの条件:
/mul\((\d*),(\d*)\)/g
嬉しいことに、入力例に対して正しい答えが生成されます。
パズル入力を処理した後、何が生成されますか?
...
正解です!!!
ただし、チェックする前に、チェックする部分文字列の開始インデックスと終了インデックスをそれぞれ確認するためのコンソール ロギング ステートメントを追加しました。
配列内のフラグの順序と比較してみました。
すべてが正しいと思われたので、送信しました。
そして正解が出ました!
なんと楽しくてやりがいのある気持ちでしょう!
また早い日が始まりました。また苦労して獲得した 2 つの金星です。
4 日目へ!
以上が考えてみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。