Уявіть, що у вас є дві скриньки, B(x)
і B(y)
кожна з яких містить невідомий біт - 0 або 1, і машина, F
яка може рентгенограмувати їх і виробляти третю коробку для B(x^y)
( xor ). F
може також обчислити B(x*y)
( і ). Насправді це лише окремі випадки однієї операції, яку може виконати машина - внутрішній виріб кожен , позначений F()
нижче.
Для двох масивів однакової довжини
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
внутрішній продукт визначається як
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
« Кожен » означає F()
може обробляти кілька пар x[]
, y[]
на одному диханні. x[]
І y[]
від однієї пари повинні бути однакової довжини; x[]
-s і y[]
-s з різних пар не обов'язково.
Поле представлено унікальними цілими ідентифікаторами.
Реалізація внутрішнього продукту кожного з JavaScript може виглядати так
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);
})
}
(Будь ласка, перекладіть вище на вашу мову вибору.)
Наданий доступ до F()
реалізації відповідно до вашої мови (але немає доступу до H
або B()
) та надано два масиви ідентифікаторів вікна, що складаються з 16-бітових бінарних представлень двох цілих чисел, a
і b
ваше завдання - створити ідентифікатори поля для 16-бітного бінарного представлення з a+b
(відмова від переповнення) з мінімальною кількістю F()
дзвінків.
Виграє рішення, яке викликає F()
найменший раз. Зв'язки будуть розбиті підрахунком загальної кількості x[],y[]
пар, з якими F()
називались - менше краще. Якщо все-таки зв'язано, розмір вашого коду (за винятком реалізації F()
та його помічників) визначає переможця традиційним кодом для гольфу. Будь-ласка, використовуйте назву на зразок "MyLang, 123 дзвінки, 456 пар, 789 байт" для своєї відповіді.
Напишіть функцію або повну програму. Вхід / вихід / аргументи / результат - це масиви int у будь-якому розумному форматі. Бінарне представлення може бути мало- або великим-ендіанським - виберіть його.
Додаток 1: Щоб зробити виклик трохи простішим, ви можете припустити, що поля з ідентифікаторами 0 і 1 містять значення 0 і 1. Це дає вам константи, корисні, наприклад, для заперечення ( x^1
це "не"). Звичайно, існували шляхи навколо нестачі констант, але решта викликів все одно досить важка, тому давайте усунемо це відволікання.
Додаток 2: Щоб виграти виграш, ви повинні виконати одну з наступних дій:
опублікуйте свій рахунок (дзвінки, пари, байти) та свій код до встановленого терміну
опублікуйте свій рахунок та ша256 хеш вашого коду до встановленого терміну; потім опублікуйте фактичний код протягом 23 годин після встановленого терміну
y=f(x)
і нехай x
залежать від цього y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Мені знадобиться більше часу, щоб розібратися, як реалізувати f
(Haskell силі малі тут) - я спробую завтра.
F
лише один раз. Це, безумовно, було б обманом, але я не впевнений, чи це було б добре читання чи погана обманка.