Aufgabe
Definieren Sie einen einfachen regulären Ausdruck als einen nicht leeren regulären Ausdruck, der nur aus besteht
- Zeichen
0
und1
, - Gruppierungs Klammern
(
und)
, - ein oder mehrere Wiederholungsquantifizierer
+
.
Bei einer nicht leeren Zeichenfolge von 0
s und 1
s sollte Ihr Programm den kürzesten einfachen regulären Ausdruck finden, der mit der vollständigen Eingabezeichenfolge übereinstimmt . (Wenn Sie also einen einfachen regulären Ausdruck zuordnen, tun Sie so, als wäre er mit ^
und verbucht $
.) Wenn es mehrere kürzeste reguläre Ausdrücke gibt, drucken Sie einen oder alle aus.)
Code-Golf , so dass die kürzeste Einreichung (in Bytes) gewinnt.
Testfälle
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
ist ein interessanter Fall ... ein naiver Algorithmus würde schreiben01+0+1+0
oder(0+1+)+0
welche sind nicht optimal.Antworten:
Pyth, 20 Bytes
Die Ausführung dauert ungefähr 30 Sekunden, daher muss sie offline ausgeführt werden.
Erläuterung:
Ich bin mir nicht ganz sicher, ob jede kürzeste Zeichenfolge eine Untersequenz von "() 01+" * 4 ist, aber 4 kann bei Bedarf ohne Bytekosten auf 9 erhöht werden.
quelle
JavaScript (ES6),
488341 ByteErläuterung: Da sechs reguläre Ausdrücke alle möglichen binären Wörter ausdrücken können und die längsten zwei neun Zeichen lang sind, ist es ausreichend, diese und alle kürzeren regulären Ausdrücke zu überprüfen. Ein Kandidat ist natürlich der String mit "Lauflängencodierung" (dh alle Ziffernläufe werden durch entsprechende
+
s ersetzt), aber auch Strings mit einem Satz von()
s müssen überprüft werden. Ich generiere 1596 solcher Regexes (dies schließt Duplikate und nutzlose Regexes ein, aber sie werden einfach eliminiert) und teste alle 1597, um zu sehen, welches die kürzeste Übereinstimmung ist. Die generierten regulären Ausdrücke lassen sich in zwei Typen unterteilen:\(\d{2,5}\)\+
(60 reguläre Ausdrücke) und(\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?
(1536 reguläre Ausdrücke, da ich die Generierung von regulären Ausdrücken mit führenden und nachfolgenden Ziffern vermeide.quelle
Pyth -
313029 BytesRohe Gewalt! Kann den Iterator wahrscheinlich ein wenig Golf spielen.
Test Suite .
quelle
Ruby, 109 Bytes
Es ist der langweilige Brute-Force-Ansatz. Funktioniert, weil kein regulärer Ausdruck länger als 9 Zeichen sein muss (wie Neil bemerkt) und kein einzelnes Zeichen mehr als 4 Mal wiederholt werden muss (wenn
'01()+'.chars*9
ich es mit meiner CPU probiere , wird meine CPU unglücklich).quelle
Python 3, 186 Bytes
Ich untersuche, ob es für dieses Problem neben dem Brute-Force-Ansatz noch einen Ansatz gibt, aber hier ist eine Python-Brute-Force-Lösung für den Moment.
quelle