本网站由以下捐款支持:OEIS基金会.

T文件提案

来自OeisWiki
跳转到:航行,搜索

这是一个名为t文件用于列出高维阵列的项,包括三角形、金字塔和不规则阵列;也就是说,由一组有序整数而不是单个整数索引的整数集合。这是b文件格式。

动机

这种文件格式的动机是为二维和多维数组(包括不规则数组)提供灵活的机器可读描述。

数据库中有大量“线性化”形式的数组序列(通常由关键字表示标签). 这个数据字段抵消字段甚至b文件都无法以原始的高维形式提供对此类序列的足够描述,因此例子评论字段通常用于此目的。然而,这里给出的描述不是机器可读的,因此如果要处理此类序列的数据,他们应该解析b文件并将其重新解释为数组。

对于不同的序列,应该以不同的方式进行重新解释,并且始终需要有关索引偏移量、行长度等的外部信息(相对于b文件)。因此,有一种统一的方式以自然形式存储有关这些序列的信息会方便得多。t-file就是这样一种方式。

此外数据b文件也不能包含间隙。

请参阅下面的具体示例从使用t文件中受益的序列。

接受该提案意味着要实现一个特殊接口,用于将t文件上传到OEIS,该接口将检查上传的t文件的有效性,并鼓励贡献者使用t文件而不是b文件来处理高维序列。下一步将是在t文件中搜索的工具。

t文件规范

常规属性

本规范不包括t文件的名称,因为它只与文件的内容有关。

建议文件的编码为UTF-8,不带BOM,建议换行符为换行符(Unix样式)。在服务器处理t文件期间,可以强制执行这两个功能;即。,从不保证保留非推荐编码或换行标记。

非7位ASCII字符只能在注释内使用(见下文),减号除外,建议不要使用它们。

结构

任何一行都允许使用前导和尾随空白字符。

任何一行都可以包含以“#“(建议下一个符号应为空格,因为t文件格式的未来扩展可能会使用以开头的注释”#“后跟一些非空格符号);所有字符来自”#“到行尾。

除了前导和尾随的空白和注释之外,任何行都必须是空行或包含以下内容的数据行d日+1个由空格字符分隔的整数,其中d日是数组的维数;d日对整个序列来说都是一样的。有关数据线的注释,请参见下文。

这些线可以以任何顺序跟随。建议任何一行的长度都不超过1000个字符。建议在最后一行末尾使用尾随换行符号,并可在服务器处理t文件期间强制使用。

数据线

数据行中的整数必须由一个十进制数字字符串表示,也可以在前面加上连字符“-“U+002D(或减号”“U+2212,不建议使用)解释为一元减号。

第一个d日数据线的编号是索引,最后一个是术语。例如,对于二维数组A(n,k)数据行中的数字顺序必须为“n千安(n,k)".不能有两条数据线具有相同的索引集。必须至少有一条数据线。

关于数据线顺序的建议

数据线的顺序可以是任意的。索引顺序的选择取决于序列的定义。然而,有一些建议:

  • 如果一个索引可以固定一些索引的值,而其他索引变得有界(例如,对于三角形的特定行数,行中的项数是有界的),那么有界索引会排在最后,它们一起遍历所有可能的值,同时其他索引是固定的(例如,三角形和按层排列的不规则数组);
  • 对于无界指数,请对其进行绑定
    • 通过一些常数(例如,对于无限二维数组,首先给出N个某些项的每行数N个)
    • 或使用指数和恒定的切片(例如,反对偶的无限二维数组);
  • 在给定的有界索引域内,使用
    • 词典的升序,
    • 或按字典顺序降序排列,
    • 或者也可以使用具有恒定和的切片(请参见A144625号);
  • 或者,具有相同术语值的行可以组合在一起,或者可以使用基于术语值的一些其他原则。

有效t文件示例

b文件

任何有效的b文件,甚至松散b文件也是有效的t文件。然而,对于高维序列,将b文件解释为t文件在语义上是错误的。

如果想要在一维序列中使用t文件而不是b文件,建议使用单个表格而不是空格作为分隔符(满足松散的b文件格式),以便可以轻松复制文件或其部分并粘贴到电子表格中。

A231473型

3 0 13 1 24 0 14 1 25 0 15 1 46 0 16 1 46 2 47 0 17 0 67 0 9# …

A143796号

0 0 10 1 20 2 30 3 40 4 50 5 60 6 70 7 80 8 90 9 101 0 21 1 31 2 41 3 51 4 61 5 71 6 81 7 91 8 101 9 112 0 32 1 52 2 72 3 92 4 112 5 132 6 152 7 172 8 192 9 213 0 53 1 133 2 293 3 613 4 1253 5 2533 6 5093 7 10213 8 20453 9 40934 0 134 1 655335 0 65533

A054760号

#根据Brouwer的说法2 3	32 4	42 5	52 6	62 7	72 8	82 9	92 10	102 11	112 12	123 3	43 4	63 5	103 6	143 7	243 8	303 9	583 10	703 11	1123 12	1264 3	54 4	84 5	194 6	264 7	674 8	804 12	7285 3	65 4	105 5	305 6	425 8	1705 12	27306 3	76 4	126 5	406 6	626 8	3126 12	78127 3	87 4	147 5	507 6	90

A035513号

0 0	10 1	20 2	31 0	40 3	52 0	61 1	70 4	83 0	92 1	10# …

A046816号

0 0 0 1#切片0#第1层:1 0 0	1 0 1 0	1 0 0 1	1 #第2条(本例中线条的自然顺序):2 0 0	10 2 0	10 0 2	11 1 0	21 0 1	20 1 1	2#第3条(行的字典降序):3 0 0	12 1 0	32 0 1	31 2 0	31 1 1	61 0 2	30 3 0	10 2 1	30 1 2	30 0 3	1# …

A113198型

0 0 1  11 1 0  12 2 2  23 2 0  23 3 2  44 2 0  24 3 0  24 3 2  84 4 2  85 2 0  15 3 0  85 3 2  125 3 3  45 4 0  45 4 2  285 5 2  16

A189225号

# …4 0 0 0    14 1 0 0    44 1 1 0    44 1 1 1    44 2 0 0    64 2 1 0    124 2 1 1    124 2 2 0    64 2 2 1    124 2 2 2    64 3 0 0    44 3 1 0    124 3 1 1    124 3 2 0    124 3 2 1    244 3 2 2    124 3 3 0    44 3 3 1    124 3 3 2    124 3 3 3    44 4 0 0    14 4 1 0    44 4 1 1    44 4 2 0    64 4 2 1    124 4 2 2    64 4 3 0    44 4 3 1    124 4 3 2    124 4 3 3    44 4 4 0    14 4 4 1    44 4 4 2    64 4 4 3    44 4 4 4    1

A191358号

#由于不允许可变长度的索引集,因此每个子序列P(s,r)中的项都是线性索引的。# …5 4 69  45 4 70  14 5 1   14 5 2   54 5 3   54 5 4   54 5 5   10# …

t文件解析器示例

这个Python脚本应该可以处理任何有效的t文件。应该对Python 2和3都有效。请注意解析不安全功能。

定义解析(f):“”将t文件解析为dict。假设f是一个打开以供读取的t文件,将其解析为dict,其中键是索引元组。如果f不是有效的t文件,则返回None。“”d=无a={}对于f中的行:如果第行中有“#”:line=line[:line.index('#')]line=line.strip().replace(u'\u2212','-')如果不是行:持续尝试:numbers=元组(line.split()中x的int(x))除ValueError:return无如果d为无:d=长度(数字)-1如果d<1:return无elif len(数字)-1!=日期:return无索引,值=数字[:d],数字[d]如果a中的索引:return无a[指数]=值返回if a else无定义parse_unsafe(f):“”将有效的t文件解析为dict。假设f是带连字符的有效t文件打开以供读取,将其解析为dict,其中键是索引元组。如果f不是有效的t文件,则失败或返回垃圾。“”a={}对于f中的行:如果第行中有“#”:line=line[:line.index('#')]line=line.strip()如果不是行:持续numbers=元组(line.split()中x的int(x))索引,值=数字[:-1],数字[-1]a[指数]=值返回a定义print2Darray(a):“”打印存储为dict的2D数组。假设a是parse()解析的t文件描述二维数组,将其打印为表。假设这些术语短于一个表格。数组的某些元素可能不存在。“”最小行、最大行、最小列、最大列=(min(i[0]代表a中的i),max(i[0]对于a中的i),min(i[1]代表a中的i),max(i[1]代表a中的i))对于范围内的行(最小行,最大行+1):线=“”对于范围内的色谱柱(minrow,maxcol+1):i=(行,列)如果我在a中:行+=str(a[i])行+=“\t”打印(行)定义嵌套列表(a):“”“将存储为dict的数组转换为嵌套列表。”“”对于a中的i:d=长度(i)打破minindices=[min(i[dim]for i in a)for dim in range(d)]结果=[]对于a中的i:add_element(结果,a[i],i,minindices)返回结果定义add_element(a,el,ind,minind):“”“辅助递归函数:向嵌套列表中添加元素。”“”ind,ind2=ind[0]-minind[0],ind[1:]如果ind<0:提升值错误如果ind2:如果len(a)<=ind:a+=[[]对于范围内的_(ind-len(a)+1)]add_element(a[ind],el,ind2,minind[1:])其他:如果len(a)<=ind:a+=[无]*(ind-len(a)+1)a[ind]=el打开('-file.txt')为f:a=解析(f)如果a为“无”:print('分析t-file时出错')其他:对于a中的i:d=长度(i)打破如果d==2:打印2Darray(a)

通过特殊注释进行可能的扩展

有很多扩展可以考虑。其中一些甚至可以在最初讨论格式时强制使用(但这会破坏与b文件的兼容性)。

  • 表单的注释#d=<数字>可以放在任何数据行之前,以指示数组的维数。
  • 表单的注释#A000001号可以指示序列的A号。
  • 评论#完全可能表示t文件包含完整序列。
  • 最好有一种方法来区分无限的数组行(当然,有有限的可用数据)和实际有限的行。

可能的替代方案

尽管此t文件提案具有与b文件格式兼容和相对简单的优点,但更好的选择可能是使用一些现有的、广泛使用的格式的受限版本,如CSV公司.