Уявіть, що у вас є дві скриньки, 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лише один раз. Це, безумовно, було б обманом, але я не впевнений, чи це було б добре читання чи погана обманка.