Skip to content

使用慣用的 Kotlin 解決 Advent of Code 謎題

Advent of Code 是一個每年十二月舉辦的活動,從十二月一日到十二月二十五日,每天都會發布節日主題的謎題。經由 Advent of Code 創作者 Eric Wastl 的許可,我們將展示如何使用慣用的 Kotlin 風格來解決這些謎題:

為 Advent of Code 做準備

我們將帶你了解如何快速開始使用 Kotlin 解決 Advent of Code 挑戰的基本技巧:

  • 使用 這個 GitHub 範本 建立專案
  • 觀看 Kotlin 開發者宣傳大使 Sebastian Aigner 的歡迎影片:

Advent of Code 2022

第 1 天:卡路里計算

了解 Kotlin Advent of Code 範本 以及在 Kotlin 中處理字串和集合的便利函數,例如 maxOf()sumOf()。了解擴充函數如何協助你以優雅的方式組織你的解決方案。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 1 | Kotlin

第 2 天:剪刀石頭布

了解 Kotlin 中 Char 類型的操作,並查看 Pair 類型和 to 建構器如何與模式匹配良好配合。了解如何使用 compareTo() 函數對自己的物件進行排序。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 2 | Kotlin

第 3 天:背包重組

了解 kotlinx.benchmark 函式庫如何協助你理解程式碼的性能特徵。了解 intersect 等集合操作如何協助你選擇重疊資料,並查看同一解決方案不同實作之間的性能比較。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 3 | Kotlin

第 4 天:營地清理

了解 infixoperator 函數如何讓你的程式碼更具表達力,以及 StringIntRange 類型的擴充函數如何輕鬆解析輸入。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 4 | Kotlin

第 5 天:供應堆疊

了解如何使用工廠函數建構更複雜的物件,如何使用正規表達式,以及雙端 ArrayDeque 類型。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 5 | Kotlin

第 6 天:調諧問題

透過 kotlinx.benchmark 函式庫進行更深入的性能調查,比較同一解決方案的 16 種不同變體的特性。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 6 | Kotlin

第 7 天:裝置上沒有空間

了解如何建模樹狀結構,並觀看以程式碼方式生成 Kotlin 程式碼的示範。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 7 | Kotlin

第 8 天:樹屋

了解 sequence 建構器如何運作,以及程式初稿與慣用的 Kotlin 解決方案之間可能有多大的差異(特邀嘉賓 Roman Elizarov!)。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 8 | Kotlin

第 9 天:繩索橋

了解 run 函數、標籤回傳,以及 coerceInzipWithNext 等便利的標準函式庫函數。了解如何使用 ListMutableList 建構器建立指定大小的列表,並初步了解基於 Kotlin 的問題陳述視覺化。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 9 | Kotlin

第 10 天:陰極射線管

了解範圍和 in 運算符如何使檢查範圍變得自然,函數參數如何可以轉換為接收者,以及對 tailrec 修飾符的簡要探索。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 10 | Kotlin

第 11 天:中間的猴子

了解如何從可變、命令式程式碼轉向更函數式的方法,該方法利用不可變和只讀資料結構。了解上下文接收者,以及我們的嘉賓如何專為 Advent of Code 建立自己的視覺化函式庫。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 11 | Kotlin

第 12 天:爬山演算法

使用佇列、ArrayDeque、函數引用和 tailrec 修飾符來解決 Kotlin 中的路徑尋找問題。

  • 閱讀 Advent of Code 上的謎題描述
  • 觀看影片中的解決方案:

YouTube Advent of Code 2022 Day 12 | Kotlin

Advent of Code 2021

閱讀我們關於 Advent of Code 2021 的部落格文章

第 1 天:聲納掃描

應用視窗化 (windowed) 和計數 (count) 函數來處理整數的配對和三元組。

YouTube Advent of Code 2021 in Kotlin, Day 1: Sonar Sweep

第 2 天:潛水!

了解解構宣告和 when 表達式。

  • 閱讀 Advent of Code 上的謎題描述
  • GitHub 上查看 Pasha Finkelshteyn 的解決方案或觀看影片:

YouTube Advent of Code 2021 in Kotlin, Day 2: Dive!

第 3 天:二進位診斷

探索處理二進位數的不同方法。

YouTube Advent of Code 2021 in Kotlin, Day 3: Binary Diagnostic

第 4 天:巨型魷魚

了解如何解析輸入並引入一些領域類別以便更方便地處理。

  • 閱讀 Advent of Code 上的謎題描述
  • GitHub 上查看 Anton Arhipov 的解決方案或觀看影片:

YouTube Advent of Code 2021 in Kotlin, Day 4: Giant Squid

Advent of Code 2020

你可以在我們的 GitHub 儲存庫 中找到所有 Advent of Code 2020 謎題的解決方案。

第 1 天:報告修復

探索輸入處理、迭代列表、建立映射的不同方法,以及使用 let 函數來簡化你的程式碼。

YouTube Learn Kotlin With the Kotlin Team: Advent of Code 2020 #1

第 2 天:密碼哲學

探索字串工具函數、正規表達式、集合操作,以及 let 函數如何有助於轉換你的表達式。

YouTube Learn Kotlin with The Kotlin Team: Advent of Code 2020 #2

第 3 天:雪橇軌跡

比較命令式和更函數式的程式碼風格,使用配對和 reduce() 函數,在列選模式下編輯程式碼,並修復整數溢位問題。

  • 閱讀 Advent of Code 上的謎題描述
  • GitHub 上查看 Mikhail Dvorkin 的解決方案或觀看影片:

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #3

第 4 天:護照處理

應用 when 表達式並探索驗證輸入的不同方法:工具函數、處理範圍、檢查集合成員資格以及匹配特定的正規表達式。

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #4

第 5 天:二進位登機

使用 Kotlin 標準函式庫函數(replace()toInt()find())來處理數字的二進位表示,探索強大的局部函數,並了解如何在 Kotlin 1.5 中使用 max() 函數。

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #5

第 6 天:自訂海關

了解如何使用標準函式庫函數:map()reduce()sumOf()intersect()union() 在字串和集合中對字元進行分組和計數。

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #6

第 7 天:方便的行囊

了解如何使用正規表達式,如何從 Kotlin 使用 Java 的 compute() 方法來對 HashMap 中的值進行動態計算,使用 forEachLine() 函數讀取檔案,並比較兩種搜尋演算法:深度優先 (depth-first) 和廣度優先 (breadth-first)。

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #7

第 8 天:手持裝置停止

應用密封類別 (sealed classes) 和 Lambda 表達式 (lambdas) 來表示指令,應用 Kotlin 集合來發現在程式執行中的迴圈,使用序列 (sequences) 和 sequence { } 建構器函數來建構惰性集合,並嘗試實驗性的 measureTimedValue() 函數來檢查性能指標。

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #8

第 9 天:編碼錯誤

探索在 Kotlin 中使用 any()firstOrNull()firstNotNullOfOrNull()windowed()takeIf()scan() 函數操作列表的不同方法,這些函數體現了慣用的 Kotlin 風格。

YouTube Learn Kotlin with the Kotlin Team: Advent of Code 2020 #9

接下來呢?