Zadanie
Zdefiniuj proste wyrażenie regularne jako niepuste wyrażenie regularne składające się tylko z
- znaków
0
i1
, - grupowanie nawiasów
(
i)
, - jeden lub więcej kwantyfikatorów powtórzeń
+
.
Biorąc niepusty ciąg 0
s oraz 1
s, Twój program powinien znaleźć najkrótszą proste regex pasujący do pełnego wejścia ciąg. (Oznacza to, że dopasowując proste wyrażenie regularne, udawaj, że jest ono zarezerwowane przez ^
i $
.) Jeśli istnieje wiele najkrótszych wyrażeń regularnych , wydrukuj jeden lub wszystkie z nich.)
code-golf , więc wygrywa najkrótsze przesłanie (w bajtach).
Przypadki testowe
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
jest interesujący przypadek ... naiwny algorytm zapisałby01+0+1+0
lub(0+1+)+0
który nie jest optymalny.Odpowiedzi:
Pyth, 20 bajtów
Uruchomienie zajmuje około 30 sekund, więc musi być uruchomione w trybie offline.
Wyjaśnienie:
Nie jestem całkowicie pewien, że każdy najkrótszy ciąg jest podsekwencją „() 01+” * 4, ale w razie potrzeby 4 można zwiększyć do 9 bez żadnych bajtów.
źródło
JavaScript (ES6),
488341 bajtówObjaśnienie: Ponieważ sześć wyrażeń regularnych może wyrazić wszystkie możliwe słowa dwójkowe, a najdłuższe dwa mają dziewięć znaków, wystarczy sprawdzić te i wszystkie krótsze wyrażenia regularne. Jednym kandydatem jest oczywiście ciąg znaków z „kodowaniem długości przebiegu” (tzn. Wszystkie przebiegi cyfr zastąpione odpowiednimi
+
s), ale należy również()
sprawdzić ciągi z jednym zestawem s. Generuję 1596 takich wyrażeń regularnych (obejmuje to duplikaty i niepotrzebne wyrażenia regularne, ale zostaną one po prostu wyeliminowane) i testuję wszystkie 1597, aby zobaczyć, który jest najkrótszy. Wygenerowane wyrażenia regularne dzielą się na dwa typy:\(\d{2,5}\)\+
(60 wyrażeń regularnych) i(\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?
(1536 wyrażeń regularnych, ponieważ unikam generowania wyrażeń regularnych z cyframi wiodącymi i końcowymi).źródło
Pyth -
313029 bajtówBrutalna siła! Prawdopodobnie trochę golfa iterator.
Pakiet testowy .
źródło
Rubin, 109 bajtów
To nudne podejście brutalnej siły. Działa, ponieważ żadne wyrażenie regularne nigdy nie musi być dłuższe niż 9 znaków (jak zauważa Neil) i żadna indywidualna postać nie musi być powtarzana więcej niż 4 razy (próbowanie z tym
'01()+'.chars*9
sprawiło, że mój procesor był niezadowolony).źródło
Python 3, 186 bajtów
Badam, czy istnieje podejście do tego problemu oprócz brutalnego forsowania, ale oto na razie rozwiązanie brutalnej siły Pythona.
źródło