Imagina que tienes dos cajas B(x)
y B(y)
, cada una con un bit desconocido: 0 o 1, y una máquina F
que puede radiografiarlas y producir una tercera caja para B(x^y)
( xor ). F
También puede calcular B(x*y)
( y ). De hecho, esos son solo casos especiales de la operación única que la máquina puede realizar: producto interno de cada uno , indicado a F()
continuación.
Para dos matrices de la misma longitud
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
producto interno se define como
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" Cada " medio F()
puede procesar múltiples pares de x[]
, y[]
de una sola vez. El x[]
y y[]
de un par debe ser de la misma longitud; x[]
-s y y[]
-s de diferentes pares no necesariamente lo necesitan.
Las cajas están representadas por identificadores enteros únicos.
Una implementación de producto interno cada uno en JavaScript podría verse como
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);
})
}
(Por favor, traduzca lo anterior a su idioma de elección).
Se le dio acceso a una F()
implementación según sea apropiado para su idioma (pero sin acceso H
ao B()
) y se le dieron dos matrices de identificadores de caja que constituyen las representaciones binarias de 16 bits de dos enteros a
y b
su tarea es producir identificadores de caja para la representación binaria de 16 bits de a+b
(descartar desbordamiento) con el número mínimo de F()
llamadas.
La solución que llama F()
la menor cantidad de veces gana. Los lazos se romperán contando el número total de x[],y[]
pares con los que F()
se llamó: menos es mejor. Si aún está empatado, el tamaño de su código (excluyendo la implementación de F()
y sus ayudantes) determina el ganador en la forma tradicional de golf de código. Utilice su título como "MyLang, 123 llamadas, 456 pares, 789 bytes" para su respuesta.
Escribe una función o un programa completo. Entrada / salida / argumentos / resultado son matrices int en cualquier formato razonable. La representación binaria puede ser little-o big-endian: elija una.
Apéndice 1: para facilitar un poco el desafío, puede suponer que los cuadros con ID 0 y 1 contienen los valores 0 y 1. Esto le da constantes, útiles, por ejemplo, para la negación ( x^1
"no"). Había maneras de evitar la falta de constantes, por supuesto, pero el resto del desafío es bastante difícil de todos modos, así que eliminemos esta distracción.
Apéndice 2: Para ganar la recompensa, debe hacer uno de los siguientes:
publique su puntaje (llamadas, pares, bytes) y su código antes de la fecha límite
publique su puntaje y un hash sha256 de su código antes de la fecha límite; luego publique el código real dentro de las 23 horas posteriores a la fecha límite
y=f(x)
y dejaré x
depender y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Necesitaré más tiempo para descubrir cómo implementar f
(Haskell fuerza las minúsculas aquí). Mañana lo intentaré.
F
solo una vez. Eso seguramente sería hacer trampa, pero no estoy seguro de si sería una buena trampa o una mala trampa.