Giới thiệu về bộ
Trước hết, bạn có thể coi điều này giống như bất kỳ thử thách chơi gôn mã nào khác, và trả lời nó mà không phải lo lắng về loạt bài này. Tuy nhiên, có một bảng xếp hạng trên tất cả các thách thức. Bạn có thể tìm thấy bảng xếp hạng cùng với một số thông tin khác về loạt bài trong bài đầu tiên .
Mặc dù tôi có một loạt các ý tưởng được xếp hàng cho loạt bài này, những thách thức trong tương lai vẫn chưa được đặt ra. Nếu bạn có bất kỳ đề xuất nào, xin vui lòng cho tôi biết trên bài đăng hộp cát có liên quan .
Lỗ 3: Phân vùng nguyên
Thời gian để tăng độ khó một chút.
Một phân vùng của một số nguyên dương n
được định nghĩa là một bội của các số nguyên dương mà tổng hợp với n
. Như một ví dụ nếu n = 5
, các phân vùng sau tồn tại:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Lưu ý rằng đây là nhiều trang, vì vậy không có thứ tự nào cho chúng {3,1,1}
, {1,3,1}
và{1,1,3}
tất cả đều được coi là giống hệt nhau.
Nhiệm vụ của bạn là, được đưa ra n
, để tạo một phân vùng ngẫu nhiên n
. Dưới đây là các quy tắc chi tiết:
Việc phân phối các phân vùng được sản xuất phải thống nhất . Đó là, trong ví dụ trên, mỗi phân vùng phải được trả về với xác suất 1/7.
Tất nhiên, do những hạn chế kỹ thuật của PRNG, tính đồng nhất hoàn hảo sẽ là không thể. Với mục đích đánh giá tính đồng nhất của bài nộp của bạn, các hoạt động sau đây sẽ được coi là mang lại sự phân phối thống nhất hoàn hảo:
- Lấy số từ PRNG (trên bất kỳ phạm vi nào), được ghi nhận là đồng nhất (xấp xỉ).
- Ánh xạ phân bố đồng đều trên một tập hợp số lớn hơn vào một tập nhỏ hơn thông qua modulo hoặc phép nhân (hoặc một số thao tác khác phân phối các giá trị đồng đều). Tập lớn hơn phải chứa ít nhất 1024 lần giá trị có thể so với tập nhỏ hơn.
Vì các phân vùng là nhiều trang, bạn có thể trả lại chúng theo bất kỳ thứ tự nào và thứ tự này không nhất thiết phải nhất quán. Tuy nhiên, với mục đích phân phối ngẫu nhiên, thứ tự bị bỏ qua. Đó là, trong ví dụ trên
{3,1,1}
,{1,3,1}
và{1,1,3}
cùng nhau phải có xác suất 1/7 được trả lại.- Thuật toán của bạn phải có thời gian chạy xác định. Cụ thể, bạn không thể tạo nhiều trang ngẫu nhiên và từ chối chúng nếu chúng không tổng hợp
n
. - Độ phức tạp thời gian của thuật toán của bạn phải là đa thức
n
. Cụ thể, bạn không thể đơn giản tạo tất cả các phân vùng và chọn một phân vùng ngẫu nhiên (vì số lượng phân vùng tăng theo cấp số nhânn
). Bạn có thể cho rằng PRNG bạn đang sử dụng có thể trả về các giá trị được phân phối đồng đều theo O (1) cho mỗi giá trị. - Bạn không được sử dụng bất kỳ chức năng tích hợp nào để giải quyết công việc này.
Bạn có thể viết một chương trình đầy đủ hoặc một hàm và nhận đầu vào thông qua STDIN hoặc đối số dòng lệnh hoặc đối số hàm thay thế gần nhất và tạo đầu ra thông qua giá trị trả về hoặc bằng cách in ra STDOUT (hoặc thay thế gần nhất).
Bạn có thể giả định rằng n ≤ 65
(sao cho số lượng phân vùng ít hơn 2 21 ). Đầu ra có thể ở bất kỳ định dạng chuỗi hoặc danh sách thuận tiện, rõ ràng.
Nếu bạn gửi một hàm, vui lòng xem xét việc cung cấp một chương trình thử nghiệm nhỏ gọi hàm đó một số lần và in kết quả. Không sao nếu các tham số phải được điều chỉnh trong mã. Đây chỉ là để mọi người có thể kiểm tra rằng giải pháp ít nhất là đồng nhất.
Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng. Và tất nhiên, lần gửi ngắn nhất cho mỗi người dùng cũng sẽ tham gia vào bảng xếp hạng tổng thể của loạt bài.
Bảng xếp hạng
Bài đầu tiên của loạt bài tạo ra một bảng thành tích.
Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu mọi câu trả lời bằng tiêu đề, sử dụng mẫu Markdown sau:
# Language Name, N bytes
nơi N
là kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Ngôn ngữ hiện không được hiển thị, nhưng đoạn mã yêu cầu và phân tích nó và tôi có thể thêm bảng xếp hạng ngôn ngữ trong tương lai.)