Nostalgischer Primzahlengenerator [geschlossen]

16

Erinnern Sie sich an die guten alten Zeiten, als das Öffnen eines einfachen Dokuments oder einer Webseite schmerzhaft langsam war, da alle knappen Ressourcen Ihres Computers aufgebraucht waren? Und heute ist es sogar noch langsamer, dies zu tun, obwohl Ihr Prozessor hunderte Male schneller ist und auf tausende Male mehr Speicher zugreifen kann?

Schreiben Sie ein Programm, das sichtbare Leistungsprobleme aufweist, wenn es auf leistungsstärkeren Computern ausgeführt wird, um die Auswirkung von Aufblähungen in aktuellen Dokumentbetrachtungsprogrammen und ähnlichen Anwendungen zu simulieren .

Machen Sie es zu einem Primzahlengenerator , damit alle eine gemeinsame Aufgabe haben .

  • Das Programm muss fortlaufende Primzahlen, beginnend mit 2, jeweils in einer neuen Zeile und sonst nichts ausgeben. Es sollte für immer (oder bis der Speicher ausgeht). So was:
2
3
5
7
11
13
17
  • Zwischen dem Drucken jeder Zeile sollte eine Verzögerung liegen, die für einen Menschen erkennbar ist.

  • Diese Verzögerung sollte länger sein, da der Computer, auf dem das Programm ausgeführt wird, schneller wird. Je schneller die Maschine ist, desto langsamer ist das Programm.

  • Ich werde keine genauen Benchmarks angeben, da dies subjektiv werden könnte, aber es sollte einen von Menschen wahrnehmbaren Unterschied in der Geschwindigkeit auf zwei verschiedenen Maschinen geben, wenn es einen signifikanten Unterschied zwischen der Leistung der beiden Maschinen gibt.

  • Die Geschwindigkeit des Programms muss nicht auf allen vorhandenen Maschinen, die jemals erstellt wurden, monoton abnehmen. Dies wäre schwer zu spezifizieren und noch schwerer zu verifizieren. Ich vertraue dem gesunden Menschenverstand der Wettbewerber in Bezug auf das, was als signifikant unterschiedliche Leistung zwischen Maschinen angesehen werden kann, und es reicht aus, um dies zu befriedigen.

  • Ich werde auch keine genauen oberen oder unteren Zeitlimits angeben, aber es sollte unter vernünftigen Grenzen liegen, also bitte keine Tage oder Jahre zwischen dem Drucken von zwei Zeilen.

  • Ich werde nicht verlangen, dass es auf allen Computern von Eniac bis zu modernen Computern ausgeführt wird, aber es sollte allgemein genug sein. Beispielsweise darf nicht gesagt werden, dass es nur auf zwei bestimmten CPU-Typen funktioniert und speziell den Namen einer bestimmten CPU erkennt auf dem es langsamer oder schneller laufen wird.

  • Der Code sollte nicht von der Compiler- oder Interpreter-Version abhängen. Es sollte funktionieren, wenn dieselbe Version des Compilers / Interpreters sowohl auf einem langsameren als auch auf einem schnelleren Computer installiert ist, oder selbst wenn der Binär- / Bytecode auf einem Computer kompiliert und dann auf zwei verschiedenen Computern ausgeführt wird.

  • Bitte erläutern Sie die Funktionsweise Ihres Programms. Da es schwierig sein wird, die Ergebnisse zu reproduzieren, hängt die Gültigkeit der Antwort möglicherweise von der Durchführbarkeit der Methode ab.

Obwohl ich es mir gewünscht hätte, ein hinterhältiger Wettbewerb zu werden, heißt diese Seite leider nicht mehr "Programmieren von Rätseln und Code Golf", sondern einfach "Code Golf", sodass der kürzeste Code gewinnt.

vsz
quelle
5
Je schneller die Maschine ist, desto langsamer ist das Programm. Ich sehe keine einfache Möglichkeit, dies zu einem objektiven, überprüfbaren Kriterium zu machen
Luis Mendo
1
@ LuisMendo: Ich sehe mindestens zwei Möglichkeiten, dies einfach zu tun.
vsz
1
@vsz Das Problem, das ich sehe, ist die Reproduzierbarkeit. Jemand sagt, dass sie auf zwei Maschinen getestet und einen signifikanten Geschwindigkeitsunterschied festgestellt haben, aber Sie können dieses Verhalten auf Ihren beiden Maschinen nicht reproduzieren. Ist die Antwort also gültig?
Luis Mendo
1
Sollte dies mit beschäftigt-Biber getaggt werden ?
mbomb007
2
Was halten Sie für eine „leistungsstärkere Maschine“ ? Wird eine Maschine mit den gleichen Spezifikationen, aber mehr RAM als leistungsstärker angesehen? Die Anzahl der Anweisungen, die der Prozessor in einer Sekunde ausführt? Beide? Etwas anderes?
Fatalize

Antworten:

4

Perl, 80 78 71 Bytes

-9 Bytes dank @Dada

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

Führt den Befehl aus lscpuund ermittelt die CPU-Geschwindigkeit in MHz. Je schneller die CPU ist, desto länger dauert der Ruhezustand zwischen den Ausgängen (1 Sekunde pro 1 MHz). Läuft unter Ubuntu 14.04.5. Auf meinem speziellen Computer wird jede Nummer alle 800 Sekunden (13 Minuten, 20 Sekunden) getestet. Bei schnelleren Maschinen kann dies über 50 Minuten dauern. Ändern Sie es sleep$a/400, um zu Testzwecken etwas viel Vernünftigeres zu erhalten.

Gabriel Benamy
quelle
Wenn Sie den Code ein wenig $_++;umstellen, erhalten Sie lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_für 71 Byte.
Dada