使用 Kotlin 惯用法的 Advent of Code
Advent of Code 是每年 12 月举办一次的活动, 从 12 月 1 日开始到 25 日, 每天发布一道节日主题的谜题. 经 Advent of Code 创建者 Eric Wastl 授权, 我们演示如何使用 Kotlin 风格的惯用法来解决这些谜题:
准备进入 Advent of Code
我们会讲解使用 Kotlin 解决 Advent of Code 问题的基本技巧:
使用 这个 GitHub 模板 来创建项目
观看 Kotlin Developer Advocate, Sebastian Aigner 的入门视频:
Advent of Code 2022
第 1 天: Calorie counting
学习 Kotlin Advent of Code 模板, 以及在 Kotlin 中处理字符串和集合的便利函数, 例如 maxOf()
和 sumOf()
. 了解扩展函数如何帮助你以更好的方式构建解决方案.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 2 天: Rock paper scissors
理解 Kotlin 中对 Char
类型的操作 , 了解在模式匹配中如何使用 Pair
类型和 to
构造器. 理解如何使用 compareTo()
函数对你自己的对象排序.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 3 天: Rucksack reorganization
学习 kotlinx.benchmark 库如何帮助你理解你的代码的性能特性. 了解 intersect
等 Set 操作如何帮助你选择重叠的数据, 查看同一解决方案的不同具体实现之间的性能比较.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 4 天: Camp cleanup
infix
和 operator
函数如何提升你的代码的表现能力, 以及 String
和 IntRange
类型的扩展函数如何简化输入解析的工作.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 5 天: Supply stacks
了解如何使用工厂函数构建更加复杂的对象, 如何使用正规表达式, 以及双向的(Double-Ended) ArrayDeque
类型.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 6 天: Tuning trouble
查看如何使用 kotlinx.benchmark 库进行更加深入的性能调查, 比较同一个解决方案的16种不同的遍体的性能特性.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 7 天: No space left on device
学习如何构建树结构模型, 查看一个示例程序, 演示如何通过编程方式生成 Kotlin 代码.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 8 天: Treetop tree house
学习 sequence
构建器的实际使用, 以及一个程序最初的草稿和符合 Kotlin 惯用法的解决方案之间能有多大的差异 (和特邀嘉宾 Roman Elizarov 一起!).
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 9 天: Rope bridge
学习 run
函数, 带标签的返回(Labeled Return), 以及便利的标准库函数, 例如 coerceIn
, 或 zipWithNext
. 学习如何使用 List
和 MutableList
构建器构建指定大小的 List, 查看这个题目基于 Kotlin 的可视化.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 10 天: Cathode-ray tube
学习值范围和 in
操作符如何让数值范围的检查变得更加自然, 如何将函数参数转换为接受者, 简要的探索 tailrec
修饰符.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 11 天: Monkey in the middle
学习如何从可变的、命令式(imperative)的代码转变为更加函数式的方案, 这种方案使用不可变的、只读的数据结构. 学习上下文接受者(Context Receiver), 以及我们的嘉宾如何为 Advent of Code 构建他自己的可视化库.
在 Advent of Code 阅读题目内容
观看视频中的解答:
第 12 天: Hill Climbing algorithm
使用队列, ArrayDeque
, 函数引用, 以及 tailrec
修饰符, 用 Kotlin 解决路径寻找问题.
在 Advent of Code 阅读题目内容
观看视频中的解答:
Advent of Code 2021
第 1 天: Sonar sweep
使用窗口和计数函数, 来处理整数的对(Pair)和三元组(Triplet).
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Anton Arhipov 的解答, 或观看这个视频:
第 2 天: Dive!
学习解构声明和 when
表达式.
在 Advent of Code 阅读题目内容
在 GitHub 查看 Pasha Finkelshteyn 的解答, 或观看这个视频:
第 3 天: Binary diagnostic
学习处理二进制数值的不同方式.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Sebastian Aigner 的解答, 或观看这个视频:
第 4 天: Giant squid
学习如何解析输入, 介绍用于更加便利的处理的一些领域类(Domain Class).
在 Advent of Code 阅读题目内容
在 GitHub 查看 Anton Arhipov 的解答, 或观看这个视频:
Advent of Code 2020
第 1 天: Report repair
学习输入处理, 遍历列表, 通过不同的方法构建 Map, 使用 let
函数简化你的代码.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Svetlana Isakova 的解答, 或观看这个视频:
第 2 天: Password philosophy
学习字符串工具函数, 正规表达式, 集合上的操作, 以及如何使用 let
函数变换你的表达式.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Svetlana Isakova 的解答, 或观看这个视频:
第 3 天: Toboggan trajectory
比较命令式编程与函数式编程风格, 使用 pair 和 reduce()
函数, 在列选择模式(Column Selection Mode)下编辑代码, 修正整数溢出问题.
在 Advent of Code 阅读题目内容
在 GitHub 查看 Mikhail Dvorkin 的解答, 或观看这个视频:
第 4 天: Passport processing
使用 when
表达式, 学习如何进行输入校验: 工具函数, 使用数值范围, 检查成员是否属于集合, 匹配特定的正规表达式.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Sebastian Aigner 的解答, 或观看这个视频:
第 5 天: Binary boarding
使用 Kotlin 标准库函数 (replace()
, toInt()
, find()
) 处理数值的二进制表达, 学习强大的局部函数, 学习如何使用 Kotlin 1.5 的 max()
函数.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Svetlana Isakova 的解答, 或观看这个视频:
第 6 天: Custom customs
学习如何分组并统计字符串和集合中的字符, 使用标准库函数: map()
, reduce()
, sumOf()
, intersect()
, 和 union()
.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Anton Arhipov 的解答, 或观看这个视频:
第 7 天: Handy haversacks
学习如何使用正规表达式, 在 Kotlin 代码中 使用 Java 的 HashMap 的 compute()
方法, 动态计算 Map 中的值, 使用 forEachLine()
函数读取文件, 比较两种查找算法: 深度优先查找和广度优先查找.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Pasha Finkelshteyn 的解答, 或观看这个视频:
第 8 天: Handheld halting
使用封闭类和 Lambda 表达式来表达指令, 使用 Kotlin Set 在程序执行中查找循环, 使用序列和 sequence { }
构建函数, 创建延迟计算的集合, 试验试验性的 measureTimedValue()
函数来检查性能统计指标.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Sebastian Aigner 的解答, 或观看这个视频:
第 9 天: Encoding error
学习 Kotlin 中的不同方式操纵 List, 使用 any()
, firstOrNull()
, firstNotNullOfOrNull()
, windowed()
, takeIf()
, 和 scan()
函数, 这些函数是 Kotlin 编程风格的典型例子.
在 Advent of Code 阅读题目内容
在 Kotlin Blog 查看 Svetlana Isakova 的解答, 或观看这个视频:
下一步做什么?
在 Kotlin Koans 中完成更多任务
通过 JetBrains Academy 的 Kotlin 核心教程 创建真实工作的应用程序