Bayangkan Anda memiliki dua kotak B(x)
dan B(y)
, masing-masing berisi bit yang tidak diketahui - 0 atau 1, dan sebuah mesin F
yang dapat melakukan rontgen dan menghasilkan kotak ketiga untuk B(x^y)
( xor ). F
juga dapat menghitung B(x*y)
( dan ). Bahkan, itu hanya kasus-kasus khusus dari operasi tunggal yang dapat dilakukan mesin - masing-masing produk dalam , dilambangkan dengan di F()
bawah ini.
Untuk dua array dengan panjang yang sama
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
produk dalam didefinisikan sebagai
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" Setiap " berarti F()
dapat memproses beberapa pasang x[]
, y[]
dalam satu pergi. Pasangan dari x[]
dan y[]
harus memiliki panjang yang sama; x[]
-s dan y[]
-s dari pasangan yang berbeda tidak perlu.
Kotak diwakili oleh id integer unik.
Implementasi produk dalam masing-masing dalam JavaScript mungkin terlihat seperti
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);
})
}
(Silakan terjemahkan di atas ke bahasa pilihan Anda.)
Diberikan akses ke F()
implementasi yang sesuai untuk bahasa Anda (tetapi tidak ada akses ke H
atau B()
) dan diberi dua larik kotak id yang merupakan representasi biner 16-bit dari dua bilangan bulat a
dan b
, tugas Anda adalah menghasilkan id kotak untuk representasi biner 16-bit of a+b
(discarding overflow) dengan jumlah F()
panggilan minimum .
Solusi yang memanggil F()
waktu paling sedikit menang. Ikatan akan rusak dengan menghitung jumlah total x[],y[]
pasangan F()
yang dipanggil - lebih sedikit lebih baik. Jika masih terikat, ukuran kode Anda (tidak termasuk implementasi F()
dan pembantunya) menentukan pemenang dengan cara golf kode tradisional. Silakan gunakan judul seperti "MyLang, 123 panggilan, 456 pasangan, 789 byte" untuk jawaban Anda.
Tulis fungsi atau program lengkap. Input / output / argumen / hasil adalah array int dalam format apa pun yang masuk akal. Representasi biner mungkin sedikit atau big-endian - pilih satu.
Lampiran 1: Untuk membuat tantangan sedikit lebih mudah, Anda dapat mengasumsikan bahwa kotak dengan id 0 dan 1 berisi nilai 0 dan 1. Ini memberi Anda konstanta, misalnya berguna untuk negasi ( x^1
"tidak"). Tentu saja ada beberapa cara untuk mengatasi kekurangan konstanta, tetapi tantangan lainnya cukup sulit, jadi mari kita hilangkan gangguan ini.
Lampiran 2: Untuk memenangkan hadiah, Anda harus melakukan salah satu dari yang berikut:
memposting skor Anda (panggilan, pasangan, byte) dan kode Anda sebelum batas waktu
memposting skor Anda dan hash kode Anda sha256 sebelum batas waktu; kemudian posting kode aktual dalam waktu 23 jam setelah batas waktu
y=f(x)
dan biarkan x
tergantung pada y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Saya akan membutuhkan lebih banyak waktu untuk mencari tahu bagaimana mengimplementasikan f
(pasukan Haskell huruf kecil di sini) - Saya akan mencobanya besok.
F
hanya sekali. Itu pasti kecurangan, tapi saya tidak yakin apakah itu kecurangan yang baik atau buruk.