これを解決するのは簡単そうです:
Parse the input into two equal lists of numbers Sort each list in ascending order Compare both values at each index Determine the absolute value after calculating the difference Increment a tally by the absolute value
まず、各項目が数字である 2 つの項目のリストのリストを作成します。
input.split('\n').split(' ').map(Number)
次に、インデックスに基づいて項目を個別のリストに抽出します。
let [list1, list2] = [ input.map((_,i) => i == 0), input.map((_,i) => i == 1) ]
最初の間違い: チェーン分割。
配列に対して分割を呼び出すことができません。
Map:
のように、反復メソッド内で分割する必要があります。
input.split("\n").map(...);
2 番目の間違い: スペースが足りません。
入力には、各数値の間に 1 つではなく複数のスペースが含まれています:
input.split("\n").map((el) => el.split(" ").map(Number));
3 番目の間違い: リストへのアクセスについて考えすぎます。
私のコードは、入れ子になった各リストが 1 つの要素であるかのように動作し、要素がリストの最初にあるか 2 番目にあるかに基づいてブール値を返しました。
何???!!!
このコードは各リストを認識し、最初または 2 番目の項目を保持します。
let [list1, list2] = [ input.map(list => list[0]), input.map(list => list[1]), ];
残念なことに、私のアルゴリズムは 2 つの数値リストを生成してしまいました!
うーん、10ヶ月もやっていなかったのでちょっと錆びてしまいました。
これは短くて魅力的なものでなければなりません。
実際には、上のコードに直接追加するだけです。
let [list1, list2] = [ input.map(list => list[0]).sort((a,b) => a - b), input.map(list => list[1]).sort((a,b) => a - b), ];
入力例では魅力的に機能しました:
[ 1, 2, 3, 3, 3, 4 ] [ 3, 3, 3, 4, 5, 9 ]
let answer = 0; for (let i = 0; i < list1.length; i++) { answer += Math.abs(list1[i] - list2[i]); }
例: 11
で動作します。私のパズル入力でも機能しますか?
そうです!
うわー!金の星が 1 つ!
この指示を読むと次のように信じられます:
For each number in list 1 For each number in list 2 If there's a match Increment a tally by 1
これは、リスト 2 がリスト 2 の長さの倍、リスト 1 の長さ... 倍チェックされることを意味します。
それぞれ 1,000 アイテム: 100 万小切手
それは悪くない。しかし、それは不要のようです。
私が気にするのは、リスト 2 の各数値の数だけです。
つまり、1000 個すべての数字を一度チェックして、数字とそのカウントのマップを作成できます。次に、そのリストを 1000 回チェックします。
2000 <; 100万
私はこのアプローチの方が好きです。コードへ!
リストの例は次のようになります:
4, 3, 5, 3, 9, 3
したがって、次のようなオブジェクトが必要です:
{ 4: 1, 3: 3, 5: 1, 9: 1 }
パート 1 アルゴリズムの list2 を使用して、reduce を実行してこのオブジェクトを構築する必要があります。
let counts = list2.reduce((obj, num) => { if (!(num in obj)) { obj[num] = 1 } else { obj[num] += 1 } return obj }, {})
驚いたことに、そのスニペットは期待どおりに機能します!
obj の num の正しい構文を忘れたと思っていましたが、それだけです!
数値に関連付けられた値の存在と値を条件でチェックする別の Reduce:
Parse the input into two equal lists of numbers Sort each list in ascending order Compare both values at each index Determine the absolute value after calculating the difference Increment a tally by the absolute value
間違ったスコアが表示され続けました。
私はなぜだろうとずっと考えていました。
私は、出力する値をどんどん増やして console.log() ステートメントを追加し続けました。
予想していなかった価値観が次々と現れました。
それで、見ました。
カスタム カウント オブジェクトではなく list2 と比較していました!
エゴへの巨大なパンチ。しかし、初日に必要なものはすべて揃っていました。
これが動作するコードです:
input.split('\n').split(' ').map(Number)
これにより、入力例に対する正しい答えが生成されます。
私のパズル入力でも同じように機能することを願っています。
そして願わくば、超高速で動作することを願っています!
そうです!
やったー!!!
2 つの金星が始まりです。
それに加えて、私を根付かせる初歩的な間違いもいくつかあります。
それが私がこれらのパズルを愛する理由です。
2日目も続きます!
以上が歴史家ヒステリーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。