El reto
Dada una expresión regular válida, genere una expresión regular que coincida con el mismo conjunto de cadenas, pero invertida.
La tarea
Este reto utiliza la mayoría de las operaciones básicas de expresiones regulares: ^
, $
, ?
, +
, *
, []
, {}
, |
. No existen grupos de captura ni ninguna de esas cosas complicadas. Se pueden escapar caracteres especiales.
Muestra de entrada / salida
Nota: ¡Nunca se darán datos no válidos, y generalmente hay múltiples respuestas posibles para un ingreso dado!
Input | Sample Output
-----------|-------------
abc | cba
tuv? | v?ut
a(b|c) | (c|b)a
1[23] | [23]1
a([bc]|cd) | (dc|[bc])a
^a[^bc]d$ | ^d[^bc]a$
x[yz]{1,2} | [yz]{1,2}x
p{2} | p{2}
q{7,} | q{7,}
\[c[de] | [de]c\[
ab[c | <output undefined>
a(?bc) | <output undefined>
a[]]bc | <output undefined>
Manifestación
Demostración de trabajo que demuestra entradas / salidas correctas. Esto tiene una lógica adicional para validar entradas que no son necesarias en una respuesta real. Considere entradas no válidas como comportamiento indefinido.
Detalles específicos
Por simplicidad, todos los caracteres especiales tienen su significado especial o se escapan; es decir, [[]
no es un rango de caracteres para [
. Los rangos de longitud provienen de ERE POSIX estándar; es decir, {n}
, {n,}
, y {n,m}
son compatibles. Los rangos de caracteres []
y [^]
son compatibles. Debido a estas reglas, y dado que no se proporciona una entrada no válida, realmente solo necesita copiar el contenido de estas directamente a la salida. Por último, la codicia no importa, es decir, no importa si la expresión regular invertida encuentra una coincidencia diferente primero, solo necesita encontrar una coincidencia para el mismo conjunto de cadenas.
Tanteo
El programa más pequeño en bytes (salvo trampas como solicitudes de red) gana. El programa puede usar IO real o simplemente definir una función.
?
que apegarse. Intenta escribir/a(?bc)/
en la consola del navegador.(^a|b)(c$|d)
embargo, es posible que desee agregar algo como un caso de prueba.(a)?(b)+
↦(b)+(a)?
?()
, que se utiliza en su ejemplo.Respuestas:
Retina ,
136114110 bytesHola, te escuché como regex ...
Donde
<empty>
representa una línea final vacía. Ejecute el código desde un solo archivo con la-s
bandera.... cuando quieras regex reverso debes usar regex. Cuando desee usar expresiones regulares, debe usar un lenguaje de programación basado en expresiones regulares.
Este código se supone que la entrada no contiene ni
;
ni!
ni espacios. Si bien estoy de acuerdo en que es una suposición bastante fuerte y potencialmente inválida, podría reemplazar esos tres en el código con cualquiera de los tres caracteres no imprimibles (como bytes nulos, carácter de campana,<DEL>
lo que sea), y no afectaría el tamaño o la funcionalidad del código en absoluto.Agregaré una explicación cuando termine de jugar al golf.
fuente
]]]
, de cualquier manera, esta respuesta no necesitará mucha modificación).JavaScript ES6, 574 bytes
Probablemente pueda eliminar algunas
var
declaraciones.JS ES6, no probado, 559 bytes
Lo probaré en casa.
JavaScript ES5, sin golf, 961 bytes
fuente
JavaScript ES6, 343 bytes
Código original (las funciones, pero sin
prompt
):El código se implementa como un analizador recursivo de arriba hacia abajo, por lo que puede causar un desbordamiento de la pila en la entrada profundamente anidada.
El código puede causar un bucle infinito en casos no válidos, ya que no los pruebo, aprovechando la cláusula de "comportamiento indefinido".
fuente
Python 3, 144 bytes
(Este no admite calificadores en un grupo como
(a)+(b)*(cde)?
).Casos de prueba:
Resultado:
fuente