Imagine que você tem duas caixas B(x)
e B(y)
, cada uma contendo um bit desconhecido - 0 ou 1, e uma máquina F
que pode radiografá-las e produzir uma terceira caixa para B(x^y)
( xor ). F
também pode calcular B(x*y)
( e ). De fato, esses são apenas casos especiais da operação única que a máquina pode executar - produto interno cada , indicado F()
abaixo.
Para duas matrizes do mesmo comprimento
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
produto interno é definido como
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" Cada " meios F()
pode processar vários pares de x[]
, y[]
de uma só vez. O x[]
e y[]
de um par deve ter o mesmo comprimento; x[]
-s e y[]
-s de pares diferentes não precisam necessariamente.
As caixas são representadas por IDs inteiros exclusivos.
Uma implementação de produto interno, cada uma em JavaScript, pode parecer
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);
})
}
(Traduza o texto acima para o seu idioma preferido.)
Dado o acesso a uma F()
implementação conforme apropriado para o seu idioma (mas sem acesso a H
ou B()
) e duas matrizes de IDs de caixa que constituem as representações binárias de 16 bits de dois números inteiros a
e b
, sua tarefa é produzir IDs de caixa para a representação binária de 16 bits de a+b
(descartando estouro) com o número mínimo de F()
chamadas.
A solução que chama F()
menos vezes vence. Os laços serão quebrados contando o número total de x[],y[]
pares que F()
foram chamados - menos é melhor. Se ainda estiver empatado, o tamanho do seu código (excluindo a implementação F()
e seus auxiliares) determina o vencedor da maneira tradicional do código de golfe. Por favor, use um título como "MyLang, 123 chamadas, 456 pares, 789 bytes" para sua resposta.
Escreva uma função ou um programa completo. Entrada / saída / argumentos / resultado são matrizes int em qualquer formato razoável. A representação binária pode ser pequena ou grande endian - escolha uma.
Apêndice 1: Para facilitar um pouco o desafio, você pode assumir que as caixas com os IDs 0 e 1 contêm os valores 0 e 1. Isso fornece constantes, úteis, por exemplo, para negação ( x^1
não é ")". Havia maneiras de contornar a falta de constantes, é claro, mas o resto do desafio já é difícil o suficiente, então vamos eliminar essa distração.
Apêndice 2: Para ganhar a recompensa, siga um destes procedimentos:
publique sua pontuação (chamadas, pares, bytes) e seu código antes do prazo
publique sua pontuação e um hash sha256 do seu código antes do prazo; depois publique o código real dentro de 23 horas após o prazo
y=f(x)
e deixarei x
depender y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Vou precisar de mais tempo para descobrir como implementar f
(Haskell força minúsculas aqui) - tentarei amanhã.
F
apenas uma vez. Certamente isso seria trapaça, mas não tenho certeza se seria uma boa trapaça ou má trapaça.