Math 计算长度为N的所有可能的计算机程序

Math 计算长度为N的所有可能的计算机程序,math,programming-languages,combinatorics,Math,Programming Languages,Combinatorics,我将使用Javascript作为语言使其易于理解 使用ascii作为字母表,并给出所有可能的长度为N的“语句”,使用ascii形成,有多少将是一个有效的JS程序。长度8的示例 var i=0; //Is a string 8 characters long, and valid JS jar i=0; //Is a string 8 characters long, but invalid JS gfjsjhh3 //Is a string 8 characters long, but inva

我将使用Javascript作为语言使其易于理解

使用ascii作为字母表,并给出所有可能的长度为N的“语句”,使用ascii形成,有多少将是一个有效的JS程序。长度8的示例

var i=0; //Is a string 8 characters long, and valid JS
jar i=0; //Is a string 8 characters long, but invalid JS
gfjsjhh3 //Is a string 8 characters long, but invalid JS
now imagine we have all possible strings 8 characters long. 
How many will be valid JS?
其他规则:

1) 变量尽可能短

2) 除非必要,否则不得留空格

问题的更正式定义:

如果我们得到字母K的语法G,以及长度为N的所有可能组合(语句)的集合,这些组合(语句)可以由K(或K*到长度为N)构成,那么有多少语句满足语法G


我知道你认为这是一些学术性的,脱离现实的东西。但是,如果作为程序的语句的数量远小于组合的总数,您可以使用小的“数字”来表示这些稀疏程序出现在组合海中的位置,并能够发送此“地址”而不是整个程序,大大减少有效负载

语法通常只是有效性检查的一个方面,请查看ES6。语法很难满足你“尽可能短”的要求。但是语法是一个很好的推理工具,所以让我们集中精力。它仍然允许使用无效的程序和具有长变量名的程序,但作为概念证明的起点(无论您的概念是什么),它应该足够了

您可以首先考虑基于JS的一些语法。类似于ES6标准的§11至§15部分,但请确保您使用的语法是向下到字符级别的,而不是将整个标识符视为单个终端。对于假设的压缩scheem,如果在树的每个节点对选择进行编码,则会产生类似于所描述的压缩效果的效果

为了计算给定长度的程序数量,您可以使用BNF规则。所以如果你有一条规则

IndexedMemberExpression ::= MemberExpression '[' Expression ']'
(松散地模仿ES6)然后您知道长度为n的
IndexedMemberExpression
由长度为i的
MemberExpression
和长度为n的
表达式组成− 我− 2,大约0≤ 我≤ N− 如果你知道有多少种表达方式,你就知道整个表达方式。对于每个BNF非终结符,有一个长度为1000的数组,按长度递增的顺序填充,就可以得到根规则的派生树(即语法正确的程序)的数量

实际上IndexedMemberExpression只是MemberExpression的一种,您需要将所有这些加起来。所以更像这样:

为每个非终端分配一个1000码的arry,
并将所有元素初始化为零
对于从0到1000的n:
…
#首先计算主表达式[n]
#规则MemberExpression::=PrimaryExpression
MemberExpression[n]=PrimaryExpression[n]
#规则MemberExpression::=MemberExpression'['表达式']'
如果n>=2:
对于从0到n-2的i:
MemberExpression[n]+=MemberExpression[i]*表达式[n-i-2]
#规则MemberExpression::=MemberExpression'.'标识符名称
如果n>=1:
对于从0到n-1的i:
MemberExpression[n]+=MemberExpression[i]*IdentifierName[n-i-1]
…
对所有规则执行此操作,顺序确保在第一次在右侧使用增量之前,完全更新增量左侧的每个非端子


请注意,对于几乎任何长度为n的字符序列,对应的字符串文字将是长度为n+2的有效JS表达式。因此,不要期望有效程序的数量与任意字符序列的数量有根本不同的渐近行为。

请澄清您的要求。你是说由2个字符组成的变量是不允许的吗?不同的注释内容会使代码不同吗?另外,到目前为止,您在这个问题上做了哪些工作?您是否真的希望得到一个封闭公式的答案,例如“长度为N^3+52^(N/2)+…”?语法通常只是有效性检查的一个方面。而且很难满足您“尽可能短”的要求。我想你可以先考虑一下基于JS的语法。如果对树的每个节点进行编码,就会产生类似于所描述的压缩效果的效果。它仍然允许使用无效程序和长变量名的程序,但作为概念证明的起点(无论您的概念是什么),它应该足够了。为了避免误解,JavaScript不使用ASCII。@TomBlodget查看ASCII表,我看到了组成有效JS程序的所有符号(、[、(、+、-)等)