Tạo một hàm đơn điệu


12

Tổng quat

Trong thử thách này, nhiệm vụ của bạn là tạo ngẫu nhiên một hàm toán học đơn điệu giữa hai bộ.

Đầu vào

Đầu vào của bạn là hai số nguyên dương sn.

Sau khi nhận được các đầu vào này, chương trình của bạn sẽ tạo ra một hàm toán học ngẫu nhiênf từ tập hợp thành . Nói cách khác, là một "quy tắc" mà mất trong một -tuple các số nguyên giữa và , và trả về một số nguyên như vậy. Ngoài ra, nên đơn điệu theo nghĩa sau. Nếu và là hai -upuples giữ cho mọi tọa độ , thì .{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

Phân phối chính xác của các hàm đơn điệu fkhông thành vấn đề, miễn là mỗi hàm như vậy có xác suất dương được tạo ra (giả sử RNG hoàn hảo).

Đầu ra

Đầu ra của bạn sẽ là một bảng liệt kê các đầu vào và đầu ra của f. Nó sẽ chứa tất cả ncác số nguyên giữa 0s-1theo một số thứ tự, mỗi số được theo sau bởi đầu ra tương ứng của f. Các định dạng đầu ra chính xác là linh hoạt (trong lý do).

Ví dụ

Các đầu vào s = 3n = 2có thể tạo ra đầu ra

(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2

Nó chứa tất cả các cặp trên tập hợp {0, 1, 2}chính xác một lần và mỗi cặp được theo sau bởi giá ftrị của nó . Điều kiện đơn điệu cũng được thỏa mãn. Các bộ dữ liệu được đưa ra ở đây theo thứ tự từ điển, nhưng điều này là không cần thiết.

Một ví dụ khác, s = 2n = 4có thể sản xuất

(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1

Sau đây là tất cả các kết quả đầu ra có thể cho s = 2n = 2(sắp xếp lại các bộ dữ liệu); chương trình của bạn sẽ xuất ngẫu nhiên một trong số chúng:

(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1

Quy tắc và chấm điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Mã với lời giải thích được ưa thích.

Không có giới hạn về độ phức tạp thời gian, nhưng tôi sẽ cho tiền thưởng -15% nếu giải pháp của bạn luôn được đảm bảo hoàn thành trong một khoảng thời gian nhất định (tùy thuộc vào đầu vào và giả sử RNG hoàn hảo chạy trong thời gian không đổi) .


Nó có thể hữu ích nếu bạn liệt kê hoàn toàn tất cả các hàm có thể cho một trường hợp nhỏ như s = 2 n = 2. Tôi đã phải đọc mô tả một vài lần để nắm bắt sự ngẫu nhiên sẽ diễn ra như thế nào.
Sparr

@Sparr Ý kiến ​​hay; chỉnh sửa.
Zgarb

thời gian chạy bị ràng buộc là một yêu cầu? Tôi đang suy nghĩ về một giải pháp tạo ra các hàm ngẫu nhiên cho đến khi nó tìm thấy một hàm đơn điệu.
Sparr

@Sparr Tôi nghĩ rằng tôi sẽ thêm phần thưởng cho thời gian chạy bị ràng buộc, vì vậy giải pháp như vậy sẽ không bị loại.
Zgarb

@Zgarb - có lẽ bạn nên kiếm một khoản tiền thưởng lớn cho các giải pháp bị ràng buộc và có khả năng hoàn thành trong vòng một giờ.
Glen O

Câu trả lời:


4

Pyth, 35 byte (38 - 15% = 31,45 xa hơn)

#I!sm><FhMds<MCeMd^JC,mOQK^UQvzK2JB

Trình diễn

Đầu vào có định dạng:

n
s

Đầu ra có định dạng:

[[value, tuple], [value, tuple], ...]

Đơn giản chỉ cần tạo ra các khả năng ngẫu nhiên và kiểm tra chúng.


Phiên bản 37 byte thay thế mà tôi tin rằng đủ điều kiện nhận thưởng:

Of!sm><FhMds<MCeMd^T2mC,d^UQvz^UQ^Qvz

Trình diễn

Điều này bắt đầu bằng cách tạo ra tất cả các hàm đơn điệu có thể, sau đó xuất ra một hàm ngẫu nhiên. Nó chậm hơn nhiều, và đứng đầu tại 2,2.


Ví dụ đẹp với đầu vào 3, 2. Thật không may, tôi thậm chí không nhận được phản hồi cho 3, 3người thực thi trực tuyến. Có một vòng lặp vô tận cho sự kết hợp này?!
bobbel

@bobbel Người thực thi trực tuyến có thời gian chờ, tôi nghĩ vậy. Tôi thử nó tại địa phương.
isaacg

@bobbel Đó không phải là một vòng lặp infitie có một vòng rất chậm. Nó cũng hoạt động cho 2, 4, nhưng không nhiều.
isaacg

@bobbel Tôi đã thêm một cái gì đó thậm chí chậm hơn.
isaacg

1

CJam, 40 byte - 15% = 34 byte

q~1$\m*\1$,m*{W$\.+2m*{:.<2b}%1&!},mR]zp

Cách tiếp cận này tạo ra tất cả các chức năng hợp lệ và sau đó chọn ngẫu nhiên. Thời gian chạy ít nhất là O (s 2s n ) , nhưng không đổi cho một đầu vào nhất định.

Tôi nghi ngờ đây là những gì OP có trong đầu, nhưng nó được đảm bảo hoàn thành trong một khoảng thời gian nhất định (tùy thuộc vào đầu vào [...]) và do đó đủ điều kiện nhận thưởng.

Hãy thử trực tuyến trong trình thông dịch CJam .


1

Julia, 64 byte (-15% = 54,4)

g(s,n)=(K=rand(0:s-1,ntuple(n,i->s));for i=1:n K=sort(K,i)end;K)

Ung dung:

function g(s,n)
  # Generates a random n-dimensional array with s per dimension
  # and all values being integers between 0 and s-1
  K=rand(0:s-1,ntuple(n,i->s))
  # Loop over the various dimensions
  for i=1:n
    # Sort in the current dimension
    K=sort(K,i)
  end
  return K
end

Điều này sẽ chạy nhanh, với vấn đề duy nhất có thể xảy ra với bộ nhớ đủ lớn và s (g (10,10) phải tạo ra một mảng 10 ^ 10, vì vậy rõ ràng là nó sẽ hết bộ nhớ - ngay cả khi mỗi số là một byte, đó là 10 gigabyte dữ liệu).

Đầu ra là lập chỉ mục dựa trên 1, vì vậy để xác định kết quả cho một đầu vào nhất định, bạn cần thêm một vào mỗi giá trị đầu vào. Ví dụ, để tìm f (1,2,6,0,3), bạn cần kiểm tra K[2,3,7,1,4].

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.