OpoTests/tests-estructura.md

102 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```json
{
"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}}."
]
}
```