Edit Page

使用 Kotlin 惯用法的 Advent of Code

最终更新: 2024/03/21

Advent of Code 是每年 12 月举办一次的活动, 从 12 月 1 日开始到 25 日, 每天发布一道节日主题的谜题. 经 Advent of Code 创建者 Eric Wastl 授权, 我们演示如何使用 Kotlin 风格的惯用法来解决这些谜题:

准备进入 Advent of Code

我们会讲解使用 Kotlin 解决 Advent of Code 问题的基本技巧:

Advent of Code 2022

第 1 天: Calorie counting

学习 Kotlin Advent of Code 模板, 以及在 Kotlin 中处理字符串和集合的便利函数, 例如 maxOf()sumOf(). 了解扩展函数如何帮助你以更好的方式构建解决方案.

YouTube Advent of Code 2022, 第 1 天 | Kotlin

第 2 天: Rock paper scissors

理解 Kotlin 中对 Char 类型的操作 , 了解在模式匹配中如何使用 Pair 类型和 to 构造器. 理解如何使用 compareTo() 函数对你自己的对象排序.

YouTube Advent of Code 2022, 第 2 天 | Kotlin

第 3 天: Rucksack reorganization

学习 kotlinx.benchmark 库如何帮助你理解你的代码的性能特性. 了解 intersect 等 Set 操作如何帮助你选择重叠的数据, 查看同一解决方案的不同具体实现之间的性能比较.

YouTube Advent of Code 2022, 第 3 天 | Kotlin

第 4 天: Camp cleanup

infixoperator 函数如何提升你的代码的表现能力, 以及 StringIntRange 类型的扩展函数如何简化输入解析的工作.

YouTube Advent of Code 2022, 第 4 天 | Kotlin

第 5 天: Supply stacks

了解如何使用工厂函数构建更加复杂的对象, 如何使用正规表达式, 以及双向的(Double-Ended) ArrayDeque 类型.

YouTube Advent of Code 2022, 第 5 天 | Kotlin

第 6 天: Tuning trouble

查看如何使用 kotlinx.benchmark 库进行更加深入的性能调查, 比较同一个解决方案的16种不同的遍体的性能特性.

YouTube Advent of Code 2022, 第 6 天 | Kotlin

第 7 天: No space left on device

学习如何构建树结构模型, 查看一个示例程序, 演示如何通过编程方式生成 Kotlin 代码.

YouTube Advent of Code 2022, 第 7 天 | Kotlin

第 8 天: Treetop tree house

学习 sequence 构建器的实际使用, 以及一个程序最初的草稿和符合 Kotlin 惯用法的解决方案之间能有多大的差异 (和特邀嘉宾 Roman Elizarov 一起!).

YouTube Advent of Code 2022, 第 8 天 | Kotlin

第 9 天: Rope bridge

学习 run 函数, 带标签的返回(Labeled Return), 以及便利的标准库函数, 例如 coerceIn, 或 zipWithNext. 学习如何使用 ListMutableList 构建器构建指定大小的 List, 查看这个题目基于 Kotlin 的可视化.

YouTube Advent of Code 2022, 第 9 天 | Kotlin

第 10 天: Cathode-ray tube

学习值范围和 in 操作符如何让数值范围的检查变得更加自然, 如何将函数参数转换为接受者, 简要的探索 tailrec 修饰符.

YouTube Advent of Code 2022, 第 10 天 | Kotlin

第 11 天: Monkey in the middle

学习如何从可变的、命令式(imperative)的代码转变为更加函数式的方案, 这种方案使用不可变的、只读的数据结构. 学习上下文接受者(Context Receiver), 以及我们的嘉宾如何为 Advent of Code 构建他自己的可视化库.

YouTube Advent of Code 2022, 第 11 天 | Kotlin

第 12 天: Hill Climbing algorithm

使用队列, ArrayDeque, 函数引用, 以及 tailrec 修饰符, 用 Kotlin 解决路径寻找问题.

YouTube Advent of Code 2022, 第 12 天 | Kotlin

Advent of Code 2021

阅读我们的 关于 Advent of Code 2021 的 Blog

第 1 天: Sonar sweep

使用窗口和计数函数, 来处理整数的对(Pair)和三元组(Triplet).

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

第 2 天: Dive!

学习解构声明和 when 表达式.

  • Advent of Code 阅读题目内容
  • GitHub 查看 Pasha Finkelshteyn 的解答, 或观看这个视频:

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

第 3 天: Binary diagnostic

学习处理二进制数值的不同方式.

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

第 4 天: Giant squid

学习如何解析输入, 介绍用于更加便利的处理的一些领域类(Domain Class).

  • Advent of Code 阅读题目内容
  • GitHub 查看 Anton Arhipov 的解答, 或观看这个视频:

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

Advent of Code 2020

你可以在我们的 GitHub 代码仓库 找到Advent of Code 2020 谜题的所有解答.

第 1 天: Report repair

学习输入处理, 遍历列表, 通过不同的方法构建 Map, 使用 let 函数简化你的代码.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #1

第 2 天: Password philosophy

学习字符串工具函数, 正规表达式, 集合上的操作, 以及如何使用 let 函数变换你的表达式.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #2

第 3 天: Toboggan trajectory

比较命令式编程与函数式编程风格, 使用 pair 和 reduce() 函数, 在列选择模式(Column Selection Mode)下编辑代码, 修正整数溢出问题.

  • Advent of Code 阅读题目内容
  • GitHub 查看 Mikhail Dvorkin 的解答, 或观看这个视频:

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #3

第 4 天: Passport processing

使用 when 表达式, 学习如何进行输入校验: 工具函数, 使用数值范围, 检查成员是否属于集合, 匹配特定的正规表达式.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #4

第 5 天: Binary boarding

使用 Kotlin 标准库函数 (replace(), toInt(), find()) 处理数值的二进制表达, 学习强大的局部函数, 学习如何使用 Kotlin 1.5 的 max() 函数.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #5

第 6 天: Custom customs

学习如何分组并统计字符串和集合中的字符, 使用标准库函数: map(), reduce(), sumOf(), intersect(), 和 union().

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #6

第 7 天: Handy haversacks

学习如何使用正规表达式, 在 Kotlin 代码中 使用 Java 的 HashMap 的 compute() 方法, 动态计算 Map 中的值, 使用 forEachLine() 函数读取文件, 比较两种查找算法: 深度优先查找和广度优先查找.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #7

第 8 天: Handheld halting

使用封闭类和 Lambda 表达式来表达指令, 使用 Kotlin Set 在程序执行中查找循环, 使用序列和 sequence { } 构建函数, 创建延迟计算的集合, 试验试验性的 measureTimedValue() 函数来检查性能统计指标.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #8

第 9 天: Encoding error

学习 Kotlin 中的不同方式操纵 List, 使用 any(), firstOrNull(), firstNotNullOfOrNull(), windowed(), takeIf(), 和 scan() 函数, 这些函数是 Kotlin 编程风格的典型例子.

YouTube 和 Kotlin Team 一起学习 Kotlin: Advent of Code 2020 #9

下一步做什么?