# 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 case‑insensitive. 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}}." ] } ```