Kotlinのイディオムを使ったAdvent of Codeのパズル
Advent of Codeは毎年12月に開催されるイベントで、12月1日から12月25日まで毎日、ホリデーがテーマのパズルが公開されます。 Advent of Codeの作成者であるEric Wastl氏の許可を得て、Kotlinらしい書き方でこれらのパズルを解く方法をご紹介します。
Advent of Codeの準備をしよう
KotlinでAdvent of Codeの課題を解決するために、すぐに始められる基本的なヒントを紹介します。
- プロジェクトの作成にはこちらのGitHubテンプレートを使用する
- KotlinデベロッパーアドボケイトのSebastian Aignerによるウェルカムビデオをチェックする。
Advent of Code 2022
Day 1: カロリー計算
Kotlin Advent of Codeテンプレートと、Kotlinの文字列やコレクションを扱うための便利な関数(例: maxOf()
やsumOf()
)について学びます。 拡張関数がどのようにソリューションをきれいに構造化するのに役立つかを見てみましょう。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 1 | Kotlin
Day 2: じゃんけん
KotlinのChar
型に対する操作を理解し、Pair
型とto
コンストラクタがパターンマッチングとどのようにうまく機能するかを確認します。 独自のオブジェクトをcompareTo()
関数を使って順序付ける方法を理解します。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 2 | Kotlin
Day 3: リュックサック再編成
kotlinx.benchmarkライブラリがコードのパフォーマンス特性を理解するのにどのように役立つかを学びます。 また、intersect
のような集合演算が、重複するデータを選択するのにどのように役立つか、そして同じソリューションの異なる実装間でのパフォーマンス比較を見てみましょう。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 3 | Kotlin
Day 4: キャンプの片付け
infix
関数とoperator
関数がコードをより表現豊かにし、String
型とIntRange
型に対する拡張関数が入力のパースをいかに簡単にするかを見てみましょう。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 4 | Kotlin
Day 5: 荷物スタック
ファクトリ関数を使ったより複雑なオブジェクトの構築、正規表現の使用方法、そして両端キューであるArrayDeque
型について学びます。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 5 | Kotlin
Day 6: チューニングのトラブル
kotlinx.benchmarkライブラリを使った、より詳細なパフォーマンス調査を見てみましょう。同じソリューションの16種類の異なるバリエーションの特性を比較します。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 6 | Kotlin
Day 7: デバイスに空き容量なし
ツリー構造をモデル化する方法を学び、プログラムによるKotlinコード生成のデモを見てみましょう。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 7 | Kotlin
Day 8: ツリーハウス
sequence
ビルダーの動作と、プログラムの最初の草案とKotlinらしいソリューションがいかに異なるかを見てみましょう(スペシャルゲスト:Roman Elizarov!)。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 8 | Kotlin
Day 9: ロープの橋
run
関数、ラベル付きリターン、そしてcoerceIn
やzipWithNext
のような便利な標準ライブラリ関数を見てみましょう。 List
およびMutableList
コンストラクタを使って指定されたサイズのリストを構築する方法、そして問題文のKotlinベースの可視化を垣間見ることができます。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 9 | Kotlin
Day 10: 陰極線管
レンジとin
演算子がいかにレンジのチェックを自然にするか、関数パラメータがどのようにレシーバーに変換されるか、そしてtailrec
修飾子の簡単な探求について学びます。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 10 | Kotlin
Day 11: 真ん中の猿
可変で命令的なコードから、不変および読み取り専用のデータ構造を活用するより関数的なアプローチへ移行する方法を見てみましょう。 コンテキストレシーバーについて学び、私たちのゲストがAdvent of Codeのためだけに独自の可視化ライブラリを構築した方法について学びます。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 11 | Kotlin
Day 12: 丘登りアルゴリズム
キュー、ArrayDeque
、関数参照、およびtailrec
修飾子を使用して、Kotlinで経路探索問題を解決します。
- Advent of Codeでパズルの説明を読む
- ビデオでソリューションをチェックする。
Advent of Code 2022 Day 12 | Kotlin
Advent of Code 2021
Day 1: ソナースイープ
windowed関数とcount関数を適用して、整数のペアとトリプレットを扱います。
- Advent of Codeでパズルの説明を読む
- Anton ArhipovによるソリューションをKotlinブログで確認するか、ビデオを見る。
Advent of Code 2021 in Kotlin, Day 1: Sonar Sweep
Day 2: 潜水!
分割宣言とwhen
式について学びます。
- Advent of Codeでパズルの説明を読む
- Pasha FinkelshteynによるソリューションをGitHubで確認するか、ビデオを見る。
Advent of Code 2021 in Kotlin, Day 2: Dive!
Day 3: バイナリ診断
バイナリ数を扱うさまざまな方法を探ります。
- Advent of Codeでパズルの説明を読む
- Sebastian AignerによるソリューションをKotlinブログで確認するか、ビデオを見る。
Advent of Code 2021 in Kotlin, Day 3: Binary Diagnostic
Day 4: 巨大なイカ
入力をパースし、より便利な処理のためにドメインクラスを導入する方法を学びます。
- Advent of Codeでパズルの説明を読む
- Anton ArhipovによるソリューションをGitHubで確認するか、ビデオを見る。
Advent of Code 2021 in Kotlin, Day 4: Giant Squid
Advent of Code 2020
TIP
Advent of Code 2020のパズルのすべてのソリューションは、GitHubリポジトリにあります。
Day 1: レポートの修復
入力処理、リストの反復処理、マップを構築するさまざまな方法、そしてlet
関数を使ってコードを簡素化する方法を探ります。
- Advent of Codeでパズルの説明を読む
- Svetlana IsakovaによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin With the Kotlin Team: Advent of Code 2020 #1
Day 2: パスワードの哲学
文字列ユーティリティ関数、正規表現、コレクションに対する操作、そしてlet
関数が式を変換するのにどのように役立つかを探ります。
- Advent of Codeでパズルの説明を読む
- Svetlana IsakovaによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with The Kotlin Team: Advent of Code 2020 #2
Day 3: トボガンそり軌道
命令型とより関数的なコードスタイルを比較し、ペアとreduce()
関数を扱い、列選択モードでコードを編集し、整数オーバーフローを修正します。
- Advent of Codeでパズルの説明を読む
- Mikhail DvorkinによるソリューションをGitHubで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #3
Day 4: パスポート処理
when
式を適用し、入力を検証するさまざまな方法(ユーティリティ関数、レンジの操作、集合のメンバーシップのチェック、特定の正規表現のマッチング)を探ります。
- Advent of Codeでパズルの説明を読む
- Sebastian AignerによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #4
Day 5: バイナリ搭乗
Kotlin標準ライブラリ関数(replace()
、toInt()
、find()
)を使って数値のバイナリ表現を扱い、強力なローカル関数を探求し、Kotlin 1.5でmax()
関数を使う方法を学びます。
- Advent of Codeでパズルの説明を読む
- Svetlana IsakovaによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #5
Day 6: カスタム税関
標準ライブラリ関数であるmap()
、reduce()
、sumOf()
、intersect()
、union()
を使って、文字列やコレクション内の文字をグループ化し、数える方法を学びます。
- Advent of Codeでパズルの説明を読む
- Anton ArhipovによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #6
Day 7: 便利なリュックサック
正規表現の使用方法、マップ内の値を動的に計算するためにKotlinからJavaのcompute()
メソッドをHashMapに適用する方法、ファイルを読み込むためのforEachLine()
関数の使用方法、そして深さ優先探索と幅優先探索という2種類の探索アルゴリズムの比較について学びます。
- Advent of Codeでパズルの説明を読む
- Pasha FinkelshteynによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #7
Day 8: ハンドヘルドの停止
命令を表すためにシールクラスとラムダを適用し、プログラム実行におけるループを発見するためにKotlinのセットを適用し、シーケンスとsequence { }
ビルダー関数を使って遅延コレクションを構築し、実験的なmeasureTimedValue()
関数を試してパフォーマンスメトリクスをチェックします。
- Advent of Codeでパズルの説明を読む
- Sebastian AignerによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #8
Day 9: エンコードエラー
any()
、firstOrNull()
、firstNotNullOfOrNull()
、windowed()
、takeIf()
、scan()
関数を使ってKotlinでリストを操作するさまざまな方法を探ります。これらはKotlinらしい書き方を示しています。
- Advent of Codeでパズルの説明を読む
- Svetlana IsakovaによるソリューションをKotlinブログで確認するか、ビデオを見る。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #9
次のステップは?
- Kotlin Koansでさらに多くのタスクを完了する
- JetBrains Academyによる無料のKotlin Coreトラックで動作するアプリケーションを作成する