Immagina di avere due scatole B(x)
e B(y)
, ognuna contenente un bit sconosciuto - 0 o 1, e una macchina in F
grado di eseguire i raggi X e produrre una terza scatola per B(x^y)
( xor ). F
può anche calcolare B(x*y)
( e ). In effetti, questi sono solo casi speciali della singola operazione che la macchina può eseguire - prodotto interno ciascuno , indicato con F()
sotto.
Per due matrici della stessa lunghezza
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
il prodotto interno è definito come
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" Ciascuno " significa che F()
può elaborare più coppie di x[]
, y[]
in una volta sola. La coppia da x[]
e y[]
deve avere la stessa lunghezza; x[]
-s e y[]
-s di coppie diverse non sono necessariamente necessari.
Le caselle sono rappresentate da ID interi univoci.
Potrebbe apparire un'implementazione del prodotto interno ciascuno in 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);
})
}
(Per favore traduci quanto sopra nella tua lingua preferita.)
Dato l'accesso a F()
un'implementazione appropriata per la tua lingua (ma nessun accesso a H
o B()
) e dati due matrici di ID casella che rappresentano le rappresentazioni binarie a 16 bit di due numeri interi a
e il b
tuo compito è produrre ID casella per la rappresentazione binaria a 16 bit di a+b
(eliminazione dell'overflow) con il numero minimo di F()
chiamate.
F()
Vince la soluzione che chiama il minor numero di volte. I legami verranno interrotti contando il numero totale di x[],y[]
coppie F()
chiamate: meno è meglio. Se ancora legato, la dimensione del tuo codice (esclusa l'implementazione di F()
e dei suoi aiutanti) determina il vincitore nel tradizionale modo di giocare a golf. Si prega di utilizzare un titolo come "MyLang, 123 chiamate, 456 coppie, 789 byte" per la risposta.
Scrivi una funzione o un programma completo. Input / output / argomenti / risultato sono array int in qualsiasi formato ragionevole. La rappresentazione binaria può essere little o big endian: scegline una.
Appendice 1: Per rendere la sfida leggermente più semplice, puoi presumere che le caselle con ID 0 e 1 contengano i valori 0 e 1. Questo ti dà costanti, utili ad esempio per la negazione ( x^1
è "non"). Ci sono stati modi per aggirare la mancanza di costanti, ovviamente, ma il resto della sfida è comunque abbastanza difficile, quindi eliminiamo questa distrazione.
Appendice 2: per vincere la taglia, devi effettuare una delle seguenti operazioni:
pubblica il tuo punteggio (chiamate, coppie, byte) e il tuo codice prima della scadenza
pubblica il tuo punteggio e un hash sha256 del tuo codice prima della scadenza; quindi pubblicare il codice effettivo entro 23 ore dopo la scadenza
y=f(x)
e lasciamo x
dipendere y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Avrò bisogno di più tempo per capire come implementare f
(le forze di Haskell sono minuscole qui): domani proverò.
F
solo una volta. Sarebbe sicuramente un imbroglio, ma non sono sicuro che sarebbe un buon imbroglio o un cattivo imbroglio.