Construye tu propio motor de expresiones regulares
Etapa 1 de 8v3 · 7f58c9d8

Literales y punto

Reconoce literales concatenados y el comodín de un carácter.

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.

Caracteres Literales y Metacarácter Punto (.)

Un motor de expresiones regulares evalúa si una cadena de texto coincide con un patrón simbólico. En esta primera etapa implementarás el cotejo exacto desde el inicio de la cadena para caracteres literales y el metacarácter punto (.), que coincide con cualquier carácter excepto salto de línea.

Modelo mental: Punteros paralelos en patrón y texto

Para verificar una coincidencia completa (op: "match"):

  • Se avanza un puntero en el patrón (p) y un puntero en el texto (t).
  • Si pattern[p] === ".": coincide con un carácter de text[t], excepto \n.
  • Si pattern[p] es un literal: debe coincidir exactamente (pattern[p] === text[t]).
  • Si se llega al final del patrón exitosamente: se ha encontrado una coincidencia en el intervalo span: [0, longitudCoincidencia].

Tu objetivo en esta etapa

Leer por stdin un JSON con op: "match", el patrón pattern y el texto text. Devolver si hubo coincidencia y el intervalo span.

Formato de Entrada

json
{
  "op": "match",
  "pattern": "c.t",
  "text": "cat"
}

Formato de Salida

json
{
  "matched": true,
  "span": [0, 3]
}

Qué debes hacer paso a paso

  1. Lectura y validación: Comprueba que op === "match".
  2. Cotejo carácter a carácter:
    • Itera ii desde 0 hasta la longitud del patrón:
      • Si i≥text.lengthi \ge \text{text.length}: el texto terminó antes que el patrón, retorna {"matched": false}.
      • Si pattern[i] === "." y text[i] === "\n", o si pattern[i] !== "." y pattern[i] !== text[i]: no coincide, retorna {"matched": false}.
  3. Coincidencia exitosa:
    • Retorna {"matched": true, "span": [0, pattern.length]}.
  4. Emite la salida: Escribe el objeto JSON en stdout.

Criterios de aceptación

  • ✅ Coincide caracteres literales exactamente.
  • ✅ Interpreta el punto (.) como comodín para cualquier carácter excepto salto de línea.
  • ✅ Reporta el intervalo [0, longitud] en span.

El punto nunca coincide con \n: comprueba esa exclusión antes de aceptar el carácter. match comprueba un prefijo desde la posición cero; no exige consumir todo el texto.

Cómo empezar y comprobar tu avance

Abre el README de la plantilla de tu lenguaje y ejecuta desde su raíz el comando build de shipcode.yml, si existe, seguido de run. La plantilla está incompleta: al principio debe fallar con un diagnóstico de implementación pendiente. Después de desarrollar esta etapa, usa shipcode test; conserva los comportamientos de las etapas anteriores y usa shipcode submit cuando pasen.

Puedes usar una biblioteca JSON para el sobre de entrada y salida. Esa biblioteca no debe resolver el algoritmo del proyecto. Si tu lenguaje no incluye JSON, añade una dependencia documentada y ajusta el comando build de shipcode.yml; comprueba la instalación en una carpeta limpia.

Los fragmentos con Math, .shift() o notación similar expresan ideas de algoritmo; no requieren JavaScript. Adáptalos a los tipos y bibliotecas de tu lenguaje. Un byte no equivale siempre a un carácter: en formatos binarios cuenta bytes y declara la codificación.

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.