Spaces:
Sleeping
Sleeping
feat(es): add Spanish coding exercises (Tier 1-3)
Browse files
languages/es/exercises/tier3/cribo.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Tier 3 - Ejercicio 4: El Cribo de Eratóstenes / Sieve of Eratosthenes
|
| 2 |
+
# Dificultad: ⭐⭐⭐ | Tiempo estimado: 40 min
|
| 3 |
+
# Ejecutar: legesher run languages/es/exercises/tier3/cribo.py --lang es
|
| 4 |
+
|
| 5 |
+
definir cribo_eratostenes(n):
|
| 6 |
+
"""Implementa el Cribo de Eratóstenes para encontrar primos hasta n."""
|
| 7 |
+
es_primo = [verdadero] * (n + 1)
|
| 8 |
+
es_primo[0] = falso
|
| 9 |
+
es_primo[1] = falso
|
| 10 |
+
p = 2
|
| 11 |
+
mientras p * p <= n:
|
| 12 |
+
si es_primo[p]:
|
| 13 |
+
por multiplo en rango(p * p, n + 1, p):
|
| 14 |
+
es_primo[multiplo] = falso
|
| 15 |
+
p += 1
|
| 16 |
+
devolver [i por i en rango(2, n + 1) si es_primo[i]]
|
| 17 |
+
|
| 18 |
+
definir calcular_estadisticas(primos, n):
|
| 19 |
+
"""Calcula estadísticas sobre los números primos encontrados."""
|
| 20 |
+
total = longitud(primos)
|
| 21 |
+
mas_pequeno = primos[0]
|
| 22 |
+
mas_grande = primos[-1]
|
| 23 |
+
suma = sumar(primos)
|
| 24 |
+
promedio = redondear(suma / total, 2)
|
| 25 |
+
porcentaje = redondear((total / n) * 100, 2)
|
| 26 |
+
mas_cercano = minimo(primos, key=funcion_anonima p: valorabsoluto(p - n // 2))
|
| 27 |
+
devolver {
|
| 28 |
+
"total": total,
|
| 29 |
+
"mas_pequeno": mas_pequeno,
|
| 30 |
+
"mas_grande": mas_grande,
|
| 31 |
+
"suma": suma,
|
| 32 |
+
"promedio": promedio,
|
| 33 |
+
"porcentaje": porcentaje,
|
| 34 |
+
"mas_cercano": mas_cercano,
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
definir mostrar_resultados(primos, estadisticas, n):
|
| 38 |
+
"""Muestra los resultados en pantalla."""
|
| 39 |
+
imprimir("===== EL CRIBO DE ERATÓSTENES =====")
|
| 40 |
+
imprimir(f"Calculando números primos hasta {n}...\n")
|
| 41 |
+
imprimir("Primos encontrados:")
|
| 42 |
+
imprimir(" ".join(cadena(p) por p en primos))
|
| 43 |
+
imprimir("\n===== ESTADÍSTICAS =====")
|
| 44 |
+
imprimir(f"Total de primos encontrados: {estadisticas['total']}")
|
| 45 |
+
imprimir(f"Primo más pequeño: {estadisticas['mas_pequeno']}")
|
| 46 |
+
imprimir(f"Primo más grande: {estadisticas['mas_grande']}")
|
| 47 |
+
imprimir(f"Primo más cercano a n/2: {estadisticas['mas_cercano']}")
|
| 48 |
+
imprimir(f"Suma de todos los primos: {estadisticas['suma']}")
|
| 49 |
+
imprimir(f"Promedio de primos: {estadisticas['promedio']}")
|
| 50 |
+
imprimir(f"Porcentaje de primos en rango 1-{n}: {estadisticas['porcentaje']}%")
|
| 51 |
+
|
| 52 |
+
definir guardar_resultados(primos, estadisticas, n):
|
| 53 |
+
"""Guarda los resultados en primos.txt."""
|
| 54 |
+
con abrir("primos.txt", "w", encoding="utf-8") como f:
|
| 55 |
+
f.write(f"===== EL CRIBO DE ERATÓSTENES =====\n")
|
| 56 |
+
f.write(f"Números primos hasta {n}:\n")
|
| 57 |
+
f.write(" ".join(cadena(p) por p en primos))
|
| 58 |
+
f.write("\n\n===== ESTADÍSTICAS =====\n")
|
| 59 |
+
f.write(f"Total: {estadisticas['total']}\n")
|
| 60 |
+
f.write(f"Primo más pequeño: {estadisticas['mas_pequeno']}\n")
|
| 61 |
+
f.write(f"Primo más grande: {estadisticas['mas_grande']}\n")
|
| 62 |
+
f.write(f"Primo más cercano a n/2: {estadisticas['mas_cercano']}\n")
|
| 63 |
+
f.write(f"Suma: {estadisticas['suma']}\n")
|
| 64 |
+
f.write(f"Promedio: {estadisticas['promedio']}\n")
|
| 65 |
+
f.write(f"Porcentaje: {estadisticas['porcentaje']}%\n")
|
| 66 |
+
|
| 67 |
+
definir principal():
|
| 68 |
+
"""Función principal."""
|
| 69 |
+
probar:
|
| 70 |
+
n = entero(entrada("Ingresa el límite superior (n): "))
|
| 71 |
+
si n < 2:
|
| 72 |
+
imprimir("El límite debe ser mayor que 2")
|
| 73 |
+
devolver
|
| 74 |
+
excepto ValueError:
|
| 75 |
+
imprimir("Por favor ingresa un número válido")
|
| 76 |
+
devolver
|
| 77 |
+
|
| 78 |
+
primos = cribo_eratostenes(n)
|
| 79 |
+
estadisticas = calcular_estadisticas(primos, n)
|
| 80 |
+
mostrar_resultados(primos, estadisticas, n)
|
| 81 |
+
guardar_resultados(primos, estadisticas, n)
|
| 82 |
+
imprimir("\nResultados guardados en primos.txt")
|
| 83 |
+
|
| 84 |
+
si __name__ == "__main__":
|
| 85 |
+
principal()
|