KotlinらしいAdvent of Codeパズル
Advent of Code は、12月1日から12月25日まで毎日、ホリデーをテーマにしたパズルが公開される毎年恒例の12月のイベントです。Advent of Code の作成者である Eric Wastl 氏の許可を得て、これらのパズルを Kotlin のイディオム的なスタイルで解決する方法を紹介します。
Get ready for Advent of Code
Kotlin で Advent of Code の課題を解決するための基本的なヒントをご紹介します。
- この GitHub テンプレート を使用してプロジェクトを作成します。
- Kotlin Developer Advocate、Sebastian Aigner によるウェルカムビデオをご覧ください。
Advent of Code 2022
Day 1: Calorie counting
Kotlin Advent of Code template と、Kotlin での文字列とコレクションの操作に便利な関数、
たとえば maxOf()
や sumOf()
などについて学びます。
拡張関数が、ソリューションを適切な方法で構成するのにどのように役立つかを見てみましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 1 | Kotlin
Day 2: Rock paper scissors
Kotlin の Char
型の操作を理解し、Pair
型と to
コンストラクターがパターンマッチングとうまく連携する方法を見てみましょう。
compareTo()
関数を使用して、独自のオブジェクトを並べ替える方法を理解しましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 2 | Kotlin
Day 3: Rucksack reorganization
kotlinx.benchmark ライブラリが、コードのパフォーマンス特性を理解するのにどのように役立つかを学びましょう。
intersect
のような集合演算が、重複するデータの選択にどのように役立つかを確認し、
同じソリューションのさまざまな実装間のパフォーマンス比較を見てみましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 3 | Kotlin
Day 4: Camp cleanup
infix
関数と operator
関数がコードをより表現力豊かにする方法、
および String
型と IntRange
型の拡張関数が入力の解析を容易にする方法を見てみましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 4 | Kotlin
Day 5: Supply stacks
ファクトリー関数を使用してより複雑なオブジェクトを構築する方法、
正規表現の使用方法、および両端 ArrayDeque
型について学びましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 5 | Kotlin
Day 6: Tuning trouble
kotlinx.benchmark ライブラリを使用した、より詳細なパフォーマンス調査をご覧ください。 同じソリューションの 16 種類のバリエーションの特性を比較します。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 6 | Kotlin
Day 7: No space left on device
ツリー構造をモデル化する方法を学び、プログラムで Kotlin コードを生成するデモをご覧ください。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 7 | Kotlin
Day 8: Treetop tree house
動作中の sequence
ビルダーをご覧ください。
また、プログラムの最初のドラフトとイディオム的な Kotlin ソリューションがどれだけ異なるかを見てみましょう(スペシャルゲスト Roman Elizarov!)。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 8 | Kotlin
Day 9: Rope bridge
run
関数、ラベル付きの戻り値、および coerceIn
や zipWithNext
のような便利な標準ライブラリ関数を見てみましょう。
List
コンストラクターと MutableList
コンストラクターを使用して、指定されたサイズのリストを構築する方法を見てみましょう。
また、問題文の Kotlin ベースの視覚化を垣間見ることができます。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 9 | Kotlin
Day 10: Cathode-ray tube
範囲と in
演算子が範囲のチェックを自然にする方法、
関数パラメーターを受信機に変える方法、および tailrec
修飾子の簡単な調査について学びましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 10 | Kotlin
Day 11: Monkey in the middle
可変の 命令型コードから、不変および読み取り専用のデータ構造を利用する、より関数的なアプローチに移行する方法を見てみましょう。 コンテキストレシーバー、およびゲストが Advent of Code 専用に独自の視覚化ライブラリを構築した方法について学びましょう。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 11 | Kotlin
Day 12: Hill Climbing algorithm
Kotlin でキュー、ArrayDeque
、関数参照、および tailrec
修飾子を使用して、パス検索の問題を解決します。
- Advent of Code でパズルの説明をお読みください
- ビデオでソリューションをチェックしてください。
Advent of Code 2022 Day 12 | Kotlin
Advent of Code 2021
Advent of Code 2021 に関するブログ投稿 をお読みください。
Day 1: Sonar sweep
windowed 関数と count 関数を適用して、整数のペアとトリプレットを操作します。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Anton Arhipov からソリューションを確認してください またはビデオをご覧ください。
Advent of Code 2021 in Kotlin, Day 1: Sonar Sweep
Day 2: Dive!
デストラクチャリング宣言と when
式について学びます。
- Advent of Code でパズルの説明をお読みください
- GitHub で Pasha Finkelshteyn からソリューションを確認してください またはビデオをご覧ください。
Advent of Code 2021 in Kotlin, Day 2: Dive!
Day 3: Binary diagnostic
2 進数を操作するさまざまな方法を探ります。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Sebastian Aigner からソリューションを確認してください またはビデオをご覧ください。
Advent of Code 2021 in Kotlin, Day 3: Binary Diagnostic
Day 4: Giant squid
入力を解析し、より便利な処理のためにいくつかのドメインクラスを導入する方法を学びます。
- Advent of Code でパズルの説明をお読みください
- GitHub で Anton Arhipov からソリューションを確認してください またはビデオをご覧ください。
Advent of Code 2021 in Kotlin, Day 4: Giant Squid
Advent of Code 2020
GitHub リポジトリ で Advent of Code 2020 パズルのすべてのソリューションを見つけることができます。
Day 1: Report repair
入力の処理、リストの反復処理、マップを作成するさまざまな方法、およびコードを簡素化するための let
関数について学習します。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Svetlana Isakova からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin With the Kotlin Team: Advent of Code 2020 #1
Day 2: Password philosophy
文字列ユーティリティ関数、正規表現、コレクションの操作、および式を変換するのに let
関数がどのように役立つかについて学習します。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Svetlana Isakova からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with The Kotlin Team: Advent of Code 2020 #2
Day 3: Toboggan trajectory
命令型コードスタイルとより関数的なコードスタイルを比較し、ペアと reduce()
関数を操作し、列選択モードでコードを編集し、整数のオーバーフローを修正します。
- Advent of Code でパズルの説明をお読みください
- GitHub で Mikhail Dvorkin からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #3
Day 4: Passport processing
when
式を適用し、入力を検証するさまざまな方法を探ります。
ユーティリティ関数、範囲の操作、セットメンバーシップのチェック、および特定の正規表現との照合。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Sebastian Aigner からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #4
Day 5: Binary boarding
Kotlin 標準ライブラリ関数(replace()
、toInt()
、find()
)を使用して、数値の 2 進数表現を操作し、
強力なローカル関数を探り、Kotlin 1.5 で max()
関数を使用する方法を学びます。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Svetlana Isakova からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #5
Day 6: Custom customs
標準ライブラリ関数 (map()
、reduce()
、sumOf()
、intersect()
、および union()
) を使用して、文字列とコレクション内の文字をグループ化およびカウントする方法を学びます。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Anton Arhipov からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #6
Day 7: Handy haversacks
正規表現の使用方法、マップ内の値の動的な計算のために Kotlin から Java の compute()
メソッドを HashMap で使用する方法、
forEachLine()
関数を使用してファイルを読み取る方法を学び、2 種類の検索アルゴリズムを比較します。
深さ優先と幅優先。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Pasha Finkelshteyn からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #7
Day 8: Handheld halting
シールドクラスとラムダを適用して命令を表し、Kotlin セットを適用してプログラムの実行でループを発見し、
シーケンスと sequence { }
ビルダー関数を使用して遅延コレクションを構築し、実験的な
measureTimedValue()
関数を試して、パフォーマンスメトリクスを確認します。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Sebastian Aigner からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #8
Day 9: Encoding error
any()
、firstOrNull()
、firstNotNullOfOrNull()
、windowed()
、takeIf()
、およびscan()
関数を使用して、Kotlin でリストを操作するさまざまな方法を調べます。これらは、Kotlin のイディオム的なスタイルを示しています。
- Advent of Code でパズルの説明をお読みください
- Kotlin Blog で Svetlana Isakova からソリューションを確認してください またはビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #9
What's next?
- Kotlin Koans でより多くのタスクを完了する
- JetBrains Academy の無料 Kotlin Core track で動作するアプリケーションを作成する