Idiomatic 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
Advent of Code 2021に関するブログ投稿をご覧ください。
Day 1: ソナー掃引
windowed
関数とcount
関数を適用して、整数のペアとトリプレットを扱います。
- Advent of Codeでパズルの説明を読む
- Anton ArhipovによるソリューションをKotlin Blogで確認するか、ビデオをご覧ください。
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 Blogで確認するか、ビデオをご覧ください。
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
Advent of Code 2020のすべてのソリューションは、GitHubリポジトリで見つけることができます。
Day 1: レポートの修復
入力処理、リストのイテレーション、マップを構築するさまざまな方法、そしてコードを簡素化するためのlet
関数の使用法を探ります。
- Advent of Codeでパズルの説明を読む
- Svetlana IsakovaによるソリューションをKotlin Blogで確認するか、ビデオをご覧ください。
Learn Kotlin With the Kotlin Team: Advent of Code 2020 #1
Day 2: パスワード哲学
文字列ユーティリティ関数、正規表現、コレクションに対する操作、そしてlet
関数が式を変換するのにいかに役立つかを探ります。
- Advent of Codeでパズルの説明を読む
- Svetlana IsakovaによるソリューションをKotlin Blogで確認するか、ビデオをご覧ください。
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 Blogで確認するか、ビデオをご覧ください。
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 Blogで確認するか、ビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #5
Day 6: カスタム税関
標準ライブラリ関数(map()
、reduce()
、sumOf()
、intersect()
、union()
)を使用して、文字列とコレクション内の文字をグループ化して数える方法を学びます。
- Advent of Codeでパズルの説明を読む
- Anton ArhipovによるソリューションをKotlin Blogで確認するか、ビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #6
Day 7: 便利な背負い袋
正規表現の使用方法、マップ内の値を動的に計算するためのKotlinからJavaのHashMapのcompute()
メソッドの使用方法、ファイルを読み込むためのforEachLine()
関数の使用方法、そして2種類の探索アルゴリズム(深さ優先と幅優先)の比較を学びます。
- Advent of Codeでパズルの説明を読む
- Pasha FinkelshteynによるソリューションをKotlin Blogで確認するか、ビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #7
Day 8: ハンドヘルドの停止
命令を表現するためにsealedクラスとラムダを適用し、プログラム実行中のループを発見するためにKotlinセットを適用し、遅延コレクションを構築するためにシーケンスとsequence { }
ビルダー関数を使用し、パフォーマンスメトリクスを確認するために実験的なmeasureTimedValue()
関数を試します。
- Advent of Codeでパズルの説明を読む
- Sebastian AignerによるソリューションをKotlin Blogで確認するか、ビデオをご覧ください。
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 Blogで確認するか、ビデオをご覧ください。
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #9
次は何をしますか?
- Kotlin Koansでさらに多くのタスクを完了する
- JetBrains Academyが提供する無料のKotlin Coreトラックで動作するアプリケーションを作成する