Generador de números primos nostálgicos [cerrado]

16

¿Recuerdas los viejos tiempos cuando abrir un simple documento o página web era penosamente lento ya que acaparaba todos los escasos recursos que tenía tu computadora? ¿Y hoy, hacer lo mismo es aún más lento, a pesar de que su procesador es cientos de veces más rápido y tiene acceso a miles de veces más memoria?

Para simular el efecto de la hinchazón en los visores de documentos actuales y aplicaciones similares, escriba un programa que tenga problemas visibles de rendimiento cuando se ejecute en máquinas más potentes .

Para tener una tarea común para todos, conviértalo en un generador de números primos .

  • El programa tiene que imprimir números primos consecutivos, comenzando desde 2, cada uno en una nueva línea, y nada más. Debería hacerlo para siempre (o hasta quedarse sin memoria). Me gusta esto:
2
3
5
7
11
13
17
  • Debe haber un retraso entre la impresión de cada línea, lo suficiente como para que un humano pueda percibirlo.

  • Este retraso debería ser mayor a medida que la máquina en la que se ejecuta el programa se vuelva más rápida. Cuanto más rápida sea la máquina, más lento será el programa.

  • No especificaré puntos de referencia exactos, ya que podría ser subjetivo, pero debería haber una diferencia perceptible en la velocidad en dos máquinas diferentes si hay una diferencia significativa entre el rendimiento de las dos máquinas.

  • La velocidad del programa no tiene que estar disminuyendo monotónicamente en todas las máquinas existentes jamás creadas. Esto sería difícil de especificar e incluso más difícil de verificar. Confío en el sentido común de los concursantes sobre lo que se puede considerar un rendimiento significativamente diferente entre las máquinas, y es suficiente para satisfacer eso.

  • Tampoco especificaré límites de tiempo superiores o inferiores exactos, pero debe estar dentro de límites razonables, por lo que no hay días o años entre la impresión de dos líneas, por favor.

  • No requeriré que se ejecute en todo, desde el Eniac hasta la actualidad, pero debería ser lo suficientemente general, por ejemplo, no está permitido decir que solo funciona en dos tipos de CPU específicos, y detecta específicamente el nombre de una CPU específica en el que se ejecutará más lento o más rápido.

  • El código no debe basarse en la versión del compilador o intérprete. Debería funcionar si la misma versión del compilador / intérprete está instalada en una máquina más lenta y más rápida, o incluso si el código binario / byte se compila en una máquina y luego se ejecuta en dos máquinas diferentes.

  • Por favor explique los principios de cómo está funcionando su programa. Como será difícil reproducir los resultados, la validez de la respuesta puede depender de la viabilidad del método.

Aunque me hubiera gustado que se convirtiera en un concurso clandestino, lamentablemente este sitio ya no es "Programming Puzzles & Code Golf", sino simplemente "Code Golf", por lo que gana el código más corto.

vsz
fuente
55
Cuanto más rápida sea la máquina, más lento será el programa. No veo una manera fácil de hacer de esto un criterio objetivo y verificable
Luis Mendo
1
@LuisMendo: Veo al menos dos formas de hacer esto fácilmente.
vsz
1
@vsz El problema que veo es la reproducibilidad. Alguien dice que probaron en dos máquinas y notaron una diferencia significativa en la velocidad según sea necesario, pero no puede reproducir ese comportamiento en sus dos máquinas. Entonces, ¿es válida la respuesta?
Luis Mendo
1
¿Debería estar etiquetado con busy-beaver ?
mbomb007
2
¿Qué consideras que es una "máquina más poderosa" ? ¿Es una máquina con las mismas especificaciones pero más RAM considerada más poderosa? ¿El número de instrucciones que ejecuta el procesador en un segundo? ¿Ambos? ¿Algo más?
Fatalize

Respuestas:

4

Perl, 80 78 71 bytes

-9 bytes gracias a @Dada

$_++;`lscpu`=~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while$_++

Ejecuta el comando lscpuy encuentra la velocidad de la CPU en MHz. Cuanto más rápida es la CPU, más tiempo duerme entre salidas, 1 segundo por cada 1 MHz. Se ejecuta en Ubuntu 14.04.5. En mi máquina en particular, esto prueba cada número cada 800 segundos (13 minutos, 20 segundos). En máquinas más rápidas, esto puede durar más de 50 minutos. Cámbielo a sleep$a/400para obtener algo mucho más sano para fines de prueba.

Gabriel Benamy
fuente
Reorganizar un poco el código da $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_para 71 bytes.
Dada