Hãy tưởng tượng bạn có hai hộp B(x)
và B(y)
mỗi hộp chứa một bit không xác định - 0 hoặc 1 và một máy F
có thể chụp X-quang chúng và tạo ra hộp thứ ba cho B(x^y)
( xor ). F
cũng có thể tính toán B(x*y)
( và ). Trên thực tế, đó chỉ là những trường hợp đặc biệt của hoạt động đơn lẻ mà máy có thể thực hiện - mỗi sản phẩm bên trong , được ký hiệu F()
bên dưới.
Đối với hai mảng có cùng độ dài
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
sản phẩm bên trong được định nghĩa là
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" Mỗi " có nghĩa là F()
có thể xử lý nhiều cặpx[]
, y[]
trong một lần. Các x[]
và y[]
từ một cặp phải có cùng độ dài; x[]
-s và y[]
-s từ các cặp khác nhau không nhất thiết phải như vậy.
Hộp được đại diện bởi id số nguyên duy nhất.
Thực hiện sản phẩm bên trong mỗi JavaScript có thể trông giống như
var H=[0,1]; // hidden values, indexed by boxId
function B(x) { // seal x in a new box and return the box id
return H.push(x)-1;
}
function F(pairs) { // "inner product each"
return pairs.map(function (pair) {
var r = 0, x = pair[0], y = pair[1];
for (var i = 0; i < x.length; i++) r ^= H[x[i]] * H[y[i]];
return B(r);
})
}
(Vui lòng dịch phần trên sang ngôn ngữ bạn chọn.)
Được cấp quyền truy cập vào một F()
triển khai phù hợp với ngôn ngữ của bạn (nhưng không có quyền truy cập vào H
hoặc B()
) và được cung cấp hai mảng id hộp tạo thành biểu diễn nhị phân 16 bit của hai số nguyên a
vàb
, nhiệm vụ của bạn là tạo id hộp cho biểu diễn nhị phân 16 bit của a+b
(loại bỏ tràn) với số lượng F()
cuộc gọi tối thiểu .
Giải pháp gọi F()
ít lần nhất sẽ thắng. Các mối quan hệ sẽ bị phá vỡ bằng cách đếm tổng số x[],y[]
cặpF()
được gọi với - ít hơn là tốt hơn. Nếu vẫn bị ràng buộc, kích thước mã của bạn (không bao gồm việc triển khai F()
và người trợ giúp) xác định người chiến thắng theo cách chơi gôn mã truyền thống. Vui lòng sử dụng một tiêu đề như "MyLang, 123 cuộc gọi, 456 cặp, 789 byte" cho câu trả lời của bạn.
Viết một hàm hoặc một chương trình hoàn chỉnh. Đầu vào / đầu ra / đối số / kết quả là mảng int ở bất kỳ định dạng hợp lý nào. Đại diện nhị phân có thể là ít hoặc lớn về cuối - chọn một.
Phụ lục 1: Để làm cho thử thách dễ dàng hơn một chút, bạn có thể giả sử rằng các hộp có id 0 và 1 chứa các giá trị 0 và 1. Điều này mang lại cho bạn các hằng số, ví dụ hữu ích cho phủ định (x^1
là "không"). Dĩ nhiên, có nhiều cách xung quanh việc thiếu hằng số, nhưng phần còn lại của thử thách là đủ khó, vì vậy hãy loại bỏ sự phân tâm này.
Phụ lục 2: Để giành được tiền thưởng, bạn phải thực hiện một trong các cách sau:
gửi điểm số của bạn (cuộc gọi, cặp, byte) và mã của bạn trước thời hạn
gửi điểm số của bạn và băm sha256 của mã của bạn trước thời hạn; sau đó gửi mã thực tế trong vòng 23 giờ sau thời hạn
y=f(x)
và để x
phụ thuộc vào y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Tôi sẽ cần thêm thời gian để tìm ra cách thực hiện f
(Haskell buộc chữ thường ở đây) - Tôi sẽ thử lại vào ngày mai.
F
chỉ gọi một lần. Đó chắc chắn là gian lận, nhưng tôi không chắc đó là gian lận tốt hay gian lận xấu.