Tâche
Définissez une expression régulière simple comme une expression régulière non vide composée uniquement de
- personnages
0
et1
, - regrouper les parenthèses
(
et)
, - un ou plusieurs quantificateurs de répétition
+
.
Étant donné une chaîne non vide de 0
s et 1
s, votre programme devrait trouver l'expression rationnelle simple la plus courte correspondant à la chaîne d'entrée complète . (C'est-à-dire, lorsque vous associez une expression régulière simple, faites comme si elle était reliée par ^
et $
.) S'il y a plusieurs expressions rationnelles les plus courtes, imprimez-en une ou toutes.)
code-golf , donc la soumission la plus courte (en octets) gagne.
Cas de test
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
c'est un cas intéressant ... un algorithme naïf écrirait01+0+1+0
ou(0+1+)+0
qui n'est pas optimal.Réponses:
Pyth, 20 octets
Cela prend environ 30 secondes pour s'exécuter, il doit donc être exécuté hors ligne.
Explication:
Je ne suis pas complètement sûr que chaque chaîne la plus courte soit une sous-séquence de "() 01+" * 4, mais 4 peut être augmenté à 9 sans coût en octets si nécessaire.
la source
JavaScript (ES6),
488341 octetsExplication: Étant donné que six expressions rationnelles peuvent exprimer tous les mots binaires possibles et que les deux plus longs ont neuf caractères, il suffit de les vérifier ainsi que toutes les expressions rationnelles plus courtes. Un candidat est évidemment la chaîne avec "l'encodage de la longueur de la séquence" (c'est-à-dire que toutes les séries de chiffres sont remplacées par des
+
s appropriés ), mais aussi les chaînes avec un ensemble de()
s doivent être vérifiées. Je génère 1596 telles expressions régulières (cela inclut les doublons et les expressions rationnelles inutiles mais elles seront simplement éliminées) et teste toutes les 1597 pour voir quelle est la correspondance la plus courte. Les expressions régulières générées se répartissent en deux types:\(\d{2,5}\)\+
(60 expressions régulières) et(\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?
(1536 expressions régulières, car j'évite de générer des expressions régulières avec des chiffres à la fois de début et de fin).la source
Pyth -
313029 octetsForce brute! Peut probablement jouer un peu à l'itérateur.
Suite de tests .
la source
Rubis, 109 octets
C'est l'approche ennuyeuse de la force brute. Fonctionne car aucune expression régulière n'a besoin de plus de 9 caractères (comme le note Neil) et aucun caractère individuel n'a besoin d'être répété plus de 4 fois (l'essayer avec a
'01()+'.chars*9
rendu mon CPU mécontent).la source
Python 3, 186 octets
J'étudie s'il existe une approche à ce problème en plus du forçage brutal, mais voici une solution de force brute Python pour l'instant.
la source