2010-04-24 49 views
11

Deje L= { w in (0+1)* | w has even number of 1s}, es decir, L es el conjunto de todas las cadenas de bits con número par de 1s. ¿Cuál de las siguientes expresiones regulares representa L?Expresión regular para cadenas de bits con número par de 1s

A) (0 * 10 * 1) *
B) 0 * (10 * 10 *) *
C) 0 * (10 * 1) * 0 *
D) 0 * 1 (10 * 1) * 10 *

De acuerdo a mí la opción D nunca es correcta porque no representa la cadena de bits con cero 1s. Pero, ¿y las otras opciones? Nos preocupa la cantidad de 1s (pares o no), no importa la cantidad de ceros.

Entonces, ¿cuál es la opción correcta y por qué?

+0

Tenga en cuenta que estas no son las expresiones regulares de búsqueda de cadenas; estas son expresiones regulares que coinciden con el idioma. Así que recuerda anclarlos cuando pruebes. –

Respuesta

9

A si es falso. No se corresponde con 0110 (o cualquier cadena no vacía de ceros solamente)

B representa OK. No me molestaré en probarlo aquí ya que los márgenes de la página son demasiado pequeños.

C no quede igualada por 010.101.010 (cero en el medio no está adaptada)

D como usted ha dicho no llega acompañado de 00 o cualquier otro # sin queridos.

lo tanto, sólo B

+2

+1 para la referencia de Fermat –

+0

A tampoco coincide con '0 *' – BCS

+0

La cadena "' 000' "tiene un número par de 1s (cero 1s) pero la expresión regular A no coincide. (Creo que debería haber dicho que la expresión regular A no coincide con '0 +', ya que obtiene la cadena vacía). --- Lo señalé porque es un caso de esquina importante que no se ha mencionado y lo hice * aquí * porque no creí que valiera la pena su propia respuesta. – BCS

0

buscar ejemplos que deben coincidir pero no lo hacen. 0, 11011, y debe 1100 todo el partido, pero cada uno de ellos falla por uno de los cuatro

0

C es incorrecta porque no permite ningún 0s entre 1 segundo de un grupo y la primera 1 del siguiente grupo.

-1

un script en Python rápida en realidad elimina todas las posibilidades:

import re 

a = re.compile("(0*10*1)*") 
b = re.compile("0*(10*10*)*") 
c = re.compile("0*(10*1)* 0*") 
d = re.compile("0*1(10*1)* 10*") 

candidates = [('a',a),('b',b),('c',c),('d',d)] 
tests = ['0110', '1100', '0011', '11011'] 
for test in tests: 
    for candidate in candidates: 
     if not candidate[1].match(test): 
      candidates.remove(candidate) 
      print "removed %s because it failed on %s" % (candidate[0], test) 

ntests = ['1', '10', '01', '010', '10101'] 
for test in ntests: 
    for candidate in candidates: 
     if candidate[1].match(test): 
      candidates.remove(candidate) 
      print "removed %s because it matched on %s" % (candidate[0], test) 

la salida:

  • quitado C, ya que falló en 0110
  • eliminado d, ya que falló en 0110
  • eliminado un porque coincidió en 1
  • eliminado b porque coincidía en 10
+0

El hecho de que no hayas desmentido a B, no significa que hayas probado B. Un buen esfuerzo, sin embargo, solo una lógica falaz. – polygenelubricants

+0

oops, mi mal. al anclar las expresiones (poniendo cada una entre un^y un $), el único que sobrevive es B. por supuesto, todavía tendría que probarlo ... –

+0

No creo que los espacios en blanco dentro de las expresiones regulares se supone que cuentan. Deberías volver a ejecutarlo con espacios en blanco ignorados. – Gabe

2

Para resolver tal problema que debiera

  1. suministro patrones contraejemplo a todas las expresiones regulares "incorrectas". Esta será una cadena en L que no se corresponde, o una cadena coincidente de L.
  2. Para probar el patrón "correcto" restante, que debe responder a dos preguntas:

    • ¿Cada cadena que coincide con el patrón pertenecen a L? Esto se puede hacer ideando propiedades que cada cadena coincidente debería satisfacer, por ejemplo, el número de ocurrencias de algún carácter ...
    • ¿Se corresponden todas las cadenas en L con la expresión regular?Esto se hace dividiendo L en subclases fácilmente analizables, y mostrando que cada uno de ellos coincide con el patrón de su propia manera.

(No hay respuestas concretas debido a [tarea]).

1

Análisis del patrón de B:

^0*(10*10*)*$ 

^   # match beginning of string 
0*   # match zero or more '0' 
(   # start group 1 
10*  # match '1' followed by zero or more '0' 
10*  # match '1' followed by zero or more '0' 
)*   # end group 1 - match zero or more times 
$   # end of string 

Es bastante obvio que este patrón sólo coincidirá cadenas que tienen 0,2,4, ... 1 's.

0

Esta respuesta sería mejor para este lenguaje

(0*10*10*) 
+0

¿Podría darnos algunos detalles? Una opinión generalmente no es suficiente. –

+0

Su expresión no coincide con 011011. Debe decir: (0 * 10 * 10 *) *, que no es mejor que 0 * (10 * 10 *) * – AnthonyW

Cuestiones relacionadas