[Codewars] 084: Binary multiple of 3

题目

In this kata, your task is to create a regular expression capable of evaluating binary strings (strings with only 1s and 0s) and determining whether the given string represents a number divisible by 3.

Take into account that:

  • An empty string might be evaluated to true (it's not going to be tested, so you don't need to worry about it - unless you want)
  • The input should consist only of binary digits - no spaces, other digits, alphanumeric characters, etc.
  • There might be leading 0s.

Examples (Javascript)

  • multipleof3Regex.test('000') should be true
  • multipleof3Regex.test('001') should be false
  • multipleof3Regex.test('011') should be true
  • multipleof3Regex.test('110') should be true
  • multipleof3Regex.test(' abc ') should be false

You can check more in the example test cases

Note

There's a way to develop an automata (FSM) that evaluates if strings representing numbers in a given base are divisible by a given number. You might want to check an example of an automata for doing this same particular task here.

If you want to understand better the inner principles behind it, you might want to study how to get the modulo of an arbitrarily large number taking one digit at a time.

我的答案

PATTERN = re.compile(r'^((((0+)?1)(10*1)*0)(0(10*1)*0|1)*(0(10*1)*(1(0+)?))|(((0+)?1)(10*1)*(1(0+)?)|(0(0+)?)))$')

这道题真没想出来,参考大神的答案

其他精彩答案

PATTERN = re.compile(r'^(0|1(01*0)*1)*$')
'''
000 => 0 True
001 => 1 False
011 => 3 True
111 => 7 False
1100 = True

R = Q + RP => R = QP*

A = 1B + 0A
B = 1A + 0C
C = 1C + 0B

C = 1C + 0B => C => 1*0B
B = 1A + 0C => B = 01*0B + 1A => B = (01*0)*1A
A = 1B + 0A => A = 1(01*0)*1A + 0A => (1(01*0)*1|0)*

'''
PATTERN = re.compile(r'^([1]([0][1]*[0])*[1]|[0])*$')
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容