Construye tu propio motor de expresiones regulares
Etapa 3 de 8v2 · 7070d985

Cuantificadores

Parsea y ejecuta *, + y ? con repetición codiciosa.

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 Codiciosos: +, * y ?

Los cuantificadores modifican el átomo anterior para indicar repetición codiciosa (greedy):

  • +: Una o más repeticiones (mínimo 1).
  • *: Cero o más repeticiones (mínimo 0).
  • ?: Cero o una repetición (opcional).

Modelo mental: Coincidencia codiciosa (Greedy) y Backtracking

Los cuantificadores codiciosos intentan consumir la mayor cantidad posible de caracteres. Si el resto del patrón falla posteriormente, el motor retrocede (backtracks) paso a paso liberando un carácter hasta que el resto del patrón pueda coincidir.

Tu objetivo en esta etapa

Soportar los cuantificadores +, *, ? en op: "search", devolviendo span: [inicio, fin].

Formato de Entrada

json
{
  "op": "search",
  "pattern": "ab+c?",
  "text": "xxabbbczz"
}

Formato de Salida

json
{
  "matched": true,
  "span": [2, 7]
}

Qué debes hacer paso a paso

  1. Parsea el patrón en unidades de átomo + cuantificador:
    • Cada átomo (literal o punto) puede ir seguido opcionalmente de +, * o ?.
  2. Implementa cotejo recursivo con retroceso (backtracking):
    • Para *: consume el átomo codiciosamente tantas veces como sea posible, y si el resto falla, retrocede una repetición.
    • Para +: exige al menos 1 coincidencia y luego procede como *.
    • Para ?: intenta primero coincidir 1 vez; si falla el resto, intenta con 0 coincidencias.
  3. Emite la salida: Escribe el objeto con matched y span en stdout.

Criterios de aceptación

  • ✅ Resuelve +, * y ? de forma codiciosa.
  • ✅ Aplica retroceso (backtracking) cuando sea necesario.

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.