4 个版本

0.2.0 2022年12月1日
0.1.2 2022年12月1日
0.1.1 2022年11月30日
0.1.0 2022年11月30日

#2 in #adventofcode

MIT 许可证

11KB
164 行代码(不包括注释)

AOC 库

Rust 对 Advent of Code 的辅助库,可以帮助您节省复制粘贴输入和答案的时间。

用法

要开始,您必须首先将 Advent of Code 会话传递给库。

  1. 打开 adventofcode.com
  2. 打开开发者工具(Ctrl+Shift+I 可能会根据您的平台而变化)
    • 对于 Firefox:开发者工具 > 存储 > Cookies > 复制会话cookie
    • 对于 Chrome:开发者工具 > 应用 > Cookies > 复制会话cookie
  3. AOC_SESSION 环境变量设置为复制的会话,或使用 AocSession::new_from_session 与会话。

为了避免多次提交相同的答案,一个 aoc-progress.json 文件存储在当前目录中,跟踪您的进度。

示例

以下示例(2021年 AOC 第 2 天的第一部分和第二部分)应该可以很好地解释库的工作原理。

use aoc_lib::{AocSession, Day};
use std::{convert::Infallible, str::FromStr};

enum SubmarineCommand {
    Forward(i32),
    Up(i32),
    Down(i32),
}

struct Day2(Vec<SubmarineCommand>);

impl Day for Day2 {
    fn from_input(input: String) -> Self {
        let lines = input.trim().split('\n');
        let mut commands = vec![];

        for line in lines {
            commands.push(line.parse().unwrap());
        }

        Self(commands)
    }

    fn first_part(&mut self) -> String {
        let mut depth: i32 = 0;
        let mut x: i32 = 0;

        for command in &self.0 {
            match command {
                SubmarineCommand::Down(c) => depth += c,
                SubmarineCommand::Up(c) => depth -= c,
                SubmarineCommand::Forward(c) => x += c,
            }
        }

        (depth * x).to_string()
    }

    fn second_part(&mut self) -> String {
        let mut depth = 0i32;
        let mut aim = 0i32;
        let mut x = 0i32;

        for command in &self.0 {
            match command {
                SubmarineCommand::Forward(c) => {
                    x += c;
                    depth += aim * c;
                }
                SubmarineCommand::Down(c) => aim += c,
                SubmarineCommand::Up(c) => aim -= c,
            }
        }

        (depth * x).to_string()
    }
}

impl FromStr for SubmarineCommand {
    type Err = Infallible; // Just panic!

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let raw_command = s.split(' ').collect::<Vec<_>>();

        Ok(match (raw_command[0], raw_command[1]) {
            ("forward", count) => Self::Forward(count.parse().unwrap()),
            ("down", count) => Self::Down(count.parse().unwrap()),
            ("up", count) => Self::Up(count.parse().unwrap()),
            _ => unreachable!(),
        })
    }
}

fn main() -> Result<(), anyhow::Error> {
    /// More the one .day can be set
    AocSession::new(2021)?.day::<Day2>(3)?;
    Ok(())
}

依赖项

~4–19MB
~251K SLoC