Thursday, 30 November 2017

Dfa divisible by $ 5 binary options


Estou auto-estudando expressões regulares e encontrei um interessante problema de prática on-line que envolve escrever uma expressão regular para reconhecer todos os números binários divisíveis por 3 (e apenas esses números). Para ser honesto, o problema pediu para construir um DFA para tal cenário, mas eu pensei que deveria ser equivalentemente possível usando expressões regulares. Eu sei que há uma regra pouco no lugar para descobrir se um número binário é divisível por 3: tomar o número de uns em lugares parados no dígito e subtrair pelo número de uns em lugares ímpares no dígito - se este for igual a zero , O número é divisível por 3 (exemplo: 110 - 1 no mesmo 2 slot e 1 no odd 1 slot). No entanto, estou tendo alguns problemas para adaptar isto a uma expressão regular. O mais próximo Ive vem é perceber que o número pode ser 0, de modo que seria o primeiro estado. Eu também vi que todos os números binários divisíveis por 3 começam com 1, de modo que seria o segundo estado, mas Im preso a partir de lá. Alguém poderia ajudar out perguntou Mar 11 13 às 1:50 Seguindo o que Oli Charlesworth diz, você pode construir DFA para divisibilidade de base b número por um certo divisor d. Onde os estados no DFA representam o restante da divisão. Para o seu caso (base 2 - número binário, divisor d 3 10): Observe que o DFA acima aceita cadeia vazia como um número divisível por 3. Isso pode ser facilmente corrigido adicionando um estado intermediário mais na frente: Conversão para a expressão regular teórica Pode ser feito com o processo normal. Conversão para regex prática em sabores que suporta regex recursiva pode ser feito facilmente, quando você tem o DFA. Isto é mostrado para o caso de (base b 10, d 7 10) nesta pergunta de CodeGolf. SE. Quebrando-o para baixo, você pode ver como ele é construído. O agrupamento atômico (ou não-backtracking grupo, ou um grupo que se comporta possessivamente) é usado para certificar-se apenas o vazio corda alternativa é correspondido. Este é um truque para emular (DEFINE) em Perl. Então os grupos de A a G correspondem ao restante de 0 a 6 quando o número é dividido por 7. Eu tenho outra maneira para este problema e eu acho que isso é mais fácil de entender. Quando dividimos um número por 3, podemos ter três remanescentes: 0,1,2. Podemos descrever um número que é divisível por 3 usando a expressão 3t (t é um número natural). Quando adicionamos 0 após um número binário cujo restante é 0, o número decimal real será duplicado. Porque cada dígito está se movendo para uma posição mais alta. 3t 2 6t, isto também é divisível por 3. Quando estamos adicionando um 1 após um número binário cujo restante é 0, o número decimal real será dobrado mais 1. Como cada dígito está se movendo para uma posição mais alta, seguido de um 1 3t 2 1. o restante é 1. Quando estamos adicionando um 1 após um número binário cujo restante é 1. O número decimal real será dobrado mais um, eo restante é 0 (3t 1) 2 1 6t 3 isto é divisível por 3. Quando estamos adicionando um 0 após um número binário cujo restante é 1. O número decimal real será dobrado. E o restante será 2 (3t 1) 2 6t 2. Quando estamos adicionando um 0 após um número binário cujo O restante é 2. O restante será 1. (3t 2) 2 3t 4 3 (2t 1) 1 Quando adicionamos um 1 após um número binário cujo restante é 2. Então o restante será 2. (3t 2) 2 1 t 5 3 (2t 1) 2. Não importa quantos 1 você adicionar a um número binário cujo restante é 2, o restante será 2 para sempre. (3 (t 1) 2) 2 1 3 (t 2) 5 3 (t 3) 2 respondido Nov 6 15 at 20:45

No comments:

Post a Comment