ホームページ バックエンド開発 Python チュートリアル Code Day の到来 キーパッドの難題

Code Day の到来 キーパッドの難題

Dec 30, 2024 pm 07:49 PM

Advent of Code  Day  Keypad Conundrum

21日目: キーパッドの難題

GitHub リポジトリ - ソリューション

今日の課題は難しく、ロジックを完全に理解するだけでなく、解決するのに 2 日かかりました。今年気づいたことは、指示の意図を理解するのに苦労したということです。

私と同じように、あなたもこの課題と解決策から何かを学んでいただければ幸いです。 Advent of Code に毎年参加すると、たくさんのことを学べます。そのため、さまざまな言語を試したり、自分自身を快適ゾーンから押し出したりするのが好きなのです。私は Advent of Code を単なる競争として扱うのではなく、開発者が知識やアイデアを共有する学習/開発の機会として考えています。

今日も Python を試してみましたが、その解決策には満足しています。今日私が学んだことは次のとおりです。クラス宣言で @dataclass(frozen=True) アノテーションを使用する不変クラス。

私は、座標をナビゲートして更新するためのヘルパー クラスとして Location クラスを作成しました (これは、一部の C# ソリューションで Point クラスを使用して以前に行ったのと少し似ています。

C# / .Net の厳密に型指定されたバックグラウンドを持っている私は、この複雑な問題の際に何を扱っていたのかを視覚化できるように、コードに型を追加してみました。私も TypeScript を書いているときにこれを行うことに慣れているので、ほとんど習慣になっています。

今日の問題

**パート 1 **では、複数のロボットをナビゲートおよび制御して、次のロボットに指示を渡し、テンキーでコードを入力するという問題を紹介します。

パート 2 では、一連のロボットと方向キーパッドによって複雑さを増すことで問題を解決し、マルチレベルの依存関係の指数関数的な性質を示します。

ウォークスルー

道順とキーパッドのレイアウトはすでにわかっているので、すべての位置マッピングとそれらが移動できる方向の辞書を構築できます。

キャッシュ (cache および move_cache)

cache: 以前に計算された最短シーケンスを保存して、冗長な計算を回避し、パフォーマンスを向上させます。

moves_cache: キーパッド上の任意の 2 つのボタン間の有効な移動シーケンスをすべて保存し、素早い検索のために事前に計算されます。

最短長の計算 (shortest_length)

指定されたコードを入力するためにボタンを押す最短のシーケンスを再帰的に計算します。

レベル (cur_ Depth) を限界 ( Depth_limit ) まで反復処理することにより、キーパッドのマルチレベル チェーンを処理します。

*ポジション間の移動 (moves_between_positions)
*

キーパッド上の 2 つのボタン間のすべての有効な一連の動きを計算し、ロボットが無効な位置 (ギャップ) を指して パニックにならないようにします。

キャッシュの初期化 (create_cache_moves)

テンキーと方向キーパッドの両方のすべてのボタン ペアに対して有効な移動シーケンスを事前計算し、実行時の計算を節約します。

解決関数は、シーケンスの長さにコードの数値部分を乗算して複雑さを計算する入力をループし、パズルの要件に従ってすべてのコードの複雑さを単純に合計します。

順列

順列は何をしますか?

Python の順列関数 (itertools モジュールから) は、項目のコレクションの考えられるすべての順序付けされた配置を生成します。

例:

from itertools import permutations

items = ['a', 'b', 'c']
list(permutations(items))
ログイン後にコピー

これにより次のものが生成されます:

[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
ログイン後にコピー

各順列は、元のコレクション内のすべてのアイテムを含む一意のシーケンスですが、順序は異なります。

なぜ組み合わせではなく順列を使用するのでしょうか?

順列:

アイテムのコレクションの可能な順序付けされた配置をすべて生成します。
項目の順序は重要です。

一方、
組み合わせ:

項目のコレクションの可能な順序なしの選択をすべて生成します。

項目の順序は関係ありません。

このシナリオではなぜ順序が重要なのでしょうか?

キーパッド ナビゲーション: 各動作の後にキーパッド上のロボットの位置が変化するため、動作が実行される順序が結果に直接影響します。

Valid Moves Check: この関数は、ナビゲーション中の中間位置の有効性をチェックします。移動の順序を変更すると、無効なパスが発生する可能性があります。

代わりに組み合わせが役立つのはどのような場合ですか?

組み合わせは、動きの順序が重要ではない場合、または順序を気にせずに動きやボタンのサブセットを選択しているシナリオで役立つ可能性があります。

キーパッドのナビゲーションでは移動の順序が重要であるため、現在の順列の使用が必要です。これを組み合わせに置き換えると、プログラムのロジックが壊れてしまいます。順序に関係なく、動きやキーの一意のグループをすべて見つける必要があるタスクの場合は、組み合わせの方が適切です。

パズルの最も困難な部分は、ロボット命令の深さ (開始) レベルを追跡するための適切でクリーンな方法を考えることでした。これに完全に注意を向けられるまでに少し時間がかかりました。

以上がCode Day の到来 キーパッドの難題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. C:曲線と使いやすさの学習 Python vs. C:曲線と使いやすさの学習 Apr 19, 2025 am 12:20 AM

Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

Pythonと時間:勉強時間を最大限に活用する Pythonと時間:勉強時間を最大限に活用する Apr 14, 2025 am 12:02 AM

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Python vs. C:パフォーマンスと効率の探索 Python vs. C:パフォーマンスと効率の探索 Apr 18, 2025 am 12:20 AM

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

Pythonの学習:2時間の毎日の研究で十分ですか? Pythonの学習:2時間の毎日の研究で十分ですか? Apr 18, 2025 am 12:22 AM

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

Python vs. C:重要な違​​いを理解します Python vs. C:重要な違​​いを理解します Apr 21, 2025 am 12:18 AM

PythonとCにはそれぞれ独自の利点があり、選択はプロジェクトの要件に基づいている必要があります。 1)Pythonは、簡潔な構文と動的タイピングのため、迅速な開発とデータ処理に適しています。 2)Cは、静的なタイピングと手動メモリ管理により、高性能およびシステムプログラミングに適しています。

Python Standard Libraryの一部はどれですか:リストまたは配列はどれですか? Python Standard Libraryの一部はどれですか:リストまたは配列はどれですか? Apr 27, 2025 am 12:03 AM

PythonListSarePartOfThestAndardarenot.liestareBuilting-in、versatile、forStoringCollectionsのpythonlistarepart。

Python:自動化、スクリプト、およびタスク管理 Python:自動化、スクリプト、およびタスク管理 Apr 16, 2025 am 12:14 AM

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

科学コンピューティングのためのPython:詳細な外観 科学コンピューティングのためのPython:詳細な外観 Apr 19, 2025 am 12:15 AM

科学コンピューティングにおけるPythonのアプリケーションには、データ分析、機械学習、数値シミュレーション、視覚化が含まれます。 1.numpyは、効率的な多次元配列と数学的関数を提供します。 2。ScipyはNumpy機能を拡張し、最適化と線形代数ツールを提供します。 3. Pandasは、データ処理と分析に使用されます。 4.matplotlibは、さまざまなグラフと視覚的な結果を生成するために使用されます。

See all articles