Подтвердить что ты не робот

Кратчайшее регулярное выражение для двоичного числа с четным числом 0 или нечетным числом 1 с

Напишите выражение, содержащее четное число 0 или нечетное число 1s

Я понял:

1*(01*01*)* + 0*10*(10*10*)*

где первая часть представляет четное число 0s, а вторая часть - нечетное число 1s

Однако должно быть упрощенное решение, которое я не вижу. Любые советы?

4b9b3361

Ответ 1

Нечетная часть: 0*1(0|10*1)*

Четная часть, зависит:

  • Пустая строка верна: (1|01*0)*
  • Нет-0s равно-0s: (1|01*0)+
  • Должно быть не менее двух 0s: 1*(01*01*)+ (как в OP)

старый ответ: правильный в случае 1 и 2

(1*(01*0)*)+ | 0*1(0*(10*1)*)*

Престижность @OGHaza за полезные комментарии.

Ответ 2

Использование того факта, что строки с непрерывной длиной ВСЕГДА удовлетворяют вашим ограничениям:

^(([01]{2})*|1*(01*01*)*)$

Ответ 3

Определите "кратчайший". Если вы ищете кратчайшее время оценки (то есть самое быстрое), убедитесь, что вы не используете группы захвата.

вот пример в javascript

^(?:1*(?:01*0)*)+|0*1(?:0*(?:10*1)*)*$

который показывает на 20% быстрее, чем это выражение, которое использует группы захвата, но даст вам тот же ответ

^(1*(01*0)*)+|0*1(0*(10*1)*)*$

Ответ 4

Самое упрощенное решение, которое я нашел, это:

1+0(0+1)((1+0)(1+0))*