Imaginez que vous avez deux boîtes B(x)
et B(y)
chacune contenant un bit inconnu - 0 ou 1, et une machine F
qui peut les radiographier et produire une troisième boîte pour B(x^y)
( xor ). F
peut également calculer B(x*y)
( et ). En fait, ce ne sont que des cas particuliers de l'opération unique que la machine peut effectuer - produit intérieur chacun , noté F()
ci-dessous.
Pour deux tableaux de même longueur
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
le produit intérieur est défini comme
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
« Chaque » signifie F()
peut traiter de multiples paires de x[]
, y[]
en une seule fois. Le x[]
et y[]
d'une paire doivent être de la même longueur; x[]
-s et y[]
-s de différentes paires n'en ont pas nécessairement besoin.
Les boîtes sont représentées par des identifiants entiers uniques.
Une implémentation de produit interne chacun en JavaScript pourrait ressembler
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);
})
}
(Veuillez traduire ce qui précède dans la langue de votre choix.)
Étant donné l'accès à une F()
implémentation appropriée à votre langue (mais pas d'accès à H
ou B()
) et compte tenu de deux tableaux d'ID de boîte constituant les représentations binaires 16 bits de deux entiers a
et b
, votre tâche consiste à produire des ID de boîte pour la représentation binaire 16 bits de a+b
(rejet du débordement) avec le nombre minimum d' F()
appels.
La solution qui appelle F()
le moins de fois gagne. Les égalités seront brisées en comptant le nombre total de x[],y[]
paires F()
appelées - moins c'est mieux. S'il est toujours lié, la taille de votre code (à l'exclusion de l'implémentation de F()
et de ses assistants) détermine le gagnant de la manière traditionnelle du golf de code. Veuillez utiliser un titre comme "MyLang, 123 appels, 456 paires, 789 octets" pour votre réponse.
Écrivez une fonction ou un programme complet. Les entrées / sorties / arguments / résultats sont des tableaux int dans n'importe quel format raisonnable. La représentation binaire peut être en petit ou en gros - choisissez-en une.
Annexe 1: Pour rendre le défi un peu plus facile, vous pouvez supposer que les cases avec les identifiants 0 et 1 contiennent les valeurs 0 et 1. Cela vous donne des constantes, utiles par exemple pour la négation ( x^1
n'est "pas"). Il y avait bien sûr des moyens de contourner le manque de constantes, mais le reste du défi est assez difficile de toute façon, alors éliminons cette distraction.
Annexe 2: Pour gagner la prime, vous devez effectuer l'une des actions suivantes:
publier votre score (appels, paires, octets) et votre code avant la date limite
publier votre score et un hachage sha256 de votre code avant la date limite; puis affichez le code réel dans les 23 heures après la date limite
y=f(x)
et je vais en x
dépendre y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
J'aurai besoin de plus de temps pour comprendre comment l'implémenter f
(Haskell force les minuscules ici) - je vais essayer demain.
F
qu'une seule fois. Ce serait sûrement de la triche, mais je ne sais pas si ce serait une bonne ou une mauvaise tricherie.