Cada envío en su caja.
Juez Miau es un juez automático para concursos de programación. Califica rápido y parejo: cada solución corre sola, sin red, con su propio núcleo y los mismos límites para todos. Tú organizas el concurso; el gatito revisa las cajas.
C · C++ · Java · Python · JavaScript · C#
Ajolote Recursivo
- Problema
- C · Rutas en la sierra
- Lenguaje
- C++17
- Límites
- 1 s · 256 MB por caso
- Máximos
- 42 ms · 2048 KB
Del archivo al veredicto, sin que nadie se levante.
El equipo programa en su IDE y envía desde la app de escritorio. El juez compila una vez, corre todos los casos y le avisa al equipo con una notificación de Windows. El marcador se recalcula al instante en el panel, en la app y en el proyector.
- RecibidoLlega desde la app de escritorio del equipo.
- En colaEspera su turno en la cola del juez.
- CompiladoUna sola vez · 1.8 s.
- Juzgado12 casos, cada uno con su núcleo · máx. 42 ms.
- EntregadoAviso al equipo y marcador actualizado.
La app es un solo .exe que vive en la bandeja, detrás del IDE: ahí están los problemas, las plantillas, los envíos y sus veredictos.
Veredictos que reconoce:
- ACAceptado
- WARespuesta incorrecta
- TLETiempo excedido
- MLEMemoria excedida
- REError en ejecución
- CEError de compilación
Las mismas reglas para todas las cajas.
Cada envío corre dentro de un contenedor Docker aislado. Nada que haga un equipo le quita tiempo, memoria o ventaja a otro.
- Sin red
- 1 núcleo por caso
- Límite de tiempo
- Límite de memoria
El contenedor no tiene salida a internet ni a la red del laboratorio. Cada caso de prueba tiene un núcleo de CPU reservado, así que ninguna corrida le roba tiempo a otra. Los límites de tiempo y de memoria son los mismos para todos los envíos del problema; si un envío se pasa, el veredicto es TLE o MLE.
| # | Equipo | Resueltos | Pen. |
|---|---|---|---|
| 1 | Quetzal Greedy | ABCD | 297 |
| 2 | Ajolote Recursivo | ABCD | 298 |
| 3 | Ornitorrinco Binario | ABCD | 312 |
| 4 | Bit a Bit | ABCD | 164 |
00:48:00 Marcador congelado
Cómo se ordena el marcador
Gana quien resuelve más problemas. El empate se rompe con la penalización: el minuto de cada aceptado más 20 por cada rechazo previo. Un error de compilación no cuenta.
Un reloj para todo el concurso
El mismo tiempo en el panel, en la app y en el proyector. El staff lo inicia, lo pausa y lo termina.
El final se sella
En la última parte el marcador público se congela. Los envíos se siguen juzgando y el resultado se revela en la premiación.
El gatito revisa cada computadora.
La app de escritorio le manda al juez un latido periódico con los procesos abiertos, los monitores conectados y las memorias USB de cada equipo. Cada edición define qué está prohibido.
Si algo rompe una regla, el staff ve la alerta y puede suspender al equipo. El equipo nunca ve la alerta.
- AlertaQuetzal Greedy · 2 monitores (máx. 1)
- AlertaQuetzal Greedy · memoria USB conectada
- AvisoBit a Bit · sin latido hace 2 min
Ejemplo
¿Qué trae la caja?
Todo lo que usa el staff, los equipos y el auditorio el día del concurso.
| Cant. | Artículo | Para |
|---|---|---|
| 1 | Panel webEdiciones, categorías, salones, equipos y problemas con sus casos de prueba. | Staff |
| 4 | Roles por ediciónSuperadmin, administrador, juez y observador, cada uno con sus permisos. | Staff |
| 1 | App de escritorioUn solo .exe para Windows: problemas, envíos y avisos. | Equipos |
| 1 | AclaracionesEl equipo pregunta desde la app; el juez responde a ese equipo o a todos. | Jueces y equipos |
| 1 | Vista de proyectorMarcador por categoría y reloj, en vivo. | Auditorio |
| 1 | Credenciales en PDFUsuario y contraseña de cada equipo, listas para imprimir. | Equipos |
| 1 | Bitácora de auditoríaLas acciones importantes del staff quedan registradas. | Staff |
Aclaración · problema C · para todos
P: ¿Puede haber dos caminos entre el mismo par de pueblos?
R: Sí. Toma el de menor distancia.
Ejemplo
Instrucciones de armado.
Todo corre en un solo servidor del laboratorio con Docker Compose. Se monta unos días antes del concurso y se desmonta después.
-
Consigue una máquina
Palomea lo que ya tienes:
-
Clona y configura
$ git clone https://github.com/LaBoa99/juez-miau $ cd mi-concurso-monorepo/deploy $ cp .env.example .env
En
.envpon la dirección pública, las contraseñas y los secretos. -
Levántalo
$ docker compose up -d --build web Up api Up worker Up redis Up postgres Up -
Entra al panel
Abre la dirección pública con el usuario administrador del
.envy crea tu primera edición. Reparte la app de escritorio en las máquinas de los equipos.
¿Tu laboratorio no tiene internet? Prepara las imágenes en otra máquina y cópialas; la guía explica cómo.
Lo que viene en el compose.
Un solo archivo, deploy/docker-compose.yml, levanta todo el concurso. Es el mismo para el día del concurso y para desarrollo.
- webCaddy
Sirve el panel de staff y pasa
:80 · :443/apiy/socket.ioa la API. - apiNestJS
La API del panel y de la app de escritorio. Al arrancar carga los datos iniciales.
interno - workerEl juez
Mismo código que la API. Toma los envíos de la cola y los corre en contenedores.
sin puertos - postgresPostgreSQL 14
Ediciones, equipos, problemas, envíos y bitácora.
solo 127.0.0.1 - redisRedis 7
La cola de envíos que reparte el trabajo al juez.
solo 127.0.0.1 - judge-*Lenguajes
Imágenes de gcc, Java, .NET, Node y Python. Solo se descargan; terminan en
sin puertosExited (0).
- Guía de despliegueInstalación, laboratorio sin internet, respaldos por semestre y HTTP o HTTPS.
- Requisitos del servidorQué máquina conviene para el día del concurso.
- ArquitecturaCómo se conectan el panel, la API, el juez y la app.
- Cómo juzgaCompilación, casos de prueba, límites y veredictos.
- APILos endpoints del backend.
Hecho en el CUValles.
Juez Miau nació en la Maestría en Ingeniería de Software del Centro Universitario de los Valles, para que la universidad tuviera un juez propio, a la medida de sus laboratorios. Ahora la caja está abierta para que otras escuelas lo usen en sus concursos.