3 个不稳定版本
0.2.1 | 2023 年 5 月 22 日 |
---|---|
0.2.0 | 2023 年 4 月 17 日 |
0.1.0 | 2023 年 4 月 17 日 |
#215 在 测试
每月 30 次下载
11KB
311 行(不包括注释)
简体中文 | English
Leetgo
leetgo
是一个 LeetCode 命令行工具,提供几乎所有的 LeetCode 功能,允许您在终端中完成所有 LeetCode 练习。它可以自动生成 骨架代码和测试用例,支持 本地测试和调试,您可以使用任何喜欢的 IDE 解决问题。
并且 leetgo
还支持实时生成 竞赛题目,一次性提交所有题目,使您的提交始终领先一步!
快速入门
- 安装 leetgo
- 初始化 leetgo:
leetgo init -t <us 或 cn> -l <lang>
- 编辑 leetgo 配置文件:
leetgo.yaml
- 选择一个题目:
leetgo pick <id 或 name 或 today>
- 测试您的代码:
leetgo test last -L
- 提交您的代码:
leetgo submit last
您可以在一个命令中测试和提交:leetgo test last -L -s
您可以使用您喜欢的编辑器编辑问题文件:leetgo edit last
演示
功能
- 为题目生成描述、骨架代码和测试代码
- 自定义生成的代码的代码模板,使用修饰符预处理代码
- 在本地机器上执行测试用例
- 等待并实时生成竞赛题目,一次性测试和提交
- 支持 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_SESSION
和csrftoken
的cookie,并设置LEETCODE_SESSION
和LEETCODE_CSRFTOKEN
环境变量。如果您使用leetcode.com
,则应将LEETCODE_CFCLEARANCE
设置为cf_clearance
cookie的值。leetcode: credentials: from: cookies
-
通过
LEETCODE_USERNAME
和LEETCODE_PASSWORD
环境变量提供用户名和密码。leetcode: credentials: from: password
[!NOTE] 建议不要使用密码验证,且
leetcode.com
不支持密码验证。
您可以将环境变量放在项目根目录中的 .env
文件中,然后 leetgo
将自动读取它们。
高级用法
testcases.txt
testcasts.txt
由 leetgo
生成,包含问题的所有测试用例。
您可以通过仅指定输入并留空输出来添加新的测试用例。当您运行 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错误。
致谢
以下是一些启发我创建此项目的优秀项目
- https://github.com/EndlessCheng/codeforces-go
- https://github.com/clearloop/leetcode-cli
- https://github.com/budougumi0617/leetgode
- https://github.com/skygragon/leetcode-cli
还要感谢 JetBrains 为支持此项目提供的免费许可证。
[^1]: 对于macOS上的Safari,您可能需要授予您想要运行 leetgo
的终端应用程序的 Full Disk Access
权限。
依赖关系
~0.5–0.9MB
~19K SLoC