Générateur de nombres premiers nostalgiques [fermé]

16

Vous vous souvenez du bon vieux temps où l'ouverture d'un simple document ou d'une page Web était péniblement lente car elle monopolisait toutes les maigres ressources de votre ordinateur? Et aujourd'hui, faire la même chose est encore plus lent, bien que votre processeur soit des centaines de fois plus rapide et ait accès à des milliers de fois plus de mémoire?

Pour simuler l'effet du ballonnement dans les visionneuses de documents actuelles et les applications similaires, écrivez un programme qui présente des problèmes de performances visibles lorsqu'il est exécuté sur des machines plus puissantes .

Pour avoir une tâche commune pour tout le monde, faites-en un générateur de nombres premiers .

  • Le programme doit imprimer des nombres premiers consécutifs, à partir de 2, chacun dans une nouvelle ligne, et rien d'autre. Il devrait le faire pour toujours (ou jusqu'à épuisement de la mémoire). Comme ça:
2
3
5
7
11
13
17
  • Il devrait y avoir un délai entre l'impression de chaque ligne, suffisamment pour être perceptible par un humain.

  • Ce délai doit être plus long car la machine sur laquelle le programme s'exécute devient plus rapide. Plus la machine est rapide, plus le programme est lent.

  • Je ne spécifierai pas de repères exacts car cela pourrait devenir subjectif, mais il devrait y avoir une différence perceptible par l'homme dans la vitesse sur deux machines différentes s'il y a une différence significative entre les performances des deux machines.

  • Il n'est pas nécessaire que la vitesse du programme diminue de façon monotone sur toutes les machines existantes jamais créées. Ce serait difficile à spécifier et encore plus difficile à vérifier. Je fais confiance au bon sens des concurrents sur ce qui peut être considéré comme une performance significativement différente entre les machines et cela suffit pour le satisfaire.

  • Je ne spécifierai pas non plus de délais exacts supérieurs ou inférieurs, mais cela devrait être dans des limites raisonnables, donc pas de jours ou d'années entre l'impression de deux lignes s'il vous plaît.

  • Je ne l'exigerai pas pour fonctionner sur tout, de l'Eniac à l'époque moderne, mais il devrait être assez général, par exemple, il n'est pas autorisé de dire qu'il ne fonctionne que sur deux types de CPU spécifiques et détecte spécifiquement le nom d'un CPU spécifique sur lequel il fonctionnera plus lentement ou plus rapidement.

  • Le code ne doit pas s'appuyer sur la version du compilateur ou de l'interpréteur. Cela devrait fonctionner si la même version du compilateur / interpréteur est installée à la fois sur une machine plus lente et plus rapide, ou même si le code binaire / bytecode est compilé sur une seule machine, puis exécuté sur deux machines différentes.

  • Veuillez expliquer les principes de fonctionnement de votre programme. Comme il sera difficile de reproduire les résultats, la validité de la réponse pourrait dépendre de la faisabilité de la méthode.

Bien que j'aurais aimé qu'il devienne un concours sournois, ce site n'est malheureusement plus "Programmation des puzzles et du code golf" mais simplement "Code golf", donc le code le plus court l'emporte.

vsz
la source
5
Plus la machine est rapide, plus le programme est lent. Je ne vois pas de moyen facile d'en faire un critère objectif et vérifiable
Luis Mendo
1
@LuisMendo: Je vois au moins deux façons de le faire facilement.
vsz
1
@vsz Le problème que je vois est la reproductibilité. Quelqu'un dit avoir testé sur deux machines et remarqué une différence de vitesse significative, mais vous ne pouvez pas reproduire ce comportement sur vos deux machines. La réponse est-elle donc valable?
Luis Mendo
1
Est-ce que cela devrait être étiqueté avec castor occupé ?
mbomb007
2
Que considérez-vous comme une «machine plus puissante» ? Une machine avec les mêmes spécifications mais plus de RAM est-elle considérée comme plus puissante? Le nombre d'instructions que le processeur exécute en une seconde? Tous les deux? Autre chose?
Fatalize

Réponses:

4

Perl, 80 78 71 octets

-9 octets grâce à @Dada

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

Exécute la commande lscpuet trouve la vitesse du processeur en MHz. Plus le processeur est rapide, plus il passe de temps entre les sorties, 1 seconde pour chaque 1 MHz. Fonctionne sur Ubuntu 14.04.5. Sur ma machine particulière, cela teste chaque numéro toutes les 800 secondes (13 minutes, 20 secondes). Sur des machines plus rapides, cela peut durer plus de 50 minutes. Modifiez-le pour sleep$a/400obtenir quelque chose de beaucoup plus sain d'esprit à des fins de test.

Gabriel Benamy
la source
Réorganiser un peu le code donne $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_pour 71 octets.
Dada