Tarea
Defina una expresión regular simple como una expresión regular no vacía que consta solo de
- personajes
0
y1
, - agrupando paréntesis
(
y)
, - cuantificador de repetición de uno o más
+
.
Dada una cadena no vacía de 0
sys 1
, su programa debería encontrar la expresión regular simple más corta que coincida con la cadena de entrada completa . (Es decir, al hacer coincidir una expresión regular simple, simule que está marcada por ^
y $
.) Si hay varias expresiones regulares más cortas, imprima una o todas ellas).
code-golf , por lo que gana el envío más corto (en bytes).
Casos de prueba
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
es un caso interesante ... escribiría un algoritmo ingenuo01+0+1+0
o(0+1+)+0
que no son óptimos.Respuestas:
Pyth, 20 bytes
Esto tarda aproximadamente 30 segundos en ejecutarse, por lo que debe ejecutarse sin conexión.
Explicación:
No estoy completamente seguro de que cada cadena más corta sea una subsecuencia de "() 01+" * 4, pero 4 se puede aumentar a 9 sin costo de byte si es necesario.
fuente
JavaScript (ES6),
488341bytesExplicación: Dado que seis expresiones regulares pueden expresar todas las palabras binarias posibles, y las dos más largas tienen nueve caracteres, es suficiente verificar esas y todas las expresiones regulares más cortas. Un candidato es obviamente la cadena con "codificación de longitud de ejecución" (es decir, todas las ejecuciones de dígitos reemplazadas por
+
s apropiadas ), pero también()
deben verificarse las cadenas con un conjunto de s. Genero 1596 expresiones regulares (esto incluye duplicados e expresiones regulares inútiles, pero se eliminarán) y pruebo todas las 1597 para ver cuál es la coincidencia más corta. Las expresiones regulares generadas se dividen en dos tipos:\(\d{2,5}\)\+
(60 expresiones regulares) y(\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?
(1536 expresiones regulares, ya que evito generar expresiones regulares con dígitos iniciales y finales).fuente
Pyth -
313029 bytes¡Fuerza bruta! Probablemente pueda jugar un poco al iterador.
Test Suite .
fuente
Ruby, 109 bytes
Es el enfoque de la fuerza bruta aburrida. Funciona porque ninguna expresión regular necesita más de 9 caracteres (como señala Neil) y ningún carácter individual necesita repetirse más de 4 veces (intentarlo
'01()+'.chars*9
hizo que mi CPU fuera infeliz).fuente
Python 3, 186 bytes
Estoy investigando si hay un enfoque para este problema además de la fuerza bruta, pero aquí hay una solución de fuerza bruta de Python por ahora.
fuente