用地道的 Kotlin 风格解决 Advent of Code 谜题
Advent of Code 是一项每年十二月举行的活动,每年 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
第 1 天:卡路里计数
了解 Kotlin Advent of Code 模板以及 Kotlin 中用于处理字符串和集合的便捷函数,例如 maxOf()
和 sumOf()
。了解扩展函数如何帮助你以良好的方式组织解决方案。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 1 | Kotlin
第 2 天:石头剪刀布
了解 Kotlin 中 Char
类型的操作,了解 Pair
类型和 to
构造函数如何与模式匹配很好地协同工作。了解如何使用 compareTo()
函数对自己的对象进行排序。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 2 | Kotlin
第 3 天:背包整理
了解 kotlinx.benchmark 库如何帮助你理解代码的性能特性。了解 intersect 等集合操作如何帮助你选择重叠数据,并查看同一解决方案不同实现之间的性能比较。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 3 | Kotlin
第 4 天:营地清理
了解中缀函数和操作符函数如何使你的代码更具表现力,以及 String
和 IntRange
类型的扩展函数如何轻松解析输入。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 4 | Kotlin
第 5 天:补给堆栈
了解如何使用工厂函数构建更复杂的对象、如何使用正则表达式以及双端 ArrayDeque
类型。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 5 | Kotlin
第 6 天:调谐器故障
通过 kotlinx.benchmark 库进行更深入的性能研究,比较同一解决方案的 16 种不同变体的特性。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 6 | Kotlin
第 7 天:设备无剩余空间
了解如何建模树结构,并观看以编程方式生成 Kotlin 代码的演示。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 7 | Kotlin
第 8 天:树屋
了解 sequence
构建器的实际应用,以及程序的初稿和地道的 Kotlin 解决方案之间可能有多大差异(特邀嘉宾 Roman Elizarov!)。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 8 | Kotlin
第 9 天:绳桥
了解 run
函数、标签返回,以及 coerceIn
或 zipWithNext
等便捷的标准库函数。了解如何使用 List
和 MutableList
构造函数构建给定大小的 list
,并预览基于 Kotlin 的问题陈述可视化。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 9 | Kotlin
第 10 天:阴极射线管
了解区间和 in
操作符如何使区间检测变得自然,函数形参如何变为接收者,以及对 tailrec
修饰符的简要探查。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 10 | Kotlin
第 11 天:中间的猴子
了解如何从可变、命令式代码转向更函数式的方法,该方法利用不可变和只读数据结构。了解上下文接收者,以及我们的嘉宾如何专为 Advent of Code 构建他自己的可视化库。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 11 | Kotlin
第 12 天:爬山算法
使用队列、ArrayDeque
、函数引用和 tailrec
修饰符,用 Kotlin 解决寻路问题。
- 在 Advent of Code 上阅读谜题描述
- 观看视频中的解决方案:
Advent of Code 2022 Day 12 | Kotlin
Advent of Code 2021
阅读我们关于 Advent of Code 2021 的博客文章
第 1 天:声纳扫描
应用 windowed
和 count
函数来处理整数对和整数三元组。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Anton Arhipov 在 Kotlin 博客 上的解决方案,或观看视频:
Advent of Code 2021 in Kotlin, Day 1: Sonar Sweep
第 2 天:潜水!
了解解构声明和 when
表达式。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Pasha Finkelshteyn 在 GitHub 上的解决方案,或观看视频:
Advent of Code 2021 in Kotlin, Day 2: Dive!
第 3 天:二进制诊断
探索处理二进制数的不同方式。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Sebastian Aigner 在 Kotlin 博客 上的解决方案,或观看视频:
Advent of Code 2021 in Kotlin, Day 3: Binary Diagnostic
第 4 天:巨型鱿鱼
了解如何解析输入并引入一些领域类以进行更便捷的处理。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Anton Arhipov 在 GitHub 上的解决方案,或观看视频:
Advent of Code 2021 in Kotlin, Day 4: Giant Squid
Advent of Code 2020
你可以在我们的 GitHub 版本库 中找到 Advent of Code 2020 谜题的所有解决方案。
第 1 天:报告修复
探索输入处理、遍历 list
、构建 map
的不同方式,以及使用 let
函数来简化你的代码。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Svetlana Isakova 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin With the Kotlin Team: Advent of Code 2020 #1
第 2 天:密码哲学
探索字符串工具函数、正则表达式、集合操作,以及 let
函数如何有助于转换你的表达式。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Svetlana Isakova 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin with The Kotlin Team: Advent of Code 2020 #2
第 3 天:雪橇轨迹
比较命令式和更函数式的代码风格,处理 pair
和 reduce()
函数,在列选择模式下编辑代码,并修复整数溢出。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Mikhail Dvorkin 在 GitHub 上的解决方案,或观看视频:
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #3
第 4 天:护照处理
应用 when
表达式并探索验证输入的不同方式:工具函数、处理区间、检测集合成员资格以及匹配特定的正则表达式。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Sebastian Aigner 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #4
第 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
第 6 天:自定义海关
了解如何使用标准库函数:map()
、reduce()
、sumOf()
、intersect()
和 union()
在字符串和集合中分组和计数字符。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Anton Arhipov 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #6
第 7 天:便携手提包
了解如何使用正则表达式,如何在 Kotlin 中使用 Java 的 HashMaps
的 compute()
方法动态计算 map
中的值,使用 forEachLine()
函数读取文件,以及比较两种搜索算法:深度优先和广度优先。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Pasha Finkelshteyn 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #7
第 8 天:手持设备暂停
应用密封类和 lambda 表达式来表示指令,应用 Kotlin set
来发现程序执行中的循环,使用 sequences
和 sequence { }
构建器函数来构建惰性集合,并尝试实验性的 measureTimedValue()
函数来检测性能指标。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Sebastian Aigner 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #8
第 9 天:编码错误
探索在 Kotlin 中操作 list
的不同方式,使用 any()
、firstOrNull()
、firstNotNullOfOrNull()
、windowed()
、takeIf()
和 scan()
函数,这些都示例了地道的 Kotlin 风格。
- 在 Advent of Code 上阅读谜题描述
- 查阅 Svetlana Isakova 在 Kotlin 博客 上的解决方案,或观看视频:
Learn Kotlin with the Kotlin Team: Advent of Code 2020 #9
接下来是什么?
- 完成更多 Kotlin 心印 任务
- 通过 JetBrains Academy 的免费 Kotlin 核心学习路径 创建可运行的应用程序