赤鼻のレポート

DDD
リリース: 2024-12-04 19:47:11
オリジナル
206 人が閲覧しました

Red-Nosed Reports

コード 2024 の出現 2 日目

パート 1

ただ解決するのか、それとも最適に解決するのか?それが質問です

単に解決するには:

  • 元の順序のリストを、それぞれソートされているが逆の順序である 2 つのコピーと比較します。 1 つが一致する場合、基準 1 は成功です
  • 最初の項目を除く、リスト内のすべての項目を繰り返します。各項目と前の項目の違いを追跡します。差異が 0 または 3 より大きい場合、このテストは失敗します。

パフォーマンスの点では、次のことを意味します:
基準 1 の場合:

  • リストのコピー 2 つ
  • 各コピーを並べ替える
  • 元のリストを 2 回比較する 基準 2 の場合:
  • 各リストのすべての番号を確認してください

最適に解決するには:

  • 条件 2 については、while ループを利用して、後続の数値に有効な違いがあるかどうかを確認します。そうすれば、失格となるような差が発生するとすぐに、残りの数字は処理されなくなります
  • 条件 1 については、差異を追跡し、すべてがゼロより小さいか大きいかどうかを 1 回チェックします

これはうまくいくと思います。それを確認する方法は 1 つだけです。

最適化されたアルゴリズムを作成する

基準 2 (1、2、または 3 の違い) を識別するためのコードは次のとおりです。

let differFlag = true;
let i = 1;
while (differFlag && i < list.length) {
  let amount = Math.abs(list[i] - list[i - 1]);
  if (![1, 2, 3].includes(amount)) {
    differFlag = false;
  }
  i++;
}
ログイン後にコピー
  • 無効な差分が存在する場合は、それが見つかるまでリストを「探索」するだけです
  • いずれかがキャッチされるとすぐに while ループが終了します
  • while ループの後、結果の DifferentFlag を確認できます

基準 1 (すべての差異が増加または減少) を識別するためのコードは次のとおりです。

let differFlag = true;
let i = 1;
let differences = [];
while (differFlag && i < list.length) {
  let amount = list[i] - list[i - 1];
  differences.push(amount);
  if (![1, 2, 3].includes(Math.abs(amount))) {
    differFlag = false;
  }
  i++;
}
ログイン後にコピー
  • それぞれの違いのリストを作成します
  • 実際には差の符号を捉えたいため、絶対値の計算を条件式に移動しました
  • while ループの後、差分をチェックして、すべての値が正か負かを確認できます

安全なレポートを取得する最終条件は次のとおりです:

if (
     differFlag &&
    (differences.every((el) => el > 0) || 
     differences.every((el) => el < 0))
    ) {
      safeCount++;
    }
ログイン後にコピー

全体として、私のアルゴリズムは入力例に対する正しい答えを生成します。

パズル入力でも同じことが起こりますか??

はい、そうです!!

素敵です!

パート 2

まあ...撃ってください。

これは確かに状況を少し複雑にします。

レポートの可能なすべての順列をチェックするアルゴリズムは避けたいと考えています。それには何百万ものレポートを作成する必要があります。

最初の良いニュースは次のとおりです:

  • すべての安全なレポートは引き続き安全としてカウントされます

私のパズル入力の場合、順列をチェックする必要のないものは約 200 です。

それでも、800/1000 は、順列を完全に調べるにはまだ たくさんのリストです。

正直なところ、安全でないレポートの順列ごとにアルゴリズムの実行を回避する方法がわかりません。

残念です。

安全でないレポートの各数値 (削除する数値) を反復処理するループを追加し、変更されたリストで合格点を確認します。

順列チェックループの追加

結局、while ループを複製して、後続の各テスト レポートから 1 つの数値を複製して削除する行を追加しました。

コードはさらに多くなります。

しかし、それはうまくいきます!パズル入力の正解を生成します!

質問は次のとおりです:

  • 実行して、パズル入力に対する正しい答えを生成しますか?

実行して見てみましょう...

うーん、実行できますが、パート 1 の回答よりわずかに大きいだけであるという回答が得られます。それは間違っているようです。

提出しても問題ありませんね????

それはです正しいです!

喫煙は最高です!

それはすごいですね!

そして解くのは本当に楽しいです!

3 日目には 4 つのゴールドスターが登場します。

もっと素晴らしいパズルを生み出してください!

以上が赤鼻のレポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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