Gerador nostálgico de números primos [fechado]

16

Lembre-se dos bons velhos tempos em que abrir um documento ou página da web simples era dolorosamente lento, pois consumia todos os poucos recursos que o seu computador possuía? E hoje, fazer o mesmo é ainda mais lento, apesar de seu processador ser centenas de vezes mais rápido e ter acesso a milhares de vezes mais memória?

Para simular o efeito de inchaço nos visualizadores de documentos atuais e aplicativos similares, escreva um programa que tenha problemas visíveis de desempenho quando executado em máquinas mais poderosas .

Para ter uma tarefa comum para todos, torne-o um gerador de números primos .

  • O programa precisa imprimir números primos consecutivos, começando com 2, cada um em uma nova linha e nada mais. Deve fazer isso para sempre (ou até ficar sem memória). Como isso:
2
3
5
7
11
13
17
  • Deve haver um atraso entre a impressão de cada linha, o suficiente para ser percebido por um ser humano.

  • Esse atraso deve ser maior à medida que a máquina em que o programa está sendo executado fica mais rápida. Quanto mais rápido a máquina, mais lento o programa.

  • Não especificarei parâmetros de referência exatos, pois podem se tornar subjetivos, mas deve haver uma diferença perceptível ao homem na velocidade em duas máquinas diferentes se houver diferença significativa entre o desempenho das duas máquinas.

  • A velocidade do programa não precisa diminuir monotonicamente em todas as máquinas existentes já criadas. Isso seria difícil de especificar e ainda mais difícil de verificar. Confio no senso comum dos concorrentes sobre o que pode ser considerado um desempenho significativamente diferente entre as máquinas, e é suficiente para satisfazer isso.

  • Também não especificarei limites de tempo superiores ou inferiores exatos, mas deve estar dentro de limites razoáveis, portanto, não haverá dias ou anos entre a impressão de duas linhas.

  • Não exigirei que ele seja executado em tudo, desde o Eniac até os dias modernos, mas deve ser geral o suficiente, por exemplo, não é permitido dizer que funciona apenas em dois tipos específicos de CPU e detecta especificamente o nome de uma CPU específica no qual ele será executado mais devagar ou mais rápido.

  • O código não deve depender da versão do compilador ou intérprete. Deverá funcionar se a mesma versão do compilador / intérprete estiver instalada em uma máquina mais lenta e mais rápida, ou mesmo se o binário / bytecode for compilado em uma máquina e depois executado em duas máquinas diferentes.

  • Por favor, explique os princípios de como seu programa está operando. Como será difícil reproduzir os resultados, a validade da resposta pode depender da viabilidade do método.

Embora eu tenha gostado de se tornar um concurso secreto, infelizmente este site não é mais "Programming Puzzles & Code Golf", mas simplesmente "Code Golf", então o código mais curto vence.

vsz
fonte
5
Quanto mais rápido a máquina, mais lento o programa. Eu não vejo uma maneira fácil de fazer isso, um critério verificável objetivo
Luis Mendo
1
@LuisMendo: Eu vejo pelo menos duas maneiras de fazer isso facilmente.
vsz 6/12/16
1
@ vsz O problema que vejo é a reprodutibilidade. Alguém diz que testou em duas máquinas e notou uma diferença significativa na velocidade, conforme necessário, mas você não pode reproduzir esse comportamento nas duas máquinas. Então a resposta é válida?
Luis Mendo
1
Isso deve ser marcado com busy-castor ?
mbomb007
2
O que você considera uma “máquina mais poderosa” ? Uma máquina com as mesmas especificações, mas com mais RAM, é considerada mais poderosa? O número de instruções que o processador executa em um segundo? Ambos? Algo mais?
Fatalize

Respostas:

4

Perl, 80 78 71 bytes

-9 bytes graças a @Dada

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

Executa o comando lscpue encontra a velocidade da CPU em MHz. Quanto mais rápido o CPU, mais tempo dorme entre as saídas, 1 segundo para cada 1 MHz. Executa no Ubuntu 14.04.5. Na minha máquina particular, isso testa cada número a cada 800 segundos (13 minutos, 20 segundos). Em máquinas mais rápidas, isso pode levar mais de 50 minutos. Altere sleep$a/400para obter algo muito mais sensato para fins de teste.

Gabriel Benamy
fonte
Reorganizar um pouco o código fornece $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_para 71 bytes.
Dada