歴史家ヒステリー

Mary-Kate Olsen
リリース: 2024-12-08 10:38:13
オリジナル
712 人が閲覧しました

Historian Hysteria

コード 2024 の出現 1 日目

パート 1

笑顔で一年のスタートを切るソフトボール

これを解決するのは簡単そうです:

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
ログイン後にコピー
ログイン後にコピー

ステップ 1: 数値のリストを 2 つ作成する

まず、各項目が数字である 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 ]
ログイン後にコピー

残りの 3 つのステップを一度に完了します。

let answer = 0;
for (let i = 0; i < list1.length; i++) {
  answer += Math.abs(list1[i] - list2[i]);
}
ログイン後にコピー

例: 11

で動作します。

私のパズル入力でも機能しますか?

そうです!

うわー!金の星が 1 つ!

パート 2

実行時間をテストするための楽しいひねり

この指示を読むと次のように信じられます:

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 の正しい構文を忘れたと思っていましたが、それだけです!

リスト項目ごとに 1 つの簡単な検索

数値に関連付けられた値の存在と値を条件でチェックする別の 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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート