Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios: Refactorización de Código Ofuscado

Deconstrucción, análisis y transformación de código críptico a C idiomático y limpio

Universidad Nacional de Río Negro

Prerrequisitos Técnicos y Entorno Requerido

Antes de abordar esta guía de deconstrucción y refactorización, el estudiante requiere:

  1. Entorno de Compilación: Compilador GCC 9+ o Clang bajo estándar estricto ISO C11 (-std=c11 -Wall -Wextra -Werror -pedantic).

  2. Estilo Institucional: Dominio del catálogo de reglas de estilo de la cátedra: indentación Allman (0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman), constantes simbólicas (0x0003h: Un espacio antes y después de cada operador binario) y nombres autoexplicativos (0x0102h: Los argumentos de función y las variables locales deben usar snake_case en minúsculas).

  3. Eliminación de Antipatrones: Prohibición estricta de variables globales (0x2004h: No se permite el uso de variables globales) y reemplazo del operador ternario por bifurcaciones explícitas (0x1007h: No utilizar el operador condicional (ternario) ?:).

  4. Verificación de Equivalencia: Diseño sistemático de suites de prueba con assert() en C11 para garantizar invariancia funcional.

Acerca de

En el desarrollo profesional de software, la mayor parte del tiempo se destina a leer, entender y mantener código existente. Con frecuencia te encontrarás con código mal estructurado, con nombres crípticos de una sola letra, números mágicos sin explicación, anidaciones excesivas o dependencias ocultas de variables globales.

El objetivo de este cuadernillo es desarrollar tu agudeza analítica mediante la deconstrucción y refactorización de fragmentos de código intencionalmente ofuscados.

Metodología de Trabajo para Cada Ejercicio

Para resolver cada ejercicio debés:

  1. Analizar el código ofuscado: Determinar qué hace el algoritmo, cuáles son sus datos de entrada y salida, y qué invariantes o precondiciones asume.

  2. Identificar “olores de código” (code smells) y violaciones de estilo: Nombres crípticos, operador ternario no permitido, falta de llaves Allman, variables reutilizadas, números mágicos, efectos secundarios, etc.

  3. Refactorizar a C limpio e idiomático: Reescribir la solución aplicando:

  4. Diseñar una suite de pruebas con assert(): Validar que la versión refactorizada preserve exactamente el comportamiento esperado ante casos normales y bordes.


1. Expresiones Aritméticas, Asignaciones y Nombres Crípticos

Ejercicio 1.07.01 - El Máximo Comprimido ⭐☆☆☆☆


Ejercicio 1.07.02 - Geometría sin Nombres ⭐☆☆☆☆


Ejercicio 1.07.03 - Suma de Cuadrados en Una Línea ⭐⭐☆☆☆


Ejercicio 1.07.04 - Conversión Térmica con División Entera Peligrosa ⭐⭐☆☆☆


Ejercicio 1.07.05 - Suma de Dígitos Ofuscada ⭐⭐☆☆☆


Ejercicio 1.07.06 - Año Bisiesto Críptico ⭐☆☆☆☆


Ejercicio 1.07.07 - Sumatoria de Gauss con Nombres Inadecuados ⭐☆☆☆☆


Ejercicio 1.07.08 - Cilindro con Número Mágico ⭐⭐☆☆☆


2. Control de Flujo Espagueti y Anidaciones Profundas

Ejercicio 1.07.09 - El Monstruo de la Flecha (Arrow Code) ⭐⭐⭐☆☆


Ejercicio 1.07.10 - Menú con Ifs Caóticos ⭐⭐☆☆☆


Ejercicio 1.07.11 - Lazo Espagueti con Banderas Confusas ⭐⭐⭐☆☆


Ejercicio 1.07.12 - Tarifa de Taxi con Variables Reutilizadas ⭐⭐☆☆☆


Ejercicio 1.07.13 - Expresión Booleana Monolítica de Validación de Fecha ⭐⭐⭐☆☆


Ejercicio 1.07.14 - Descuento Escalonado con Condiciones Solapadas ⭐⭐☆☆☆


Ejercicio 1.07.15 - Función Contaminada con Entrada/Salida ⭐⭐☆☆☆


Ejercicio 1.07.16 - Búsqueda Lineal con Variables Globales ⭐⭐☆☆☆


3. Algoritmos Comprimidos y Lazos Crípticos

Ejercicio 1.07.17 - Euclides con Operador Coma y Asignaciones Crípticas ⭐⭐⭐☆☆


Ejercicio 1.07.18 - Inversor de Números con Variables Reutilizadas ⭐⭐☆☆☆


Ejercicio 1.07.19 - Fibonacci Iterativo Micro-comprimido ⭐⭐☆☆☆


Ejercicio 1.07.20 - Conteo de Números Armstrong Desordenado ⭐⭐⭐☆☆


Ejercicio 1.07.21 - Factorial con Detección de Desbordamiento Oculto ⭐⭐☆☆☆


Ejercicio 1.07.22 - Números Perfectos con Lazo Ineficiente ⭐⭐⭐☆☆


Ejercicio 1.07.23 - Cálculo de Potencia Rápida Oculto ⭐⭐⭐☆☆


Ejercicio 1.07.24 - Desglose de Dinero con Lazos Confusos ⭐⭐☆☆☆


4. Descomposición Modular y Funciones Reutilizables

Ejercicio 1.07.25 - La Función Monstruo de Facturación ⭐⭐⭐☆☆


Ejercicio 1.07.26 - Herón y Clasificación de Triángulos Todo-en-Uno ⭐⭐⭐☆☆


Ejercicio 1.07.27 - Duplicación de Código de Tiempo (Violación DRY) ⭐⭐☆☆☆


Ejercicio 1.07.28 - Máquina de Estados con Estados Mágicos ⭐⭐⭐☆☆


Ejercicio 1.07.29 - Validación de Entrada con Lazos Desacoplados ⭐⭐☆☆☆


Ejercicio 1.07.30 - Tabla de Multiplicar Formateada y Modularizada ⭐⭐☆☆☆


Ejercicio 1.07.31 - Algoritmo de Luhn Comprimido ⭐⭐⭐⭐⭐


Ejercicio 1.07.32 - Congruencia de Zeller Astronómica ⭐⭐⭐⭐⭐


5. Lazos Anidados, Matrices y Patrones Numéricos

Ejercicio 1.07.33 - Rectángulo de Asteriscos Comprimido ⭐☆☆☆☆


Ejercicio 1.07.34 - Matriz Identidad con Ternario Críptico ⭐⭐☆☆☆


Ejercicio 1.07.35 - Conteo de Vocales con Cascada Repetitiva ⭐⭐☆☆☆


Ejercicio 1.07.36 - Coeficiente Binomial Redundante ⭐⭐⭐☆☆


Ejercicio 1.07.37 - Primos Gemelos con Variables Globales ⭐⭐☆☆☆


Ejercicio 1.07.38 - Criba de Divisores Estática ⭐⭐⭐☆☆


Ejercicio 1.07.39 - Suma de Diagonales en Arreglo 2D Plano ⭐⭐☆☆☆


Ejercicio 1.07.40 - Conjetura de Collatz Caótica ⭐⭐⭐☆☆


Ejercicio 1.07.41 - Transposición de Matriz 3×33 \times 3 ⭐⭐☆☆☆


Ejercicio 1.07.42 - Multiplicación de Matrices Cuadradas Comprimida ⭐⭐⭐⭐☆


6. Validación de Formatos, Parsing y Protocolos Simples

Ejercicio 1.07.43 - Validador de Hora Militar Comprimido ⭐☆☆☆☆


Ejercicio 1.07.44 - Conversor de Caracteres a Entero (atoi Casero) ⭐⭐☆☆☆


Ejercicio 1.07.45 - Validador de Octetos IPv4 Caótico ⭐⭐⭐☆☆


Ejercicio 1.07.46 - Verificador de CUIT/CUIL con Módulo 11 ⭐⭐☆☆☆


Ejercicio 1.07.47 - Compactador de Espacios Repetidos ⭐⭐⭐☆☆


Ejercicio 1.07.48 - Validador de Fortaleza de Contraseña ⭐⭐☆☆☆


Ejercicio 1.07.49 - Decodificador Run-Length (RLE) Numérico ⭐⭐⭐☆☆


Ejercicio 1.07.50 - Conversor de Números Romanos Básicos ⭐⭐☆☆☆


Ejercicio 1.07.51 - Checksum de Paridad Longitudinal ⭐⭐⭐⭐☆


Ejercicio 1.07.52 - Mini Intérprete de Pila de 4 Instrucciones ⭐⭐⭐⭐☆


7. Desafíos Avanzados y Extra Difíciles

Ejercicio 1.07.53 - Conversor de Base Numérica a Arreglo ⭐⭐⭐☆☆


Ejercicio 1.07.54 - Búsqueda Binaria con Riesgo de Desbordamiento ⭐⭐⭐☆☆


Ejercicio 1.07.55 - Ordenamiento Burbuja con Salida Temprana ⭐⭐⭐⭐☆


Ejercicio 1.07.56 - Algoritmo de Kadane Comprimido ⭐⭐⭐⭐☆


Ejercicio 1.07.57 - Generador Pseudoaleatorio Congruencial (LCG) ⭐⭐⭐☆☆


Ejercicio 1.07.58 - Ordenamiento por Inserción Compacto ⭐⭐⭐⭐☆


Ejercicio 1.07.59 - Distancias Manhattan y Euclidiana Todo-en-Uno ⭐⭐⭐⭐☆


Ejercicio 1.07.60 - Conteo de Componentes Conexas 1D ⭐⭐⭐⭐☆


Ejercicio 1.07.61 - Vecinos de Conway en Cuadrícula 5×55 \times 5 ⭐⭐⭐⭐☆


Ejercicio 1.07.62 - Balanceador de Paréntesis Lineal ⭐⭐⭐⭐☆


Ejercicio 1.07.63 - [EXTRA DIFÍCIL] El Cuadrado Mágico y Verificador de Sudoku 3×33 \times 3 ⭐⭐⭐⭐⭐


Ejercicio 1.07.64 - [EXTRA DIFÍCIL] El Cifrador Vigenère Aritmético Cripto-Comprimido ⭐⭐⭐⭐⭐


Notas Finales