Quiero probar un nuevo tipo de desafío regex golf, que le pide que resuelva tareas computacionales no triviales con nada más que la sustitución de expresiones regulares. Para hacer esto más posible y menos complicado, se le permitirá aplicar varias sustituciones, una tras otra.
El reto
Comenzaremos de manera simple: dada una cadena que contiene dos enteros positivos, como números decimales separados por a ,
, se produce una cadena que contiene su suma, también como un número decimal. Entonces, muy simple
47,987
debería convertirse en
1034
Su respuesta debería funcionar para enteros positivos arbitrarios.
El formato
Cada respuesta debe ser una secuencia de pasos de sustitución, cada paso compuesto por una expresión regular y una cadena de reemplazo. Opcionalmente, para cada uno de esos pasos en la secuencia, puede elegir repetir la sustitución hasta que la cadena deje de cambiar. Aquí hay un ejemplo de envío (que no resuelve el problema anterior):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Dada la entrada 123,456
, esta presentación procesará la entrada de la siguiente manera: la primera sustitución se aplica una vez y produce:
|123,|456
Ahora la segunda sustitución se aplica en un bucle hasta que la cadena deja de cambiar:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
Y, por último, la tercera sustitución se aplica una vez:
111111
Tenga en cuenta que el criterio de terminación para los bucles es si la cadena cambia, no si la expresión regular encontró una coincidencia. (Es decir, también podría terminar si encuentra una coincidencia, pero el reemplazo es idéntico a la coincidencia).
Tanteo
Su puntaje principal será el número de pasos de sustitución en su envío. Cada sustitución repetida contará para 10 pasos. Entonces, el ejemplo anterior se puntuaría 1 + 10 + 1 = 12
.
En el caso (no muy improbable) de un empate, la puntuación secundaria es la suma de los tamaños de todos los pasos. Para cada paso, agregue la expresión regular ( sin delimitadores), los modificadores y la cadena de sustitución. Para el ejemplo anterior esto sería (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Reglas misceláneas
Puede usar cualquier sabor regex (que debe indicar), pero todos los pasos deben usar el mismo sabor. Por otra parte, se debe no utilizar las funciones del lenguaje anfitrión del sabor, como las devoluciones de llamada de repuesto o de Perl e
modificador, que evalúa código Perl. Toda manipulación debe ocurrir exclusivamente a través de la sustitución de expresiones regulares.
Tenga en cuenta que depende de su sabor y modificadores si cada reemplazo reemplaza todos los sucesos o solo uno. Por ejemplo, si elige el sabor ECMAScript, un solo paso reemplazará de manera predeterminada solo una aparición, a menos que use el g
modificador. Por otro lado, si está utilizando el sabor .NET, cada paso siempre reemplazará todas las ocurrencias.
Para los idiomas que tienen diferentes métodos de sustitución para el reemplazo único y global (por ejemplo, Ruby's sub
vs. gsub
), suponga que el reemplazo único es el predeterminado y trate el reemplazo global como un g
modificador.
Pruebas
Si su sabor elegido es .NET o ECMAScript, puede usar Retina para probar su envío (me han dicho, también funciona en Mono). Para otros sabores, probablemente tendrá que escribir un pequeño programa en el idioma del host que aplique las sustituciones en orden. Si lo hace, incluya este programa de prueba en su respuesta.