задача
Определите простое регулярное выражение как непустое регулярное выражение, состоящее только из
- персонажи
0
и1
, - группировка скобок
(
и)
, - один или более квантификатор повторения
+
.
Учитывая непустую строку 0
s и 1
s, ваша программа должна найти самое короткое простое регулярное выражение, соответствующее полной входной строке. (То есть, когда вы сопоставляете простое регулярное выражение, представьте, что оно добавлено ^
и $
.) Если имеется несколько кратчайших регулярных выражений, выведите любое или все из них.)
Code-Golf , поэтому выигрывает самое короткое представление (в байтах).
Контрольные примеры
1 -> 1
00 -> 00 or 0+
010 -> 010
1110 -> 1+0
01010 -> 01010
0101010 -> 0(10)+ or (01)+0
011111 -> 01+
10110110 -> (1+0)+
01100110 -> (0110)+ or (01+0)+
010010010 -> (010)+
111100111 -> 1+001+ or 1+0+1+
00000101010 -> 0+(10)+ or (0+1)+0
1010110001 -> 1(0+1+)+ or (1+0+)+1
01100110
интересный случай ... наивный алгоритм написал бы01+0+1+0
или(0+1+)+0
неоптимальный.Ответы:
Pyth, 20 байт
Это займет примерно 30 секунд, поэтому его нужно запустить в автономном режиме.
Объяснение:
Я не совсем уверен, что каждая самая короткая строка является подпоследовательностью "() 01+" * 4, но 4 может быть увеличено до 9 без стоимости байта, если это необходимо.
источник
JavaScript (ES6),
488341 байтОбъяснение: Поскольку шесть регулярных выражений могут выражать все возможные двоичные слова, а два самых длинных имеют длину девять символов, достаточно проверить эти и все более короткие регулярные выражения. Очевидно, что одним из кандидатов является строка с «кодировкой длины серии» (т. Е. Все
+
последовательности цифр заменены на соответствующие s), но также()
необходимо проверить строки с одним набором s. Я генерирую 1596 таких регулярных выражений (включая дубликаты и бесполезные регулярные выражения, но они будут просто удалены) и проверяю все 1597, чтобы определить, какое совпадение является самым коротким. Сгенерированные регулярные выражения делятся на два типа:\(\d{2,5}\)\+
(60 регулярных выражений) и(\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?
(1536 регулярных выражений, поскольку я избегаю генерировать регулярные выражения как с начальной, так и с конечной цифрой).источник
Pyth -
313029 байтГрубая сила! Может быть, гольф-итератор немного.
Тестовый пакет .
источник
Рубин, 109 байт
Это скучный метод грубой силы. Работает, потому что никакое регулярное выражение никогда не должно быть длиннее 9 символов (как отмечает Нил), и нет необходимости повторять отдельный символ более 4 раз (попытка сделать это
'01()+'.chars*9
сделала мой процессор несчастным).источник
Python 3, 186 байт
Я выясняю, есть ли подход к этой проблеме, кроме грубого принуждения, но здесь пока есть грубое силовое решение Python.
источник