使用Regex查找二进制数是否为2的幂

时间:2019-10-21 07:55:23

标签: python regex

给出一个二进制字符串,找到一个正则表达式,该正则表达式检查转换为十进制时该二进制数是否为2的幂。 如果是,则返回True,否则返回

regularExpression = '________'

pattern = compile(regularExpression)

query = int(input())
result = ['False'] * query

for i in range(query):
    someString = input()

    if pattern.match(someString):
        result[i] = 'True'

with open(environ['OUTPUT_PATH'], 'w') as fileOut:
    fileOut.write('\n'.join(result))

2 个答案:

答案 0 :(得分:3)

由于您在使用正则表达式时遇到了一些困难,因此我假设您知道二进制字符串如何针对2的幂进行工作。

您可以使用此模式-^0*10*$

它的作用如下

  1. ^寻找字符串的开头
  2. 0 *(连续)匹配0个和0个以上字符“ 0”的实例
  3. 1匹配字符“ 1”的一个实例
  4. 0 *(连续)匹配0个和0个以上字符“ 0”的实例
  5. $匹配字符串的结尾

答案 1 :(得分:-1)

要完全回答这个问题,必须首先问自己:具有N的幂的属性是否可以通过用有限自动机解析表示该数字的字符串来解决。我对此不太确定(我在下面进行了非正式演示,但这可能是错误的,可能是数学背景比我更深的人会发现一个错误)。通过这种自动机可以实现其他属性(例如,是N的倍数,其中N是固定的有界整数)...但是您要求的该属性不可能 ...因为N个数的幂需要大量信息(按提议的数字大小的顺序排列,并且不是固定数量,如前面提到的问题,或者取决于固定数量,例如N的值,因此无法为自动机赋予固定(或更好的说,有界)状态数,例如无法确定足够大的2的幂确实是2的幂

在此命题上稍加发展,即检查数字是否为幂等所需的信息量。 2似乎取决于所讨论数字的长度(或更确切地说,大小)。如果有人有能力,只需将一个数字加一个数字,就可以考虑只用一个有界数(假设只有10个州)来确定下一个数字是否可以说出是,是 not ,则有可能为此找到一个正则表达式(这是可行的,但很难获得,但可以证明,用于固定整数的倍数)

如果您分析第一个问题(检查N的倍数),则该问题显然是有界的:您知道N的倍数是将原始数字除以N的余数为0的那些。 N个相等地分开。因此,众所周知,只有N个可能的除以N的剩余数可以...将这样一个自动机的可能状态数固定为N,而与我们可以拥有的字符串无关。在每个阶段,我们将数字乘以数字底数,然后加上下一位数字,然后减少结果mod N以获得下一个状态,该状态只能是我们在N状态下得到的状态之一开始。因此,最后我们进入一台具有有限数量状态的机器,该机器可以检测以任何基数表示的任何数字是否是任何其他定义的数字的倍数。

但是我们不能在这里应用相同的方法...每次添加数字时,我们需要确定数量是否为N的幂的信息量需要越来越多的信息。随着数量的增加,这使N的能力越来越分离,并且在达到接受状态之前需要检查越来越多的字符,并且这迫使自动机的状态数随着输入字符串的增长而增长。

有一个答案(由Karan Shishoo提出)为该问题提供了一些特殊的解决方案(嗯,的确是一种错觉)...如果您将问题限制为N与整数相同用于表示数字字符串的数字基数系统,则该数字的任何幂将在该基数中表示为100....000(这是一个数字,后跟一个不确定的零)。但这是一个谬论,因为您要使数字基数与幂基数相同,这会使输入字母取决于数字基数。您只能解析以数字为底的幂(否则,您首先需要将数字转换为以幂的以次为基)。在这种情况下,很容易找到一个1后跟任意数量的{{ 1}}之后...这确实是正常的,并由正则表达式表示:

0

(他使用了更通用的正则表达式,允许在第一个10* 字符之前可能有一个无限的前导零字符串)但这仅适用于{10}字母对于1的幂,如果要将其用于2的幂,则需要以基数3表示输入字符串,并使用字母{{{1 }},30}。

但是现在的问题是,当输入字符串是十进制基数时,是否可以用1这样的数字来实现。在拒绝2的同时,您必须接受2之类的字符串。众所周知,正整数的幂随着功率的增加而彼此之间越来越远,使得任何自动机都必须解析越来越多的数字,然后才能获得65536的幂作为输入字符串成长。这使得针入状态的数量越来越大(解析数字时,您需要遍历越来越多的状态,以获取更大的幂,并且这使得状态的数量取决于输入字符串的长度,根据定义)无限)通过荒谬的还原使得不可能存在自动机。

当然,如果您限制输入字符串的长度,则还有另一个琐碎的正则表达式(例如,对于32767和基数N而言,最大输入长度为2):

10

编辑

在上面的演示中,我犯了一个错误。我错误地认为,要获得N的下一个幂,要读取的位数将越来越多,而事实并非如此。固定直到下一个N的幂为止需要解析的位数(大约等于LOG(base,N),其中base是输入字符串的编号基础,而N是要考虑的幂。我的非正式演示,就目前而言,我再也没有其他方法可以保留它了,这仍然是一个推测,我的下一个方法是对LOG(base,N)序列集和产生这些序列的字符串集进行分类。有帮助吗?