#leetcode #test-cases #contest #language #template #leetgo

leetgo-rs

Rust 专门为 leetgo 提供的测试工具

3 个不稳定版本

0.2.1 2023 年 5 月 22 日
0.2.0 2023 年 4 月 17 日
0.1.0 2023 年 4 月 17 日

#215测试

每月 30 次下载

MIT 许可证

11KB
311 行(不包括注释)

简体中文 | English

Leetgo

Go Report Card CI GitHub downloads PRs Welcome Twitter Follow

leetgo 是一个 LeetCode 命令行工具,提供几乎所有的 LeetCode 功能,允许您在终端中完成所有 LeetCode 练习。它可以自动生成 骨架代码和测试用例,支持 本地测试和调试,您可以使用任何喜欢的 IDE 解决问题。

并且 leetgo 还支持实时生成 竞赛题目,一次性提交所有题目,使您的提交始终领先一步!

快速入门

  1. 安装 leetgo
  2. 初始化 leetgo:leetgo init -t <us 或 cn> -l <lang>
  3. 编辑 leetgo 配置文件:leetgo.yaml
  4. 选择一个题目:leetgo pick <id 或 name 或 today>
  5. 测试您的代码:leetgo test last -L
  6. 提交您的代码:leetgo submit last

您可以在一个命令中测试和提交:leetgo test last -L -s

您可以使用您喜欢的编辑器编辑问题文件:leetgo edit last

演示

demo

功能

  • 为题目生成描述、骨架代码和测试代码
  • 自定义生成的代码的代码模板,使用修饰符预处理代码
  • 在本地机器上执行测试用例
  • 等待并实时生成竞赛题目,一次性测试和提交
  • 支持 leetcode.com 和 leetcode.cn
  • 自动从浏览器读取 Cookie,无需输入密码
  • 自动在您喜欢的编辑器中打开问题文件
  • 使用 OpenAI 自动发现和修复代码中的问题(实验性)

语言支持

leetgo 支持大多数语言的代码生成和一些语言的本地测试。

在 Go 语言中,运行 leetgo pick 257 将生成以下代码

// Omitted some code...
// @lc code=begin

func binaryTreePaths(root *TreeNode) (ans []string) {

	return
}

// @lc code=end

func main() {
	stdin := bufio.NewReader(os.Stdin)
	root := Deserialize[*TreeNode](ReadLine(stdin))
	ans := binaryTreePaths(root)
	fmt.Println("output: " + Serialize(ans))
}

这是一个完整且可运行的程序。您可以直接运行它,输入测试用例,并比较结果。 leetgo test -L 将自动使用 testcases.txt 中的测试用例运行此程序并比较结果。

本地测试意味着您可以在本地计算机上运行测试用例,因此您可以使用调试器来调试您的代码。

本地测试需要为每种语言做更多的工作来实现,因此并非所有语言都受支持。以下是当前的支持矩阵

生成 本地测试
Go
Python
C++
Rust
Java 尚未支持
JavaScript 尚未支持
TypeScript 尚未支持
PHP 尚未支持
C 尚未支持
C# 尚未支持
Ruby 尚未支持
Swift 尚未支持
Kotlin 尚未支持
Bash 尚未支持
MySQL 尚未支持
MSSQL 尚未支持
Oracle 尚未支持
Erlang 尚未支持
Racket 尚未支持
Scala 尚未支持
Elixir 尚未支持
Dart 尚未支持

欢迎帮助我们在更多语言中实现本地测试!

安装

您可以从 发布页面 下载最新版本的二进制文件。

在 macOS/Linux 上通过 HomeBrew 安装

brew install j178/tap/leetgo

在 Windows 上通过 Scoop 安装

scoop bucket add j178 https://github.com/j178/scoop-bucket.git
scoop install j178/leetgo

在 ArchLinux 上安装

yay -S leetgo-bin

在 macOS/Linux 上通过安装脚本安装

curl -fsSL https://raw.githubusercontent.com/j178/leetgo/master/scripts/install.sh | bash

通过 go install 从源安装

go install github.com/j178/leetgo@latest

使用方法

Usage:
  leetgo [command]

Available Commands:
  init                    Init a leetcode workspace
  pick                    Generate a new question
  info                    Show question info
  test                    Run question test cases
  submit                  Submit solution
  fix                     Use ChatGPT API to fix your solution code (just for fun)
  edit                    Open solution in editor
  contest                 Generate contest questions
  cache                   Manage local questions cache
  debug                   Show debug info
  open                    Open one or multiple question pages in a browser
  help                    Help about any command

Flags:
  -v, --version       version for leetgo
  -l, --lang string   language of code to generate: cpp, go, python ...
      --site string   leetcode site: cn, us
  -y, --yes           answer yes to all prompts
  -h, --help          help for leetgo

Use "leetgo [command] --help" for more information about a command.

问题标识符

许多 leetgo 命令依赖于 qid 来查找 LeetCode 问题。 qid 是 leetgo 定义的一个简化的问题标识符,其形式如下(以两数之和问题为例)

leetgo pick two-sum          # `two-sum` is the question slug
leetgo pick 1                # `1` is the question id
leetgo pick today            # `today` means daily question
leetgo pick yesterday        # `yesterday` means the question of yesterday
leetgo pick today-1          # `today-1` means the question of yesterday, same as `yesterday`. `today-2`, `today-3` etc are also supported.
leetgo contest weekly100     # `weekly100` means the 100th weekly contest
leetgo test last             # `last` means the last generated question
leetgo test weekly100/1      # `weekly100/1` means the first question of the 100th weekly contest
leetgo submit b100/2         # `b100/2` means the second question of the 100th biweekly contest
leetgo submit w99/           # `w99/` means all questions of the 99th biweekly contest (must keep the trailing slash)
leetgo test last/1           # `last/1` means the first question of the last generated contest
leetgo test last/            # `last/` means all questions of the last generated contest (must keep the trailing slash)

配置

[!WARNING] 从 v1.4 版本开始, leetgo 不再读取全局 ~/.config/leetgo/config.yaml 文件,请将所有配置放入项目的 leetgo.yaml 文件中。

leetgo init 在当前目录中生成一个 leetgo.yaml 文件,其中包含 leetgo 的所有配置。您可以根据需要修改此文件。

leetgo.yaml 所在的目录被视为 leetgo 项目的根目录,leetgo 将在此目录下生成所有代码文件。 leetgo 将在当前目录中查找 leetgo.yaml 文件。如果找不到,它将递归向上搜索,直到找到 leetgo.yaml 文件或达到文件系统的根目录。

以下是完整配置的示例

点击展开
# Your name
author: Bob
# Language of the question description: 'zh' (Simplified Chinese) or 'en' (English).
language: zh
code:
  # Language of code generated for questions: go, cpp, python, java... 
  # (will be overridden by command line flag -l/--lang).
  lang: go
  # The default template to generate filename (without extension), e.g. {{.Id}}.{{.Slug}}
  # Available attributes: Id, Slug, Title, Difficulty, Lang, SlugIsMeaningful
  # (Most questions have descriptive slugs, but some consist of random characters. The SlugIsMeaningful boolean indicates whether a slug is meaningful.)
  # Available functions: lower, upper, trim, padWithZero, toUnderscore, group.
  filename_template: '{{ .Id | padWithZero 4 }}{{ if .SlugIsMeaningful }}.{{ .Slug }}{{ end }}'
  # Generate question description into a separate question.md file, otherwise it will be embed in the code file.
  separate_description_file: true
  # Default modifiers for all languages.
  modifiers:
    - name: removeUselessComments
  go:
    # Base directory to put generated questions, defaults to the language slug, e.g. go, python, cpp.
    out_dir: go
    # Functions that modify the generated code.
    modifiers:
      - name: removeUselessComments
      - name: changeReceiverName
      - name: addNamedReturn
      - name: addMod
  python3:
    # Base directory to put generated questions, defaults to the language slug, e.g. go, python, cpp.
    out_dir: python
    # Path to the python executable that creates the venv.
    executable: python3
  cpp:
    # Base directory to put generated questions, defaults to the language slug, e.g. go, python, cpp.
    out_dir: cpp
    # C++ compiler
    cxx: g++
    # C++ compiler flags (our Leetcode I/O library implementation requires C++17).
    cxxflags: -O2 -std=c++17
  rust:
    # Base directory to put generated questions, defaults to the language slug, e.g. go, python, cpp.
    out_dir: rust
  java:
    # Base directory to put generated questions, defaults to the language slug, e.g. go, python, cpp.
    out_dir: java
leetcode:
  # LeetCode site, https://leetcode.com or https://leetcode.cn
  site: https://leetcode.cn
  # Credentials to access LeetCode.
  credentials:
    # How to provide credentials: browser, cookies, password or none.
    from: browser
    # Browsers to get cookies from: chrome, safari, edge or firefox. If empty, all browsers will be tried. Only used when 'from' is 'browser'.
    browsers: []
contest:
  # Base directory to put generated contest questions.
  out_dir: contest
  # Template to generate filename of the question.
  filename_template: '{{ .ContestShortSlug }}/{{ .Id }}{{ if .SlugIsMeaningful }}.{{ .Slug }}{{ end }}'
  # Open the contest page in browser after generating.
  open_in_browser: true
# Editor settings to open generated files.
editor:
  # Use a predefined editor: vim, vscode, goland
  # Set to 'none' to disable, set to 'custom' to provide your own command and args.
  use: none
  # Custom command to open files.
  command: ""
  # Arguments to your custom command.
  # String contains {{.CodeFile}}, {{.TestFile}}, {{.DescriptionFile}}, {{.TestCasesFile}} will be replaced with corresponding file path.
  # {{.Folder}} will be substituted with the output directory.
  # {{.Files}} will be substituted with the list of all file paths.
  args: ""

LeetCode 凭证

leetgo 使用 LeetCode 的 GraphQL API 来检索问题和提交解决方案。 leetgo 需要您的 LeetCode 饼干来访问受认证的 API。

有三种方式可以使饼干对 leetgo 可用

  • 自动从浏览器读取饼干。

    目前,leetgo 支持 Chrome、FireFox、Safari[^1]、Edge。

    leetcode:
      credentials:
        from: browser
    
  • 提供饼干。

    您可以从浏览器的开发者工具中获取名为 LEETCODE_SESSIONcsrftoken 的cookie,并设置 LEETCODE_SESSIONLEETCODE_CSRFTOKEN 环境变量。如果您使用 leetcode.com,则应将 LEETCODE_CFCLEARANCE 设置为 cf_clearance cookie的值。

    leetcode:
      credentials:
        from: cookies
    
  • 通过 LEETCODE_USERNAMELEETCODE_PASSWORD 环境变量提供用户名和密码。

    leetcode:
      credentials:
        from: password
    

[!NOTE] 建议不要使用密码验证,且 leetcode.com 不支持密码验证。

您可以将环境变量放在项目根目录中的 .env 文件中,然后 leetgo 将自动读取它们。

高级用法

testcases.txt

testcasts.txtleetgo 生成,包含问题的所有测试用例。

您可以通过仅指定输入并留空输出来添加新的测试用例。当您运行 leetgo test(不使用 -L)时,预期输出将从远程服务器获取。例如

input:
[3,3]
6
output:

input:
[1,2,3,4]
7
output:

模板

leetgo的配置文件中的几个字段支持模板化。这些字段通常以 _template 结尾。您可以使用自定义模板来生成自己的文件名、代码等。

代码块

代码文件由不同的代码块组成,您可以覆盖其中一些来提供自己的代码片段。

可用代码块
header
description
title
beforeMarker
beforeCode
code
afterCode
afterMarker

例如

code:
lang: cpp
cpp:
  blocks:
  - name: beforeCode
    template: |
      #include <iostream>
      using namespace std;
  - name: afterMarker
    template: |
      int main() {}

脚本

leetgo 支持提供一个JavaScript函数来处理生成前的代码,例如

code:
  lang: cpp
  cpp:
    modifiers:
    - name: removeUselessComments
    - script: |
        function modify(code) {
          return "// hello world\n" + code;
        }

常见问题解答

如果您遇到任何问题,请设置 DEBUG 环境变量为 1,复制命令输出,并打开问题。

一些常见问题可以在 Q&A 页面找到。

欢迎贡献!

良好入门问题 是一个好的起点,您还可以查看一些 需要帮助的问题

如果您想为新的语言添加本地测试支持,请参阅 #112

在提交PR之前,请运行 golangci-lint run --fix 来修复lint错误。

致谢

以下是一些启发我创建此项目的优秀项目

还要感谢 JetBrains 为支持此项目提供的免费许可证。

JetBrains Logo

[^1]: 对于macOS上的Safari,您可能需要授予您想要运行 leetgo 的终端应用程序的 Full Disk Access 权限。

依赖关系

~0.5–0.9MB
~19K SLoC