2010-04-24 8 views
11

Niech L= { w in (0+1)* | w has even number of 1s}, tj. L jest zbiorem wszystkich ciągów bitów o parzystej liczbie 1s. Które z poniższych wyrażeń regularnych reprezentuje L?Wyrażenie regularne dla ciągów bitów o parzystej liczbie 1s

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

Według mnie opcja D nigdy nie jest poprawna, ponieważ nie reprezentuje ciągu znaków o wartości zero 1s. Ale co z innymi opcjami? Jesteśmy zaniepokojeni liczbą 1s (parzystą lub nie), nie liczba zer nie ma znaczenia.

To jest odpowiednia opcja i dlaczego?

+0

Zauważ, że te nie są ciąg poszukiwania wyrażeń regularnych; są to wyrazy regularne dopasowujące język. Pamiętaj więc, aby je zakotwiczyć podczas testowania. –

Odpowiedz

9

A jeśli fałsz. Nie jest dopasowywany przez 0110 (lub dowolny niepusty łańcuch zerowy)

B oznacza OK. Nie będę się tym przejmował, ponieważ marginesy strony są zbyt małe.

C nie zostanie dopasowane przez 010101010 (zero w środku nie jest dopasowany)

D jak powiedziałeś nie zostanie dopasowane przez 00 lub jakiegokolwiek innego # bez nich.

Tak tylko B

+2

+1 dla referencji Fermata! –

+0

A także nie pasuje do '0 *' – BCS

+0

Łańcuch "000" ma parzystą liczbę 1s (zero 1s), ale wyrażenie regularne nie pasuje do niego. (Chyba powinienem był powiedzieć, że wyrażenie regularne A nie pasuje do '0 +', ponieważ dostaje pusty ciąg). --- Zwróciłem na to uwagę, ponieważ to ważna sprawa w rogu, która nie została podniesiona i zrobiłem to * tutaj *, ponieważ nie sądziłem, że warto było jej odpowiedzieć. – BCS

0

Poszukaj przykładów, które powinny pasować, ale nie. 0, 11011 i 1100 powinien cały mecz, ale każdy z nich zawiedzie jeden z tych czterech

0

C jest błędna, ponieważ nie pozwala na jakiekolwiek 0s pomiędzy drugim 1 z jednej grupy i pierwszy 1 z następnej grupy.

-1

szybkie skrypt Pythona faktycznie wyeliminować wszelkie możliwości:

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) 

wyjście:

  • usunięte c ponieważ nie na 0110
  • usunięte d, ponieważ nie na 0110
  • usunięto a, ponieważ pasowało do 1
  • usunięto b, ponieważ pasowało do 10
+0

Tylko dlatego, że nie rozproszyłeś B, nie oznacza to, że udowodniłeś B. Miły wysiłek, choćby tylko błędna logika. – polygenelubricants

+0

oops, moje złe. gdy zakotwiczanie wyrażeń (umieszczanie każdego z nich pomiędzy^i a $), jedynym, który przetrwa, jest oczywiście B., nadal będziesz musiał to udowodnić ... –

+0

Nie myślę, że białe spacje w wyrażeniach regularnych mają się liczyć. Powinieneś ponownie uruchomić go, ignorując białe spacje. – Gabe

2

Aby rozwiązać taki problem zalecana

  1. Supply wzory kontrprzykład dla wszystkich "niepoprawnych" wyrażeniach regularnych. Będzie to ciąg w L, który nie jest dopasowany, lub dopasowany ciąg z L.
  2. Aby udowodnić pozostały „prawidłowy” wzorca, należy odpowiedzieć na dwa pytania:

    • Czy każdy ciąg, który pasuje do wzorca należą do L? Można tego dokonać, tworząc właściwości, które powinien spełniać każdy z dopasowanych łańcuchów - na przykład liczba wystąpień jakiegoś znaku ...
    • Czy każdy ciąg znaków w L jest dopasowany przez wyrażenie regularne?Odbywa się to poprzez podzielenie L na łatwo podlegające analizie podklasy i pokazanie, że każdy z nich dopasowuje wzór na swój własny sposób.

(brak odpowiedzi ze względu na konkretne [praca domowa)].

1

Analizując wzór 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 

Jest dość oczywiste, że ten wzór będzie pasował tylko ciągi którzy 0,2,4, ... 1 „s.

0

Ta odpowiedź byłaby najlepsza dla tego języka

(0*10*10*) 
+0

Czy możesz podać kilka szczegółów? Opinia zwykle nie jest wystarczająca. –

+0

Twoje wyrażenie nie pasuje do 011011. Powinno brzmieć: (0 * 10 * 10 *) *, które nie jest lepsze niż 0 * (10 * 10 *) * – AnthonyW