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

MIT/Apache 协议

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-runneraoc-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