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.

  1. Crear una cuenta en GitHub, con el correo de la universidad si es posible.
  2. Abrir el repositorio del curso que indique el docente.
  3. Elegir Code → Codespaces → Create codespace. La primera vez tarda unos minutos.
  4. En la terminal de abajo, correr env/check.sh. Todas las líneas deben decir ok.

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

  1. Instalar Docker.
  2. En la carpeta del curso, correr env/run.sh. La primera vez construye la imagen.
  3. Dentro del contenedor, correr env/check.sh. Todas las líneas deben decir ok.

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