102 lines
7.0 KiB
Markdown
102 lines
7.0 KiB
Markdown
# 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}}."
|
||
]
|
||
}
|
||
```
|