İki kutunuz olduğunu B(x)
ve B(y)
her birinin bilinmeyen bir biti olduğunu düşünün - 0 veya 1 ve F
bunları X-ışınıyla B(x^y)
( xor ) için üçüncü bir kutu üretebilen bir makine . F
ayrıca hesaplayabilir B(x*y)
( ve ). Aslında, bunlar sadece makinenin gerçekleştirebileceği tek işlemin özel durumlarıdır - her biriF()
aşağıda belirtilen iç ürün .
Aynı uzunlukta iki dizi için
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
İç çarpım olarak tanımlanır
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" Her biri " , tek seferde F()
birden fazla çiftini işleyebilir . Ve bir çift aynı uzunlukta olması gerekir; -s ve -s farklı çiftlerden mutlaka gerekmez.x[]
y[]
x[]
y[]
x[]
y[]
Kutular benzersiz tamsayı kimlikleriyle temsil edilir.
Her biri JavaScript'te dahili ürün uygulaması gibi görünebilir
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);
})
}
(Lütfen yukarıdakileri tercih ettiğiniz dile çevirin.)
Dilinize F()
uygun bir uygulamaya erişim verilir (ancak erişiminiz yoktur H
veya yoktur B()
) ve iki tamsayının 16 bitlik ikili gösterimlerini oluşturan iki kutu kimliği dizisi verilir a
ve b
göreviniz 16 bitlik ikili gösterim için kutu kimlikleri üretmektir. ve a+b
en az sayıda (atma taşma) F()
çağrıları.
En F()
az kez çağıran çözüm kazanır. Bağlanan toplam x[],y[]
çift sayısı sayılarak bozulacaktır F()
- daha azı daha iyidir. Hala bağlıysa, kodunuzun boyutu (uygulaması F()
ve yardımcıları hariç ) kazananı geleneksel kod golf yönteminde belirler. Lütfen cevabınız için "MyLang, 123 çağrı, 456 çift, 789 bayt" gibi bir başlık kullanın.
Bir işlev veya tam bir program yazın. Girdi / çıktı / bağımsız değişkenler / sonuç, herhangi bir makul biçimde int dizileridir. İkili gösterim küçük veya büyük-endian olabilir - birini seçin.
Ek 1: Meydan okumayı biraz kolaylaştırmak için, 0 ve 1 numaralı kimliğe sahip kutuların 0 ve 1 değerlerini içerdiğini varsayabilirsiniz x^1
. Sabitlerin eksikliği etrafında elbette yollar vardı, ama meydan okumaların geri kalanı zaten yeterince zor, bu yüzden bu dikkati dağıtalım.
Ek 2: Ödül kazanmak için aşağıdakilerden birini yapmanız gerekir:
puanınızı (çağrılar, çiftler, baytlar) ve kodunuzu son tarihten önce yayınlayın
puanınızı ve son başvuru tarihinden önce kodunuzun bir sha256 karmasını gönderin; ardından gerçek kodu son tarihten sonraki 23 saat içinde gönderin
y=f(x)
ve x
bağımlı olalım y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Nasıl uygulanacağını anlamak için daha fazla zamana ihtiyacım olacak f
(Haskell burada küçük harf) - Yarın bir deneyeceğim.
F
yalnızca bir kez arayabilirdim . Bu kesinlikle hile olur, ama iyi hile mi yoksa kötü hile mi olacağından emin değilim.