Generator bilangan prima nostalgia [ditutup]

16

Ingat masa lalu yang baik ketika membuka dokumen sederhana atau halaman web sangat lambat karena memiliki semua sumber daya yang dimiliki komputer Anda? Dan hari ini, melakukan hal yang sama bahkan lebih lambat, meskipun prosesor Anda menjadi ratusan kali lebih cepat dan memiliki akses ke ribuan kali lebih banyak memori?

Untuk mensimulasikan efek mengasapi pada pemirsa dokumen saat ini dan aplikasi serupa, tulis sebuah program yang memiliki masalah kinerja yang terlihat ketika dijalankan pada mesin yang lebih kuat .

Untuk memiliki tugas bersama untuk semua orang, jadikan sebagai pembangkit bilangan prima .

  • Program harus mencetak bilangan prima berurutan, mulai dari 2, masing-masing dalam baris baru, dan tidak ada yang lain. Seharusnya ini selamanya (atau sampai kehabisan memori). Seperti ini:
2
3
5
7
11
13
17
  • Seharusnya ada penundaan antara mencetak setiap baris, cukup untuk bisa dipahami oleh manusia.

  • Penundaan ini harus lebih lama karena mesin yang menjalankan program menjadi lebih cepat. Semakin cepat mesin, semakin lambat programnya.

  • Saya tidak akan menentukan tolok ukur yang tepat karena mungkin menjadi subjektif, tetapi harus ada perbedaan yang dapat dilihat manusia dalam kecepatan pada dua mesin yang berbeda jika ada perbedaan yang signifikan antara kinerja kedua mesin.

  • Kecepatan program tidak harus menurun secara monoton di semua mesin yang ada yang pernah dibuat. Ini akan sulit ditentukan, dan bahkan lebih sulit untuk diverifikasi. Saya mempercayai akal sehat para kontestan tentang apa yang dapat dianggap sebagai kinerja yang sangat berbeda antara mesin, dan cukup untuk memuaskan itu.

  • Saya juga tidak akan menentukan batas waktu tepat atas atau bawah, tetapi harus di bawah batas wajar, jadi tidak ada hari atau tahun antara mencetak dua baris.

  • Saya tidak akan memerlukannya untuk berjalan di segala sesuatu dari Eniac hingga hari modern, tetapi harus cukup umum, misalnya, itu tidak diperbolehkan untuk mengatakan itu hanya bekerja pada dua jenis CPU tertentu, dan secara khusus mendeteksi nama satu CPU tertentu di mana ia akan berjalan lebih lambat atau lebih cepat.

  • Kode tidak boleh bergantung pada versi kompiler atau interpreter. Ini harus bekerja jika versi yang sama dari kompiler / juru bahasa dipasang pada mesin yang lebih lambat dan lebih cepat, atau bahkan jika biner / bytecode dikompilasi pada satu mesin dan kemudian dijalankan pada dua mesin yang berbeda.

  • Tolong jelaskan prinsip-prinsip bagaimana program Anda beroperasi. Karena akan sulit untuk mereproduksi hasil, validitas jawaban mungkin tergantung pada kelayakan metode.

Meskipun saya ingin itu menjadi kontes curang, sayangnya situs ini tidak lagi "Programming Puzzles & Code Golf" tetapi hanya "Code Golf", jadi kode terpendek yang menang.

vsz
sumber
5
Semakin cepat mesin, semakin lambat programnya. Saya tidak melihat cara mudah untuk menjadikan ini kriteria objektif dan dapat diverifikasi
Luis Mendo
1
@LuisMendo: Saya melihat setidaknya dua cara untuk melakukan ini dengan mudah.
vsz
1
@ vsz Masalah yang saya lihat adalah reproduktifitas. Seseorang mengatakan mereka menguji pada dua mesin dan melihat perbedaan signifikan dalam kecepatan seperti yang diperlukan, tetapi Anda tidak dapat mereproduksi perilaku itu di dua mesin Anda. Jadi, apakah jawabannya valid?
Luis Mendo
1
Haruskah ini ditandai dengan berang-berang yang sibuk ?
mbomb007
2
Apa yang Anda anggap sebagai "mesin yang lebih kuat" ? Apakah mesin dengan spesifikasi yang sama tetapi lebih banyak RAM dianggap lebih kuat? Jumlah instruksi yang dijalankan prosesor dalam sedetik? Kedua? Sesuatu yang lain
Fatalkan

Jawaban:

4

Perl, 80 78 71 byte

-9 byte terima kasih kepada @Dada

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

Jalankan perintah lscpudan temukan kecepatan CPU dalam MHz. Semakin cepat CPU, semakin banyak waktu tidur di antara output, 1 detik untuk setiap 1 MHz. Berjalan di Ubuntu 14.04.5. Di mesin khusus saya, ini menguji setiap angka setiap 800 detik (13 menit, 20 detik). Pada mesin yang lebih cepat, ini bisa lebih dari 50 menit. Ubah untuk sleep$a/400menjadi sesuatu yang lebih waras untuk tujuan pengujian.

Gabriel Benamy
sumber
Mengatur ulang kode sedikit memberikan $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_untuk 71 byte.
Dada