# pmt **Repository Path**: ryjer/pmt ## Basic Information - **Project Name**: pmt - **Description**: 组合生成器,从1个/2个文件中逐行读取,然后生成指定的行组合 - **Primary Language**: C - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-02 - **Last Updated**: 2023-03-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # pmt 组合生成器 ## 简介 pmt 是一个用于生成排列文本的工具,其可使用两组或多组数据集或文本集,生成有序或无序的排列结果 支持系统:linux ## 原理 ### 1. 单组合方阵 例如对于如下文件 a.txt,每一行视作一条记录,忽略空行(包括文件末尾空行) ```bash A B C D ``` 则其记录的完全组合可以视作一个方阵 ```bash A B C D |---------------- A| AA AB AC AD B| BA BB BC BD C| CA CB CC CD D| DA DB DC DD ``` 其输出结果如下 ```bash #pmt -i a.txt A A A B A C A D B A B B B C B D C A C B C C C D D A D B D C D D ``` 你可以指定生成这个方阵的所需部分对应的组合,然后会将结果组合使用指定分隔符(默认为制表符)分隔后打印出来。你可以使用`-o`参数指定输出文件,否则默认输出到控制台标准输出中 #### 1.1 上小三角/右上三角 方阵 这通常应用于在一个生成单一群体内部的无冗余比对组合的情景中,该情境下AB的比对是无序的,即AB组合与BA组合相同。而各个个体自身的比对(如AA)则是无意义的,即需要去除对角线上的组合。因此只需要输出如下组合结果 ```bash A B C D |---------------- A| -- AB AC AD B| -- -- BC BD C| -- -- -- CD D| -- -- -- -- ``` 在这里,你需要使用`-m` 参数指定输出的部分。这里需要输出`右上三角(right upper)`,因此使用 `-m ru` 指定输出右上三角。(提示:这里也可以使用`-m rt`即right top和`-m ys`即拼音you shang) ```bash # pmt -i a.txt -m ru A B A C A D B C B D C D ``` 或者,你也可以使用 `-o` 选项将结果输出到文件`result.txt`中,命令如下 ```bash xpmt -i a.txt -m ru -o result.txt ``` #### 1.2 下小三角/左下三角 矩阵 其实,对于上面的应用场景,输出与右上小三角对称的左下小三角也可以 ```bash A B C D |---------------- A| -- -- -- -- B| BA -- -- -- C| CA CB -- -- D| DA DB DC -- ``` 这里使用`-m lb`指示左下(left bottom),同样支持拼音模式左(zuo)下(xia)`-m zx`。运行结果如下 ```bash # xpmt -i a.txt -m lb B A C A C B D A D B D C ``` #### 1.3 上三角 矩阵 同理,你也可以选择输出上三角矩阵的组合,此时会有自我组合 ```bash A B C D |---------------- A| AA AB AC AD B| -- BB BC BD C| -- -- CC CD D| -- -- -- DD ``` 这里使用`-m u`指示上三角(upper),同样支持拼音模式上(shang)`-m s`。运行结果如下 ```bash # xpmt -i a.txt -m u A A A B A C A D B B B C B D C C C D D D ``` #### 1.4 下三角 矩阵 或者输出如下所示的下三角矩阵 ```bash A B C D |---------------- A| AA -- -- -- B| BA BB -- -- C| CA CB CC -- D| DA DB DC DD ``` 这里使用`-m bottom`指示下三角(bottom),同样支持拼音模式下(xia)`-m x`。运行结果如下 ```bash # xpmt -i a.txt -m b A A B A B B C A C B C C D A D B D C D D ``` ### 2. 双组合矩阵 对应双组合方阵,其行数往往并不相同。例如如下两个文件 `a.txt` 有3条记录 ```bash A B ``` `1.txt` 有4条记录 ```bash 1 2 3 ``` 其全组合 `a.txt` 和 `1.txt` 的矩阵如下,对于两个输入文件,默认输出全组合结果。 ```bash 1 2 3 |------------ A| A1 A2 A3 B| B1 B2 B3 ``` 或者为 `1.txt` 和 `a.txt` 的组合矩阵 ```bash A B |-------- 1| 1A 1B 2| 2A 2B 3| 3A 3B ``` 实际上整个矩阵中的组合没有冗余,结果本质上为笛卡尔积,可以直接输出结果 这里还支持使用减号`-`代指使用来自管道的标准输入作为其中一个输入,例如 ```bash # pmt -i a.txt 1.txt A 1 A 2 A 3 B 1 B 2 B 3 ``` 可以用如下两种方式实现相同效果 ```bash # cat a.txt | pmt -i - 1.txt # cat 1.txt | pmt -i a.txt - ``` ## 用法 ### 编译 本工具使用单个c文件,其位于src路径下。可以下载后直接编译 ```bash gcc main.c -o pmt ``` 编译器版本要求:需要支持中文变量名 - gcc >= 10 - clang >= 8 ### 参数 `-i -input` 输入文件,不指定的话默认使用标准输入(即来自管道)。在双文件组合中可使用 `-` 将标准输入作为一个输入文件 `-d -delimiter` (不可显示或者可显示)定界符,只作用于输出文件组合对之间,对于输入文件中的行内分界符无效。默认为不可见的制表符`\t`,如需使用逗号请使用`-d ,` `-m -matrix` 组合矩阵部分选择 若没有此参数时,输入文件为1个时输出右上小三角矩阵的组合,输入文件为2个时输出整个组合矩阵的组合。 可选以下值,不区分大小写,不区分字母顺序 - `u` Upper Triangular 或 `t` Top Triangular:上三角矩阵 - `l` Lower Triangular 或 `b` Bottom Triangular:下三角矩阵 - `tl` 或 `lt` Top Left Triangular:左上三角矩阵(不包括对角) - `tr` 或 `rt` Top Right Triangular:右上三角矩阵(不包括对角) - `bl` 或 `lb` Bottom Left Triangular:左下三角矩阵(不包括对角) - `br` 或 `rb` Bottom Right Triangular:右下三角矩阵(不包括对角) 或者为拼音模式,这里可以使用每个字的首字母 - `s` 上(shang)三角 - `x` 下(xia)三角 - `zs` 左(zuo)上(shang)三角 - `ys` 右(you)上(shang)三角 - `zx` 左(zuo)下(xia)三角 - `yx` 右(you)下(xia)三角 `-o -output ` 输出文件,不指定则默认输出到标准输出,即控制台 ## 限制 本程序会将待组合文件全部读入内存,并以**行**为单位整理到数组中。因此,首先需要保证有足够的内存来容纳待组合的一个/两个文件。 其次,受静态数组容量限制,每个待组合文件的非空行数不应大于 $2^{16}=6,5535$行。两个 $2^{16}$行的文件组合最大可达 $2^{32}$ 项结果,这已经足够绝大部分情景下使用。 ## 计划 - [x] 组合矩阵可选输出部分 - [x] `-i` 输入文件选项可以同时支持两个文件 - [x] `-o` 支持输出到指定文件 - [x] 使用减号`-`作为文件名引用来自管道的 stdin 输入作为双输入的其中一个输入 - [x] `-d`可选分隔符,不再只是使用制表符分割两条记录