# letscode **Repository Path**: ailbd/letscode ## Basic Information - **Project Name**: letscode - **Description**: letscode是一个用于练习算法编程的管理应用,它将算法程序以插件的形式进行管理,并动态的加载json文件中为算法定义的数据,方便进行数据输入和数据持久化。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2021-09-28 - **Last Updated**: 2023-02-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: LeetCode, gn, shell, Framework, GDB ## README # Letscode # 描述 letscode是一个用于练习算法编程的管理应用,它将算法程序以插件的形式进行管理,并动态的加载json文件中为算法定义的数据,方便进行数据输入和数据持久化。 ## 版权申明 ``` Copyright (c) 2023 Jianjun Yue and letscode contributors. ``` ## 层级结构 ``` . ├── build # build scripts │   ├── scripts │   └── toolchains ├── core # letscode core logic │   ├── dataloader # data loader │   │   ├── cjson # cjson used to parse configs │   │   ├── data # defind data files │   │   └── include │   ├── include │   └── manager # solution manager │   └── include ├── docs # docs │   └── resource │   └── pics ├── leetcode # types of algorithm solutions │   ├── array │   ├── dynamic_program │   ├── find_and_union │   ├── greedy │   ├── hash │   ├── include │   ├── recursive │   ├── search │   ├── slip_window │   ├── sort │   ├── stack │   ├── standby │   ├── string │   └── tree ├── securec # securec │   ├── include │   └── src ├── tests # test │   ├── gtest # test suits for unittest │   │   ├── include │   │   └── testsuits │   ├── standby # standalone tests, third party │   └── ytest └── utils # common utils ├── include └── src ``` ## 软件架构 ![architecture](./docs/resource/pics/letscode_arch.png) ## 环境配置 * 前提条件 1. [gn][gn official page] 2. [ninja][ninja official page] 3. [cmake][cmake official page] 4. gtest * 配置gn GN是一个元构建系统,为Ninja生成构建文件。 你可以在[这里][gn download url]获得类unix系统的二进制文件。 用你的GN安装目录来代替下面的_"$YOUR_GN_DIR"_。 ``` vim ~/.bashrc export PATH=$YOUR_GN_DIR:$PATH ``` * 配置ninja letscode使用gn来解析BUILD.gn并生成ninja脚本文件。ninja将解释ninja脚本文件来编译源代码。 你可以[下载Ninja二进制][ninja download url]。 ``` vim ~/.bashrc export PATH=$YOUR_NINJA_DIR:$PATH ``` * cmake(可选) 跨平台的系列工具,旨在构建、测试和打包软件。我们在此使用cmake来编译googletests。 按照[下载页面][cmake download page]获取最新版本。 ``` tar -xzf cmake-xx.xx.x-linux-x86_64.tar.gz vim ~/.bashrc export PATH=$YOUR_CMAKE_DIR:$PATH ``` * gtest (可选) 你可以在[官方网页][gtest official page]上访问全部资料并获得更多信息。源代码下载页面是[这里][gtest source code]。 Letscode将使用gtest运行单元测试与功能测试。 Compile googletest: ``` cd googletest mkdir build cmake .. # if you want install gtest to non standard system directories ccmake . # configure install prefix make; make install ``` 当你不把 gtest 安装到 _/usr/local_ 或 _/usr/lib_ 时,以下信息可能对你会有帮助。 > 设置 C_INCLUDE_PATH(用于 C 头文件)或 CPLUS_INCLUDE_PATH(用于 C++ 头文件)来增加搜索路径。 > CPATH 将为 C 和 C++(以及任何其他语言)设置路径。 关于路径搜索可点击[更多相关信息](https://web.archive.org/web/20090129230009if_/http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html); ## 编译Letscode和Solutions Letscode将所有算法都称为Solution,使用build.sh进行编译所有的Solution,一般地,你只需要敲击下面的命令: ``` ./build.sh -g out ## build letscode and solutons ./build.sh -T leetcode:leetcode ## build specified target ./build.sh -g out -p enable_asan="true" ## build letscode with asan ./build.sh -g out -p use_plugin="false" ## build solutions as standalone executable ./build.sh -g out -p testing="true" ## build all targets with testsuits ``` 脚本会开始编译所有目标或者仅编译‘-T’指定的目标; ## 运行Solution 编译完成后,会生成letscode程序,运行./letscode进入交互式模式。 交互式模式下,输入‘?’可获取简易帮助。 ``` # ? # f: flush, s: scan, l: list, r: run, q: quit, d:dump, h|?: help ``` * s命令对Solution插件进行扫描 * l[col]命令以col列列出所有的Solutions. 默认3列。 * f命令刷新json数据,当更新json文件后,需要执行此命令。 * q退出程序。 * r命令运行特定的Solution。用法 r solution_name:data_id。 一般地,Solution所需要的数据会特定的存放在某一个json数据文件中,data_id对应该json文件中的数据id。 更多的模式和使用方法可以通过 ./letscode -? 查看。 ## 编译单元测试(待完善) Solutions可以用google测试框架轻松测试。 ``` ./build.sh -g out -p only_test="true" ## build only tests ./build.sh -T tests/gtests:test -p testing="true" ``` ## 添加Solutions 所有的Solution都应该放在//leetcode下,无论什么子目录。通常情况下,一个解决方案只有一个源文件,其唯一的文件名将在编译时被用作目标名称。 独立的Solution必须有一个main实现。但是,如果你想使用脚本solution_adp.sh来自动为你的Solution进行插件化适配,就必须实现固定形式的main函数。另外在你的main函数体后面应该有一个换行。 ``` int main(int argc, char const *argv[]) { } // newline is needed ``` 模块化的Solution插件有共同的预定义的钩子函数必须实现。至少应该做到下面这两个。而且你应该使用宏HAS_FEATURE_SLUMGR来进行条件编译你的Solution。 ``` # ifdef HAS_FEATURE_SLUMGR void *solution_init(void *pdata) { } #else // HAS_FEATURE_SLUMGR void *solution_deinit(void *pdata) { } #endif // HAS_FEATURE_SLUMGR ``` 现在,让我们编译你的Solution。如果你想把它作为Lettscode的一个插件来使用,添加脚本来编译你的解决方案是非常简单的。仅需要添加下面的一行到//leetcode/solutions.gni文件。 ``` ["solution-name", "file-type"], ``` 如果你的解决方案的名称在leetcode下是唯一的,你可以直接把file-type设置为null。 然后,脚本locate_src.sh会自动找到它,并使它被编译。 目前,solution-name在solutions.gni中应该是唯一的,否则就会导致gn的目标重名,产生编译错误。 ## 数据加载器 Dataloader是Letscode中的一个模块,它向Solutions提供了获取json中数据的能力,为了更方便的向C++的string、vector容器读入数据,可以使用下面的函数宏进行数据加载。 | 宏 | 参数 | 描述 | |----|------|-----| |LOADDATA_DUB(pdata, data)|sluargs_t *pdata, double data|加载double类型数据| |LOADDATA_DUB(pdata, data)|sluargs_t *pdata, int data|加载int类型数据| |LOADDATA_STR(pdata, str)|sluargs_t *pdata, string str|加载string类型数据| |LOADDATA_STR_ARR(pdata, vect)|sluargs_t *pdata, vector vect|加载string数组| |LOADDATA_DUB_ARR(pdata, vect)|sluargs_t *pdata, vector vect|加载double类型数组| |LOADDATA_INT_ARR(pdata, vect)|sluargs_t *pdata, vector vect|加载int类型数组| |LOADDATA_DUB_2D_ARR(pdata, vvect)|sluargs_t *pdata, vector> vvect|加载double类型二维数组| |LOADDATA_DUB_2D_ARR(pdata, vvect)|sluargs_t *pdata, vector> vvect|加载int类型二维数组| |OBJLOADDATA_PRELOAD(pdata)|sluargs_t *pdata|Object对象数据预加载| |OBJLOADDATA_DUB(key, data)|char * key, double data|加载对象key对应的double数据| |OBJLOADDATA_INT(key, data)|char * key, int data|加载对象key对应的int数据| |OBJLOADDATA_DUB_ARR(key, vect)|char * key, vector vect|加载对象key对应的double数组| |OBJLOADDATA_INT_ARR(key, vect)|char * key, vector vect|加载对象key对应的int数组| |OBJLOADDATA_DUB_2D_ARR(key, vvect)|char * key, vector> vvect|加载对象key对应的double二维数组| |OBJLOADDATA_INT_2D_ARR(key, vvect)|char * key, vector> vvect|加载对象key对应的int二维数组| |OBJLOADDATA_STR(key, str)|char * key, string str|加载对象key对应的string数据| |OBJLOADDATA_STR_ARR(key, vect)|char * key, vector vect|加载对象key对应的string数组| 现在,请享受它吧 :) ## 参与Letscode 欢迎提交或PR,让我们一起Letscode。 [gn official page]:https://gn.googlesource.com/gn/ [gn download url]:https://chrome-infra-packages.appspot.com/dl/gn/gn/linux-amd64/+/latest [ninja official page]:https://ninja-build.org/ [ninja download url]:https://github.com/ninja-build/ninja/releases [cmake official page]:https://cmake.org/ [cmake download page]:https://cmake.org/download/ [gtest official page]:https://google.github.io/googletest/ [gtest source code]:https://github.com/google/googletest [leetcode official page]:https://leetcode-cn.com