Trình tạo số nguyên tố hoài cổ [đóng]


16

Bạn còn nhớ những ngày xưa tốt đẹp khi mở một tài liệu đơn giản hoặc trang web bị chậm một cách đau đớn vì nó đã ăn cắp tất cả các tài nguyên ít ỏi mà máy tính của bạn có? Và ngày nay, làm điều tương tự thậm chí còn chậm hơn, mặc dù bộ xử lý của bạn nhanh hơn hàng trăm lần và có quyền truy cập vào bộ nhớ gấp hàng nghìn lần?

Để mô phỏng hiệu ứng phình to trong trình xem tài liệu hiện tại và các ứng dụng tương tự, hãy viết chương trình có vấn đề về hiệu suất rõ ràng khi chạy trên các máy mạnh hơn .

Để có một nhiệm vụ chung cho tất cả mọi người, hãy biến nó thành một trình tạo số nguyên tố .

  • Chương trình phải in các số nguyên tố liên tiếp, bắt đầu từ 2, mỗi số trong một dòng mới và không có gì khác. Nó sẽ để điều này mãi mãi (hoặc cho đến khi hết bộ nhớ). Như thế này:
2
3
5
7
11
13
17
  • Cần có một độ trễ giữa việc in từng dòng, đủ để con người có thể nhận thấy.

  • Độ trễ này phải dài hơn vì máy chương trình đang chạy nhanh hơn. Máy càng nhanh, chương trình càng chậm.

  • Tôi sẽ không chỉ định điểm chuẩn chính xác vì nó có thể trở nên chủ quan, nhưng sẽ có sự khác biệt rõ rệt về tốc độ của con người trên hai máy khác nhau nếu có sự khác biệt đáng kể giữa hiệu suất của hai máy.

  • Tốc độ của chương trình không phải giảm một cách đơn điệu trên tất cả các máy hiện có từng được tạo. Điều này sẽ khó xác định, và thậm chí khó xác minh hơn. Tôi tin tưởng vào ý thức chung của các thí sinh về những gì có thể được coi là hiệu suất khác biệt đáng kể giữa các máy và nó đủ để đáp ứng điều đó.

  • Tôi cũng sẽ không chỉ định giới hạn thời gian chính xác trên hoặc dưới, nhưng nó phải ở dưới giới hạn hợp lý, vì vậy vui lòng không có ngày hoặc năm giữa hai lần in.

  • Tôi sẽ không yêu cầu nó chạy trên mọi thứ từ Eniac cho đến thời hiện đại, nhưng nó phải đủ chung chung, ví dụ, không được phép nói nó chỉ hoạt động trên hai loại CPU cụ thể và đặc biệt phát hiện tên của một CPU cụ thể trên đó nó sẽ chạy chậm hơn hoặc nhanh hơn.

  • Mã không nên dựa vào trình biên dịch hoặc phiên bản thông dịch. Nó sẽ hoạt động nếu cùng một phiên bản của trình biên dịch / trình thông dịch được cài đặt trên cả máy chậm hơn và nhanh hơn hoặc ngay cả khi mã nhị phân / mã byte được biên dịch trên một máy và sau đó chạy trên hai máy khác nhau.

  • Vui lòng giải thích các nguyên tắc về cách chương trình của bạn đang hoạt động. Vì sẽ khó tái tạo kết quả, tính hợp lệ của câu trả lời có thể phụ thuộc vào tính khả thi của phương pháp.

Mặc dù tôi muốn nó trở thành một cuộc thi ngầm, nhưng thật đáng buồn, trang web này không còn là "Câu đố lập trình & Golf Code" mà chỉ đơn giản là "Code Golf", vì vậy mã ngắn nhất sẽ thắng.


5
Máy càng nhanh, chương trình càng chậm. Tôi không thấy một cách dễ dàng để biến điều này thành một tiêu chí khách quan, có thể kiểm chứng
Luis Mendo 6/12/2016

1
@LuisMendo: Tôi thấy ít nhất hai cách để dễ dàng thực hiện việc này.
vsz

1
@vsz Vấn đề tôi thấy là độ tái lập. Ai đó nói rằng họ đã thử nghiệm trên hai máy và nhận thấy sự khác biệt đáng kể về tốc độ theo yêu cầu, nhưng bạn không thể tái tạo hành vi đó trên hai máy của mình. Vậy câu trả lời có hợp lệ không?
Luis Mendo

1
Điều này có nên được gắn thẻ với busy-beaver ?
mbomb007

2
Bạn nghĩ gì khi trở thành một cỗ máy mạnh mẽ hơn của người Viking ? Là một máy có cùng thông số kỹ thuật nhưng RAM nhiều hơn được coi là mạnh hơn? Số lượng lệnh mà bộ xử lý chạy trong một giây? Cả hai? Thứ gì khác?
Gây tử vong

Câu trả lời:


4

Perl, 80 78 71 byte

-9 byte nhờ @Dada

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

Chạy lệnh lscpuvà tìm tốc độ CPU tính bằng MHz. CPU càng nhanh, thời gian ngủ giữa các đầu ra càng nhiều, 1 giây cho mỗi 1 MHz. Chạy trên Ubuntu 14.04.5. Trên máy cụ thể của tôi, thao tác này kiểm tra từng số sau mỗi 800 giây (13 phút, 20 giây). Trên các máy nhanh hơn, điều này có thể hơn 50 phút. Thay đổi nó để sleep$a/400có được một cái gì đó lành mạnh hơn nhiều cho mục đích thử nghiệm.


Sắp xếp lại mã một chút sẽ cung cấp $_++;lscpu =~/z:\s+(\d+)/,sleep$1,(1x$_)!~/^(11+?)\1+$/&&say while++$_cho 71 byte.
Dada
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.