Như chúng ta đã biết, các hệ điều hành hiện đại có các bộ lập lịch luồng có thể chọn các đơn đặt hàng khác nhau để lên lịch cho các luồng của bạn dựa trên logic bên trong mà mã của bạn không thuộc về. Thông thường, bạn thiết kế mã đa luồng của mình để đảm bảo rằng tính không đặc biệt này áp đặt lên bạn không ảnh hưởng một cách có ý nghĩa đến đầu ra của bạn.
Mục tiêu ở đây là ngược lại. Tạo một chương trình in các số nguyên trong khoảng [0,99] nhưng theo thứ tự sẽ thay đổi từ chạy sang chạy do bộ lập lịch xử lý luồng của hệ điều hành.
Bạn phải đạt được "đủ điều kiện không xác định", được định nghĩa là:
Trong 10 bộ liên tiếp gồm 10 thử nghiệm, chương trình của bạn phải tạo ra ít nhất 9 hoán vị duy nhất trong mỗi thử nghiệm. Bạn có thể có một số lượng hợp lý các thử nghiệm thất bại ở hai bên của 10 lần liên tiếp thành công.
Hoặc, nói cách khác, bạn cần 100 lần chạy chương trình trong đó mỗi khối 10 lần chạy có nhiều nhất hai lần chạy cùng một thứ.
Vì vậy, đôi khi hoán đổi 98 và 99 sẽ không cắt nó.
Đây là một môn đánh gôn , vì vậy câu trả lời sử dụng ít byte nhất sẽ thắng.
Minutiae
- Viết đầu ra của bạn vào thiết bị xuất chuẩn, một mục nhập trên mỗi dòng
- Nếu bạn quản lý định dạng bằng cách có hai luồng ký tự xen kẽ ghi vào thiết bị xuất chuẩn (thậm chí đôi khi) dẫn đến những thứ như số có ba chữ số hoặc dòng trống, kết quả của bạn không hợp lệ
- Ngoại lệ duy nhất cho quy tắc trên là bạn có thể phát ra một dòng trống duy nhất sau khi in số bắt buộc cuối cùng (bạn được chào đón)
- Nếu bạn bỏ lỡ hoặc sao chép bất kỳ giá trị bắt buộc nào, kết quả của bạn không hợp lệ
- Chương trình của bạn không cần phải không xác định trên một bộ xử lý lõi đơn (mặc dù là kudos)
- Chương trình của bạn có thể sử dụng các luồng / sợi màu xanh lá cây không thực sự được quản lý bởi nhân hệ điều hành. Nó vẫn đáp ứng các yêu cầu khác của thử thách và hệ thống luồng là một phần của ngôn ngữ hoặc thư viện chuẩn cho ngôn ngữ của bạn
- Thời gian chạy cho chương trình của bạn phải đáng tin cậy dưới 5 giây trên bộ xử lý hiện đại
- Bạn không được chỉ định các thay đổi đối với môi trường xảy ra bên ngoài chương trình của mình, chẳng hạn như chờ đợi hoặc thay đổi cài đặt; chương trình của bạn sẽ vượt qua cho dù chạy 100 lần trở lại hoặc với một giờ giữa mỗi lần chạy hoặc 100 lần song song (điều đó có thể thực sự giúp ích ...)
- Bạn có thể sử dụng bộ đồng xử lý như GPU hoặc Xeon Phi và cơ chế lập lịch trình nội bộ của riêng nó cho các tác vụ. Các quy tắc áp dụng cho điều này giống như cách họ áp dụng cho các chủ đề màu xanh lá cây.
- Vui lòng khiêu khích người lập lịch với tất cả các cách ngủ, sản lượng và các thủ thuật khác miễn là bạn tuân thủ các quy tắc được chỉ định trong bài đăng này
Hoạt động cấm
Nguồn duy nhất của thuyết không điều kiện mà bạn được phép rút ra là khi trình lập lịch biểu lập lịch trình các chủ đề của bạn để chạy. Danh sách sau đây không đầy đủ, chỉ nhằm mục đích cung cấp các ví dụ về những điều bạn không được phép làm khi họ thừa nhận các nguồn khác của thuyết không điều kiện.
- Truy cập trực tiếp hoặc gián tiếp vào bất kỳ loại khả năng RNG PRNG hoặc phần cứng nào (trừ khi nó là một phần vốn có của bộ lập lịch).
- Đọc trong bất kỳ loại đầu vào nào (thời gian hệ thống, hệ thống tập tin, mạng, v.v.)
- Đọc ID luồng hoặc ID tiến trình
- Tùy chỉnh bộ lập lịch hệ điều hành; bạn phải sử dụng bộ lập lịch hệ điều hành tiêu chuẩn từ hệ điều hành chính
- Tùy chỉnh lịch trình sợi / sợi màu xanh lá cây của bạn cũng bị cấm. Điều này có nghĩa là nếu bạn viết một ngôn ngữ cho thử thách này, bạn phải sử dụng các luồng của hệ điều hành.
Xác nhận câu trả lời
Tốt nhất là một câu trả lời sẽ hoạt động trên tất cả các hệ điều hành phổ biến và bộ xử lý hiện đại, với danh hiệu được trao tỷ lệ thuận với độ rộng của hỗ trợ. Tuy nhiên, đây không phải là một yêu cầu của thách thức. Tối thiểu một câu trả lời phải hỗ trợ một bộ xử lý SMP hiện đại và HĐH hiện đại. Tôi sẽ kiểm tra các câu trả lời hàng đầu trong phạm vi khả dụng phần cứng của tôi.
- Nếu mục nhập của bạn sẽ không tạo ra đầu ra cần thiết trên i7 5960x chạy Windows 10 v1607 x64, hãy chỉ định môi trường cần thiết
- Nếu đó là thứ tôi có thể dễ dàng sao chép bằng VMWare Workstation, hãy cung cấp thông số kỹ thuật cho hệ điều hành và VM chính xác
- Nếu không thể được sản xuất trong một trong các điều kiện đó, hãy ghi lại bản chụp màn hình đồng thời của bài kiểm tra như được mô tả trong phần tiêu đề và bản ghi video cầm tay của màn hình với sự tương tác giữa chuột và bàn phím của bạn (hoặc bất kỳ sơ đồ điều khiển nào tính toán không chuẩn của bạn sử dụng thiết bị) hiển thị rõ ràng và đăng cả hai video cùng với câu trả lời của bạn và bao gồm giải thích lý do tại sao nó hoạt động
- Cách khác, hãy lấy một người dùng lâu năm có uy tín (không phải là bạn) với phần cứng phù hợp để tái tạo kết quả và chứng từ cho bạn
- Nếu mục nhập của bạn bằng ngôn ngữ lập trình kỳ lạ mà nhà phát triển thông thường sẽ không được thiết lập để biên dịch / jit / phiên dịch, hãy cung cấp hướng dẫn thiết lập
- Nếu bạn nhập tùy thuộc vào một phiên bản cụ thể của trình thông dịch JVM / Python / khác, hãy xác định
- Nếu phải mất hơn 10 phút chạy ngược lại để có được 10 thử nghiệm liên tiếp thành công trong thử nghiệm của tôi thì bạn đã thất bại (vì vậy đừng để điều kiện thành công xảy ra, đặc biệt là nếu bạn ở gần phía trên thời gian chạy bị ràng buộc)