Laboratorio: entorno de trabajo
Todo el curso se trabaja en un mismo entorno, con g++, gdb, valgrind, make, Git y
minisat. También trae Python 3.14, que solo sirve para correr el juez y las pruebas
automáticas. Hay dos formas de abrirlo.
Cada semana hay una sesión de laboratorio de 2 horas, con un problema. Los laboratorios sirven para practicar con la respuesta inmediata del juez, y preparan las prácticas y los exámenes. En las semanas 4, 7, 11 y 14 la sesión es para la práctica, y el problema queda como ejercicio opcional.
Opción 1: GitHub Codespaces
Solo requiere un navegador, internet y una cuenta de GitHub, así que funciona en las computadoras de la universidad. Sin internet no funciona: en ese caso, Docker (opción 2) trabaja sin conexión una vez construida la imagen.
- Crear una cuenta en GitHub, con el correo de la universidad si es posible.
- Abrir el repositorio del curso que indique el docente.
- Elegir Code → Codespaces → Create codespace. La primera vez tarda unos minutos.
- En la terminal de abajo, correr
env/check.sh. Todas las líneas deben decirok.
Al terminar, cierren la pestaña y detengan el codespace desde https://github.com/codespaces. Revisen la cuota gratuita de su cuenta en esa misma página, porque se consume rápido.
Opción 2: Docker en una laptop
- Instalar Docker.
- En la carpeta del curso, correr
env/run.sh. La primera vez construye la imagen. - Dentro del contenedor, correr
env/check.sh. Todas las líneas deben decirok.
Se edita con cualquier editor en la laptop, porque la carpeta es la misma dentro y fuera del contenedor.
Resolver un problema con el juez
Cada problema trae un enunciado, un esqueleto solution.cpp y una carpeta casos/.
make # compila
make test # corre el juez con todos los casos
El juez imprime una línea por caso:
| Veredicto | Qué significa | Qué revisar |
|---|---|---|
AC |
Respuesta correcta | Nada |
WA |
Respuesta incorrecta | Copiar el caso y correrlo a mano: ./build/solution < casos/03.in |
TLE |
Se pasó del límite de tiempo | Calcular el costo de su algoritmo con el tamaño de ese caso |
RE |
El programa terminó con error | Compilar con sanitizers para ver dónde |
Los programas leen de la entrada estándar y escriben en la salida estándar, sin mensajes como “Ingrese un número”, porque el juez los toma como parte de la respuesta.
Depurar y medir
Para desarrollar, compilen con sanitizers. Encuentran accesos fuera de un arreglo, que dan respuestas raras sin ningún error visible:
g++ -Wall -Wextra -std=c++20 -g -fsanitize=address,undefined solution.cpp -o solution
./solution < casos/01.in
El juez compila con -O2 y sin sanitizers, porque son mucho más lentos. Midan igual, y
tengan en cuenta que los tiempos de un codespace varían más que los de una laptop.
Valgrind y gdb se usan sin sanitizers: compilen con -g -O0.
Si un programa con recursión muy profunda termina con Segmentation fault, puede ser que se
agotó la pila. Reescríbanlo con una pila explícita, como se ve en la semana 6.
Problemas frecuentes
| Síntoma | Causa | Qué hacer |
|---|---|---|
| El codespace no abre o se desconecta | Conexión o cuota agotada | Revisar la conexión y el uso en https://github.com/codespaces; avisar al docente |
permission denied al ejecutar |
El archivo no es ejecutable o se llamó sin ./ |
chmod +x archivo o usar ./programa |
command not found |
Están fuera del entorno | Comprobar que la terminal es la del codespace o del contenedor |
| Resultados negativos o muy raros con números grandes | Overflow de int |
Calcular el tamaño máximo y usar long long |
WA solo en el caso grande |
Overflow, o un arreglo que se queda corto | Revisar los límites del enunciado |
undefined reference to una función propia |
Falta enlazar un .cpp |
Agregar el archivo al comando o al Makefile |
| valgrind da errores raros o se niega a correr | El programa se compiló con sanitizers | Compilar sin -fsanitize |
dubious ownership de Git |
Carpeta de otro usuario | Abrir la carpeta desde env/run.sh |
| El programa parece colgado | Espera datos de la entrada, o hay un ciclo infinito | Escribir los datos, o Ctrl+D para terminar la entrada y Ctrl+C para cortarlo |