17 个版本
0.3.7 | 2023年12月2日 |
---|---|
0.3.5 | 2023年11月30日 |
0.3.4 | 2023年3月25日 |
0.3.3 | 2022年12月1日 |
0.1.2 | 2018年11月30日 |
在 Cargo 插件 中排名 #72
42KB
841 行代码(不包括注释)
Cargo Advent of Code 辅助工具
cargo-aoc
是一个简单的命令行工具,旨在成为 Advent of Code 的辅助工具。
实现您的解决方案。让我们处理其他部分。
特性
- 输入下载
- 运行您的解决方案
- 使用 Criterion 自动基准测试您的解决方案
入门指南
安装 cargo aoc
cargo-aoc
在 crates.io 上以二进制形式托管。启动终端,使用 cargo install cargo-aoc
安装程序
设置 CLI
您需要找到 AoC 的会话令牌,以便 cargo-aoc 可以正常工作。幸运的是,由于令牌存储在您的浏览器 cookies 中,因此找到令牌很容易。打开浏览器的开发者工具,然后
- Firefox: “存储”选项卡,Cookies,并复制
session
cookie 的“值”字段。 - Google Chrome / Chromium: “应用”选项卡,Cookies,并复制
session
cookie 的“值”字段。
一旦您有了它,只需运行即可: cargo aoc credentials {token}
您现在可以开始编码了!
注意:如果您的令牌发生了变化,请记住将其更改回来。
cargo aoc credentials
将显示当前存储的用户令牌
设置项目
为了让 cargo-aoc
正常工作,您必须正确设置项目。
如果在过程中迷路,您可以以 这个AoC 2015示例存储库 作为模板。
首先,您必须在您的 Cargo.toml
中添加对 aoc-runner
和 aoc-runner-derive
的依赖。在 src/lib.rs
的末尾,您将必须使用宏 aoc_lib!{ year = XXXX }
,其中 XXXX 是正在解决的 AoC 问题的年份。
在实现某一天的解决方案时,您必须提供函数并相应地标记它们。一个函数要么是 求解器,要么是 生成器。
这两种类型的函数将被单独执行和基准测试。让我们更详细地看看
生成器函数
生成器允许您为求解器函数提供自定义类型。在 AoC 中,有时您必须解析输入并从中提取逻辑结构,然后才能实际解决问题。
生成器函数被标记为 #[aoc_generator(dayX)]
。
因为示例胜过千言万语,让我们看看 2015年,第2天
从谜题描述中,我们知道我们有每个礼物的尺寸列表(长度 l、宽度 w 和高度 h),每个礼物一行,表示如下:{L}x{W}x{H}
。
我们可能首先想要解析输入并从中提取逻辑的 Gift
结构体,如下所示
pub struct Gift {
l: u32,
w: u32,
h: u32
}
在 @Gobanos 的参考实现中,我们可以看到他选择了一个自定义类型:type Gift = (u32, u32, u32);
。
因此,为 Gift
编写生成器相当简单
#[aoc_generator(day2)]
pub fn input_generator(input: &str) -> Vec<Gift> {
input
.lines()
.map(|l| {
let mut gift = l.trim().split('x').map(|d| d.parse().unwrap());
(
gift.next().unwrap(),
gift.next().unwrap(),
gift.next().unwrap(),
)
}).collect()
}
如您所见,生成器接受一个 &str
(或一个 &[u8]
)类型的输入,并输出您想要的任何类型,然后您可以在 solver
函数中使用它。
求解器函数
求解器函数通常是您的算法,它们接受由生成器提供的任何输入类型,并返回您想要使用的任何类型,前提是它实现了 Display
特性。
求解器函数被标记为 #[aoc(day2, part1)]
。你可以为一天中的同一部分提供多个实现。然后必须使用一个名称来正确标记它们,例如: #[aoc(day2, part1, for_loop)]
。
在上一例子基础上,实现第一部分的求解器可能如下所示:
#[aoc(day2, part1)]
pub fn solve_part1(input: &[Gift]) -> u32 {
input
.iter()
.map(|&(l, w, h)| {
let (s1, s2) = smallest_side((l, w, h));
2 * l * w + 2 * w * h + 2 * h * l + s1 * s2
})
.sum()
}
请注意,我们如何使用之前生成的 Gift
,利用Rust的迭代器高效地解决问题,同时保持代码的可维护性。
这个特定求解器的输出是一个 u32
,当然它实现了 Display
。当你使用 cargo aoc
运行解决方案时,该结果将在控制台打印出来,并附带其他关于执行时间的信息。
手动下载输入
使用 cargo aoc input
下载输入并将其存储在 input/{year}/day_{day}.txt
。
请注意,默认情况下,我们使用今天的日期作为参数。当然,你可以使用以下命令更改它: cargo aoc input -d {day} -y {year}
运行您的解决方案
cargo aoc
将运行最新实现的当天,并在运行之前下载你的输入。它会显示结果,以及一个关于性能的简要概述。
在我的Chromebook上运行@Gobanos' AOC2015的示例输出
[olivier@olivier-pc advent-of-code-2015]$ cargo aoc
Finished dev [unoptimized + debuginfo] target(s) in 0.12s
Compiling aoc-autobuild v0.1.0 (/home/olivier/Workspace/Rust/advent-of-code-2015/target/aoc/aoc-autobuild)
Finished release [optimized] target(s) in 0.87s
Running `target/release/aoc-autobuild`
AOC 2015
Day 5 - Part 1 : 238
generator: 18.122µs,
runner: 420.958µs
Day 5 - Part 2 : 69
generator: 5.499µs,
runner: 1.142373ms
如果你想运行更早的谜题或特定的部分,请使用以下命令指定: cargo aoc -d {day} -p {part}
。
对您的解决方案进行基准测试
基准测试由 Criterion 提供。使用 cargo aoc bench
启动基准测试,就像使用 cargo aoc
一样。
每天生成的基准测试在 target/aoc/aoc-autobench/target/criterion
中。
您可以在浏览器中自动打开基准测试,使用以下命令:cargo aoc bench -o
很快(tm),您还将能够使用我们的(免费)在线平台,将您的结果与社区的结果进行比较。
祝您 Advent of Code 快乐!
依赖项
~8–25MB
~336K SLoC