Представьте , у вас есть две коробки 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
только один раз. Это наверняка было бы обманом, но я не уверен, будет ли это хорошим обманом или плохим обманом.