Advent Of Code 2022 第一天 - 计算卡路里

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

这个问题简单来说就是获取多个组的数字,找到其中最大的一个,part 2 同理找到最大的三个,非常简单的热身题。

第一部分

圣诞老人的驯鹿通常吃普通的驯鹿食物,但他们需要大量的神奇能量来在圣诞节送出礼物。为此,他们最喜欢的零食是一种特殊的⭐️果,只生长在丛林深处。精灵们每年都会带你到生长这种水果的小树林里探险。

为了提供足够的魔法能量,探险队需要在12月25日之前取回至少50颗星星⭐️。虽然精灵们向你保证小树林里有很多水果,但你还是决定抓起沿途看到的任何水果,以备不时之需。

通过解开谜题来收集星星。在降临节日历的每一天,都会有两个谜题;当你完成第一个谜题时,第二个谜题就会被解锁。每个谜题可以获得1颗星⭐️。祝您好运!

丛林一定是杂草丛生,难以用车辆导航或从空中进入;精灵们的探险队传统上是步行。当你的船接近陆地时,精灵们开始清点他们的物资。一个重要的考虑因素是食物–特别是每个精灵携带的热量数量(你的谜题输入)。

精灵们轮流写下他们所带的各种食物、零食、口粮等所含的热量数量,每行一个项目。每个精灵用一条空行将自己的清单与前一个精灵的清单(如果有的话)分开。

例如,假设精灵们写完了自己物品的热量,最后得到的清单如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1000
2000
3000

4000

5000
6000

7000
8000
9000

10000

这个列表代表了五个精灵携带的食物的热量。

  • 第一个精灵携带的食物有100020003000热量,总共有 6000 热量。
  • 第二个精灵携带的食物有 4000 热量。
  • 第三只精灵携带的食物有50006000热量,总共 11000 热量。
  • 第四个精灵携带的食物有700080009000热量,共计 24000 热量。
  • 第五只精灵携带的食物有 10000 热量。

万一精灵们饿了,需要额外的零食,他们需要知道问哪个精灵:他们想知道携带最多热量的精灵所携带的热量是多少。在上面的例子中,这就是*24000* (由第四只精灵携带)。

找到携带热量最多的精灵。该精灵携带的总热量是多少?

第二部分

当你计算出精灵们问题的答案时,他们已经意识到,携带最多热量食物的精灵最终可能会耗尽零食

为了避免这种不可接受的情况,精灵们反而想知道携带热量最多的前三名精灵所携带的总热量。这样一来,即使其中一个精灵的零食吃完了,他们仍然有两个备份。

在上面的例子中,前三个精灵是第四个精灵(有24000热量),然后是第三个精灵(有11000热量),然后是第五个精灵(有10000热量)。这三个精灵携带的热量之和为 45000

找到携带热量最多的前三个精灵。这些精灵总共携带多少热量?

代码

完整的代码可以在 这里 找到。

01.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use itertools::{sorted};

type Input = Vec<u32>;

fn parse(input: &str) -> Input {
input
.split("\n\n")
.map(|c| c.lines().filter_map(|l| l.parse::<u32>().ok()).sum())
.collect()
}

pub fn part_one(input: Input) -> Option<u32> {
input.iter().max().copied()
}

pub fn part_two(input: Input) -> Option<u32> {
Some(
sorted(input).rev().take(3).sum()
)
}

解析器

两个 \n 就是一组数据,对于每一组数据进行解析,一行如果能够解析出数字就把这一组加起来。

第一部分

找到输入向量的最大值然后输出

第二部分

排序向量并且获取最大的三个,然后累加。

运行时间

所有时间由我这垃圾笔记本电脑进行(不科学的)测试,均以 --release 启动。

1
2
3
4
5
Day 1
------
Parser: ✓ (49.9µs)
Part 1: 72511 (700.0ns)
Part 2: 212117 (7.0µs)