Cuantificadores perezosos y reemplazo
Implementa repetición perezosa y expansión de capturas en reemplazos.
Constrúyelo en tu lenguaje
El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.
Cuantificadores Perezosos (+?, *?) y Reemplazo de Texto
Por defecto, los cuantificadores son codiciosos. Añadir un signo de interrogación ? al cuantificador (+?, *?) lo convierte en perezoso (lazy): coincide con el menor número posible de caracteres necesarios. Además, la operación replace sustituye coincidencias interpolando grupos capturados ($1, $2).
Modelo mental: Cuantificador perezoso y sustitución con $N
<.+>sobre"<a><b>"(codicioso): coincide con"<a><b>"de extremo a extremo.<.+?>sobre"<a><b>"(perezoso): coincide primero con"<a>"y luego con"<b>".- Sustitución con
$1: si el grupo 1 capturó"a", el reemplazo"[$1]"produce"[a]".
Tu objetivo en esta etapa
Soportar cuantificadores perezosos y la operación op: "replace" con all: true y retro-referencias $1.
Formato de Entrada
{
"op": "replace",
"pattern": "<(.+?)>",
"text": "<a><b>",
"replacement": "[$1]",
"all": true
}
Formato de Salida
{
"text": "[a][b]"
}
Qué debes hacer paso a paso
- Implementa cuantificadores perezosos (
+?,*?):- En lugar de consumir el máximo número de repeticiones primero, intenta primero con la cantidad mínima (1 para
+?, 0 para*?) y solo incrementa repeticiones si el resto del patrón falla.
- En lugar de consumir el máximo número de repeticiones primero, intenta primero con la cantidad mínima (1 para
- Implementa la sustitución de grupos:
- En
replacement, sustituye$1por el texto del grupo 1,$2por el grupo 2, etc.
- En
- Bucle de reemplazo global (
all: true):- Encuentra todas las coincidencias disjuntas y sustitúyelas en orden.
- Emite la salida: Escribe
{"text": textoReemplazado}en stdout.
Criterios de aceptación
- ✅ Soporta cuantificadores no codiciosos/perezosos (
+?,*?). - ✅ Sustituye variables de captura
$1,$2en la plantilla de reemplazo.
Formato de salida y errores
Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto.
Para entradas inválidas, usa stderr con la palabra error, stdout vacío y código 1. Para entradas válidas, código 0. Usa números JSON enteros cuando el resultado sea entero.
Reglas de sustitución
$0 representa la coincidencia completa; $1 a $9 representan capturas numeradas. Una referencia a un grupo que no existe se conserva literal: (a) sobre a con $1-$9 produce a-$9. Un grupo opcional existente que no participó aporta una cadena vacía. Con all: false, reemplaza solo la primera coincidencia; con all: true, recorre coincidencias no superpuestas de izquierda a derecha. Después de una coincidencia vacía, avanza un carácter para evitar un bucle infinito.