8 个版本

0.0.9 2023 年 12 月 2 日
0.0.8 2023 年 12 月 1 日
0.0.7 2023 年 7 月 15 日
0.0.3 2023 年 6 月 22 日
0.0.1 2023 年 2 月 11 日

开发工具 中排名 182

MIT 许可证

78KB
2K SLoC

aocli

Crates.io Downloads License

aocli 是解决 Rust 中 Advent of Code 的辅助命令行工具。使用 aoclib 解析输入并运行解决方案。

安装

cargo install aocli

aocli 的二进制文件名为 aoc

需求

  • cargo 已添加到 PATH 环境变量中
  • 支持 ANSI 颜色终端

功能

  • 下载谜题输入和过去谜题答案
  • 提交谜题答案
  • 本地缓存谜题答案以进行测试
  • 在许多不同的输入上运行解决方案
  • 运行所有日期或指定日期的解决方案
  • 计时解决方案
  • 使用 aoclib 解析谜题输入
  • 快速查看进度
  • 在浏览器中打开年份或日期网页
  • 项目管理(创建工作区、crate 和文件)
  • 每个日期的最小源文件数(只有一行样板代码)
  • 每个日期的最小编译时间(共享依赖的单独 crate)

示例

功能

解决方案工作区由根目录、年份目录和日期目录组成。例如

aoc
├── aoc-root
├── Cargo.toml
├── Cargo.lock
├── .session
├── .gitignore
├── target
├── 2015
│   ├── 01
│   └── 02
├── 2016
│   └── 01
└── 2017
    ├── 01
    ├── 02
    └── 03

在此,根目录(Cargo 工作区)被称为 aoc,并包含年份目录 201520162017,每个目录都包含各种日期目录。2015 年第 1 天的路径是 /aoc/2015/01,2017 年第 3 天的路径是 /aoc/2017/03。每个日期目录都是一个常规的 Rust 二进制 crate。aoc-root 文件表示解决方案工作区的根,.session 文件包含用于登录 Advent of Code 网站的会话cookie。

aocli 命令可以在三个目录层级中的任何一个中运行,每个层级的必需参数和功能可能不同。例如,以下三个命令将执行相同的功能

/aoc > aoc run 15 1
/aoc/2015 > aoc run 1
/aoc/2015/01 > aoc run

而以下两个命令将运行 2015 年的每个解决方案,而不是只运行第 1 天

/aoc > aoc run 15
/aoc/2015 > aoc run

解决方案

一个日问题的解决方案由从 aoclib 调用 aoc::parts! 以及每个解决部分的函数组成。

输入作为 aoclib 中的 aoc::Input 实例传入。有关更多信息,请参阅文档。

例如

aoc::parts!(1, 2);

fn part_1(input: aoc::Input) -> impl ToString {
    // solution to part 1
}

fn part_2(input: aoc::Input) -> impl ToString {
    // solution to part 2
}

但是,根据实现了哪些部分,可能可以使用 aoc::parts!()aoc::parts!(1)aoc::parts!(2)。函数可以返回任何可以转换为 ToString 的类型,而将转换为一个 String 的操作不包括在解决方案的计时中。

输入

除了是 Rust 二进制包的解决方案之外,每个日目录还包含该日的谜题输入和相应的谜题答案。您的实际谜题输入命名为 actual,但您可以创建其他输入和答案,例如用于网站上示例的答案。

文件系统结构如下

DAY
├── Cargo.toml
├── src/DAY.rs
└── data
    ├── actual
    ├── example1
    └── example2

而每个输入目录包含谜题输入和答案

example1
├── input
├── 1
│   └── answer
└── 2
    └── answer

空或不存在的答案文件表示答案未知。

add example1 将创建与上述相同的 example1 目录和空文件,以便按需填充。

get 将从网站创建并填充 actual 输入目录。

run example1 将使用 example1 输入运行解决方案。

run 默认使用 actual 输入。

解释输出

rundebugtestsubmit 以彩色显示谜题答案。绿色表示正确,红色表示不正确,黄色表示不知道正确答案。

注意

为了使用 aocli 的网络功能(getsubmitprogress),您必须将您的会话cookie粘贴到由该命令创建的 .session 文件中,是否包含 session= 标题均可。

如果您为 2019 年的 Intcode 计算机创建一个作为依赖项的包,您必须记得通过修改根目录中的 Config.toml 文件将其添加到 Cargo 工作区。

命令

请注意,用 <> 包围的参数是 必需的,而用 [] 包围的参数是 可选的

init

在当前目录初始化解决方案工作区。例如

/aoc > aoc init

将设置一个以 aoc 作为根目录的解决方案工作区,并尝试调用 git init。它还将初始化一个 Cargo 工作区。

open (o)

/root > aoc open <YEAR>
/root/YEAR > aoc open
/root > aoc open <YEAR> <DAY>
/root/YEAR > aoc open <DAY>
/root/YEAR/DAY > aoc open

使用默认浏览器通过 webbrowser 打开年份或日期的网页。

new (n)

/root > aoc new <YEAR> <DAY>
/root/YEAR > aoc new <DAY>

为 Advent of Code 的新一天创建目录、文件和 Rust 包,并将新包添加为 Cargo 工作区的成员。

get (g)

/root > aoc get <YEAR> <DAY>
/root/YEAR > aoc get <DAY>
/root/YEAR/DAY > aoc get

如果本地文件中不存在,则从网站下载当天的谜题输入和任何现有的谜题答案。

add (a)

/root > aoc add <YEAR> <DAY> <INPUT>
/root/YEAR > aoc add <DAY> <INPUT>
/root/YEAR/DAY > aoc add <INPUT>

为名为 <INPUT> 的新谜题输入创建目录和空文件。

输入名称必须是有效的目录名,且不能是 12

clean

/root > aoc clean <YEAR>
/root/YEAR > aoc clean
/root > aoc clean <YEAR> <DAY>
/root/YEAR > aoc clean <DAY>
/root/YEAR/DAY > aoc clean

将输入和答案文件重置为每年每天(或指定的某一天)的 actual 输入中的空文件,以便 get 填充它们。

run (r)

/root > aoc run <YEAR>
/root/YEAR > aoc run

以发布模式运行每天两部分解决方案,使用实际的谜题输入,并提供总时间和平均时间统计。

/root > aoc run <YEAR> <DAY> [INPUT] [PART]
/root/YEAR > aoc run <DAY> [INPUT] [PART]
/root/YEAR/DAY > aoc run [INPUT] [PART]

以发布模式运行当天的解决方案。

默认同时运行两部分,使用实际的输入,但也可以提供不同的输入或特定的部分。

例如

/root/YEAR/DAY > aoc run example

以输入 example 运行两部分,

/root/YEAR/DAY > aoc run 1

使用输入 actual 仅运行第 1 部分,

/root/YEAR/DAY > aoc run example 2

使用输入 example 仅运行第 2 部分。

请注意,此处缺少标志是为什么 12 不可作为输入名称的原因。

debug (d)

/root > aoc debug <YEAR> <DAY> [INPUT] [PART]
/root/YEAR > aoc debug <DAY> [INPUT] [PART]
/root/YEAR/DAY > aoc debug [INPUT] [PART]

run 相同,但解决方案在调试模式而不是发布模式下运行。

run days (r d)

/root > aoc run <YEAR> days <DAYS>
/root/YEAR > aoc run days <DAYS>

以发布模式运行指定年份指定日期的两部分解决方案,使用实际的谜题输入,并提供总时间和平均时间统计。

<DAYS> 参数应是一个由空格分隔的术语序列,其中每个术语是以下之一

  • 一天,X
  • 连续日期范围,X..Y
  • 上述否定,-X-X..Y

范围中的起始和结束日期是可选的,因此 X.. 等同于 X..25,而 ..Y 等同于 1..Y

如果第一个术语是常规术语,则最初不包含任何天,如果第一个术语是否定术语,则最初包含所有天。然后按顺序逐一应用术语。常规术语会导致其天被包含,而否定术语会导致它们被排除。

  • days 4 8 = days 4..8 -5 -6 -7 = days 4..8 -5..7 = days ..8 -5..7 -..3
  • days -3 = days 1..25 -3 = days 1 2 4..
  • days -1 -25 = days 2..24

例如

/root > aoc run 2019 days -25

在2019年运行除第25天之外的所有天数,

/root/2021 > aoc run days -19

在2021年运行除第19天之外的所有天数,

/root/2022 > aoc run days ..10 20..

在2022年运行第1天到第10天和第20天到第25天,并且

/root/2018 > aoc run days 1 4 9

在2018年运行第1天、第4天和第9天。

test (t)

/root > aoc test <YEAR>
/root/YEAR > aoc test

以发布模式运行每一天的每个谜题输入的两部分解决方案。

/root > aoc test <YEAR> <DAY> [PART]
/root/YEAR > aoc test <DAY> [PART]
/root/YEAR/DAY > aoc test [PART]

以发布模式运行每一天的每个谜题输入的两部分或特定部分的解决方案,该解决方案位于 /DAY/data 中。

test days (t d)

/root > aoc test <YEAR> days <DAYS>
/root/YEAR > aoc test days <DAYS>

以发布模式运行指定天数的每一天的每个谜题输入的两部分解决方案。

参数的规则与上面提到的 run days 相同。

submit (s)

/root > aoc submit <YEAR> <DAY> [ANSWER]
/root/YEAR > aoc submit <DAY> [ANSWER]
/root/YEAR/DAY > aoc submit [ANSWER]

将谜题答案提交给 Advent of Code 网站上的下一个未解部分。

提交的谜题答案将是如果提供则 [ANSWER],或解决方案生成的最后一个答案。

例如

/root/YEAR/DAY > aoc run
/root/YEAR/DAY > aoc submit

将运行解决方案并将生成的答案提交到网站。

progress (p)

/root > aoc progress
/root > aoc progress <YEAR>
/root/YEAR > aoc progress

显示您账户在所有年份或指定年份的进度。

/root > aoc progress <YEAR> <DAY>
/root/YEAR > aoc progress <DAY>
/root/YEAR/DAY > aoc progress

显示您账户正确提交的当天答案。

帮助

在默认网络浏览器中打开此 README.md

依赖关系

~4–18MB
~225K SLoC