""" Script de Auditoría Docente: Verificador Anti-Plagio por DNI (TP Casas) Permite al docente ingresar los DNI de cualquier grupo de estudiantes y obtener al instante los parámetros asignados y las respuestas exactas de simulación. """ import sys sys.stdout.reconfigure(encoding='utf-8') import re def mulberry32(a): state = a & 0xFFFFFFFF def rng(): nonlocal state state = (state + 0x6D2B79F5) & 0xFFFFFFFF t = state t = (t ^ (t >> 15)) & 0xFFFFFFFF t = (t * (t | 1)) & 0xFFFFFFFF t = (t ^ (t + (((t ^ (t >> 7)) * (t | 61)) & 0xFFFFFFFF))) & 0xFFFFFFFF return (t ^ (t >> 14)) / 4294967296.0 return rng def calcular_semilla(dni_str): dnis = re.findall(r'\d+', dni_str) or ['12345678'] seed_raw = 0 for d in dnis: ult3 = int(d[-3:]) if len(d) >= 3 else 123 seed_raw = (seed_raw * 1000 + ult3) % 2147483647 return seed_raw def auditar_grupo(dni_str): seed = calcular_semilla(dni_str) rng = mulberry32(seed) # Parámetros asignados dem_base = round(5800 + rng() * 400) salto_mes10 = round(40 + rng() * 30) tr_plan = round(7.5 + rng() * 1.5, 1) tr_perm = round(2.5 + rng() * 1.0, 1) tr_obra = round(11.0 + rng() * 2.0, 1) ta_dec = round(1.8 + rng() * 0.8, 1) tr_vida = 360.0 # Simulación Euler dt = 1.0 a 100 meses dt = 1.0 steps = 100 tau_plan = tr_plan / 3.0 tau_obra = tr_obra / 3.0 flujo_eq = dem_base / tr_vida p = [ (flujo_eq * tr_plan) / 3.0 ] * 3 perm = flujo_eq * tr_perm c = [ (flujo_eq * tr_obra) / 3.0 ] * 3 term = float(dem_base) for step in range(steps): t = step * dt if t < 10.0: demanda = dem_base elif t < 18.0: demanda = dem_base + salto_mes10 elif t < 24.0: demanda = (dem_base + salto_mes10) - 100.0 * (t - 18.0) elif t < 36.0: demanda = dem_base - 550.0 elif t < 48.0: demanda = dem_base + 650.0 else: demanda = dem_base + 1300.0 demolicion = term / tr_vida decision = max(0.0, (demanda - term) / ta_dec) + demolicion fp1 = p[0] / tau_plan fp2 = p[1] / tau_plan fp3 = p[2] / tau_plan fperm = perm / tr_perm fc1 = c[0] / tau_obra fc2 = c[1] / tau_obra fc3 = c[2] / tau_obra p[0] += dt * (decision - fp1) p[1] += dt * (fp1 - fp2) p[2] += dt * (fp2 - fp3) perm += dt * (fp3 - fperm) c[0] += dt * (fperm - fc1) c[1] += dt * (fc1 - fc2) c[2] += dt * (fc2 - fc3) term += dt * (fc3 - demolicion) casas_en_obra_mes100 = sum(c) print("=" * 65) print(f"AUDITORÍA DOCENTE - DNI: {dni_str}") print(f"Semilla Hash: {seed}") print("-" * 65) print(f"Parámetros del Grupo:") print(f" • Demanda Base Inicial: {dem_base} casas") print(f" • Salto en Mes 10: +{salto_mes10} casas") print(f" • Demora Planificación (TR1): {tr_plan} meses (Erlang n=3)") print(f" • Demora Permisos (TR2): {tr_perm} meses (Exp)") print(f" • Demora Construcción (TR3): {tr_obra} meses (Erlang n=3)") print(f" • Tiempo Ajuste Decisión (TA): {ta_dec} meses") print("-" * 65) print("Respuestas Esperadas para Corrección:") print(f" [Q1] Flujo de Equilibrio Inicial: {flujo_eq:.4f} casas/mes") print(f" [Q2] Planificadas Iniciales (MT1): {sum(p):.2f} casas") print(f" [Q3] En Obra Iniciales (MT3): {flujo_eq * tr_obra:.2f} casas") print(f" [Q7] CASAS EN CONSTRUCCIÓN (MES 100): {casas_en_obra_mes100:.2f} casas") print(f" (Rango Aceptable con redondeo: {round(casas_en_obra_mes100)-2} a {round(casas_en_obra_mes100)+2})") print("=" * 65) if __name__ == '__main__': dnis_test = sys.argv[1] if len(sys.argv) > 1 else "42123456, 41987654" auditar_grupo(dnis_test)