OpoTests/tests-estructura.md

7.0 KiB
Raw Blame History

Prompt: Generador de Tests JSON

Genera un único archivo JSON válido y bien formateado que contenga un Test de preguntas conforme a estas reglas.

1) Objetivo y salida

  • Crea un archivo JSON (pretty-printed) con la estructura indicada más abajo.
  • Devuélveme solo el JSON (sin explicaciones ni texto extra).

2) Estructura del fichero (raíz)

  • El JSON será un array con un objeto que incluye:
    • origin: String (autor/fuente de las preguntas)
    • title: String (título del grupo)
    • group: String (clave id de grupo, debe cumplir la regex /^[a-z0-9_]+$/i)
    • source: String | Array[String] (fuentes / enlaces)
    • queries: Array[Question]

3) Estructura de cada Question (cada elemento de queries)

  • question: String | Array[String] (texto de la pregunta; puede haber variantes)
  • rights: Array[String] (una o más respuestas correctas)
  • wrongs: Array[String] (mínimo 3 respuestas incorrectas)

Reglas obligatorias:

  • No hay un número mínimo de preguntas, pero intentar siempre hacer cuántas más mejor.
  • Por cada pregunta, cuántas más opciones para la misma pregunta, mejor.
  • Cada pregunta debe tener al menos 1 elemento en rights, pero cuántas más mejor.
  • Cada pregunta debe tener al menos 3 elementos en wrongs, pero cuántas más mejor.
  • rights y wrongs pueden contener tantas opciones adicionales como quieras.
  • Los strings pueden incluir estructuras tokenizadas (ver sección tokens). Cuantas más, más variedad pueden tener y por tanto, mejor, pero siempre han de ser coherentes y lógicas a su propósito. Cantidad con calidad.

4) Gramática de tokens permitidos (solo dentro de strings; NO como una respuesta completa)

  • Formato general: {nombre:parametros,valores}
    • nombre: letras (p. ej. rand, mix, select, range, serie)
    • parametros: opcionales, separados por comas
    • valores: opciones separadas por |
  • Tokens soportados (sintaxis y efecto):
    • {rand:op1|op2|op3} → sustituye por una de las opciones aleatorias.
      • Ej: "La opción correcta es {rand:la A|la B|la C}"
    • {mix:sep,op1|op2|op3} → mezcla op1..opN y devuelve la lista separada por comas, usando sep antes del último elemento.
      • Ej: "{mix: y,rojo|azul|verde}""rojo, azul y verde"
    • {Mix:sep,op1|op2|op3} → igual que mix pero capitaliza la primera letra del resultado.
    • {select:desde-hasta,sep,op1|op2|op3} → selecciona aleatoriamente entre N elementos (rango desde-hasta) sin repetir y los une con sep.
      • Ej: "{select:1-2,y,manzana|pera|uva}" puede dar "Manzana y pera" (si usas Select capitaliza).
    • {range:n1-n2|n3|n4-n5} → elige un número aleatorio dentro de uno de los rangos/secciones.
      • Ej: "{range:3-8|11|20-50}"
    • {serie:n1-n2|n3|...} → como range, pero mantiene memoria en el archivo: la primera aparición toma un valor; la siguiente aparición de la misma serie incrementa o iguala según el diseño. (Memoria scope: por archivo).
    • {Mix:sep,op1|op2|op3} → igual que mix pero capitaliza la primera letra del resultado.
    • {select:desde-hasta,sep,op1|op2|op3} → selecciona aleatoriamente entre N elementos (rango desde-hasta) sin repetir y los une con sep.
      • Ej: "{select:1-2,y,manzana|pera|uva}" puede dar "Manzana y pera" (si usas Select capitaliza).
    • {range:n1-n2|n3|n4-n5} → elige un número aleatorio dentro de uno de los rangos/secciones.
      • Ej: "{range:3-8|11|20-50}"
    • {serie:n1-n2|n3|...} → como range, pero mantiene memoria en el archivo: la primera aparición toma un valor; la siguiente aparición de la misma serie incrementa o iguala según el diseño. (Memoria scope: por archivo).
    • Capitalización general: {Cap:texto} daría Texto.

Reglas de parseo (aclaración breve)

  • Evaluación: los tokens se deben evaluar de dentro hacia fuera (innermost-first). Es decir, primero localizar y resolver el token más interior {...}, sustituir su texto resultante y continuar hasta no quedar tokens.
  • Nombres de token: son caseinsensitive. El motor debe tratar mix, Mix o MIX como el mismo token funcional; ciertas variantes (por ejemplo Mix o Select) se definen aquí para indicar capitalización del resultado cuando se indique.

Reglas sobre tokens:

  • Deben aparecer embebidos en texto (no pueden ser la única cosa de una opción).
  • Pueden anidarse si es razonable, p. ej. "{mix: y,{rand:a|b}|{rand:c|d}}"
  • Si usas serie, especifica en el texto si quieres reinicio o wrap (por defecto: incrementa hasta el máximo y vuelve al inicio).

5) Contenido temático y alcance

  • Tema: Constitución Española (Art.87 y Art.166). Genera todas las preguntas que se te ocurran sobre esos artículos (tantas como el tema permita), mínimo 10 preguntas sensatas.
  • Mantén fidelidad al texto: las rights deben ser correctas según los artículos; wrongs deben ser plausibles, pero incorrectas.
  • Es importante entender que las preguntas pertenecen a una batería de preguntas que las une y por tanto, es importante determinar de qué se habla en las mismas para evitar ambigüedades.

6) Formato y validaciones exigidas por la salida

  • El JSON resultante debe ser válido (parseable por un JSON parser).
  • Validaciones automáticas a cumplir:
    • group cumple /^[a-z0-9_]+$/i
    • Cada query tiene >=1 rights y >=3 wrongs
    • Ninguna rights ni wrongs es null/empty
    • Tokens sólo embebidos en strings (no elementos token-only)
  • Salida: devuelve SOLO el JSON (pretty-printed).

7) Malas prácticas

  • Hacer uso de rand, select o mix para un único elemento, a excepción del rand para determinar si sale o no aleatoriamente.
  • Hacer uso de range o serie para un único valor numérico.
  • Hacer uso de un rango y no un valor fijo numérico para determinar un único valor en range y serie.
  • Hacer uso de Cap para capitalizar un texto no dinámico.
  • Hacer uso de mix en las respuestas "wrongs" y no select para implementar más difícultad y opciones.

8) Trucos

  • Para determinar si un texto pueda salir o no aleatoriamente se puede hacer uso de rand de la siguiente forma: Esto es un ejemplo{rand:|, que puede ser extendido o no}.

9) Ejemplo mínimo de una pregunta válida

{
  "question": "Según el art.87.1. ¿A quién corresponde la iniciativa legislativa?",
  "rights": ["{Mix:y,al Gobierno|al Congreso|al Senado}, de acuerdo con {mix:y,la Constitución|los Reglamentos de las Cámaras}"],
  "wrongs": [
    "Sólo {rand:al {rand:Gobierno|Congreso|Senado}|a las {rand:Cámaras|Cortes{rand:| Generales}|Comunidades Autónomas|Diputaciones{rand:| Provinciales}}|a la Constitución}",
    "{Cap:{rand:al {rand:Gobierno|Congreso|Senado}|a las {rand:Cámaras|Cortes{rand:| Generales}|Comunidades Autónomas|Diputaciones{rand:| Provinciales}}|a la Constitución}} exclusivamente.", 
    "{Select:1-5,y,al Gobierno|al Congreso|al Senado|a las Cámaras|a las Cortes Generales}{rand:|, de acuerdo con {Select:1-3,y,a las Comunidades Autónomas|a las Diputaciones{rand:| Provinciales}|a la Constitución}}."
  ]
}