Представьте , у вас есть две коробки 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: Чтобы получить награду, вы должны выполнить одно из следующих действий:
опубликовать ваш счет (звонки, пары, байты) и ваш код до истечения срока
опубликуйте свой счет и хэш кода sha256 до истечения срока; затем опубликовать действительный код в течение 23 часов после крайнего срока
y=f(x)и пусть xзависит от y.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]Мне нужно больше времени, чтобы выяснить, как реализовать f(Haskell здесь вводит нижний регистр) - завтра попробую.
Fтолько один раз. Это наверняка было бы обманом, но я не уверен, будет ли это хорошим обманом или плохим обманом.