Stellen Sie sich vor, Sie haben zwei Boxen B(x)
und B(y)
jeweils ein unbekanntes Bit - 0 oder 1 - und eine Maschine F
, die sie röntgen und eine dritte Box für B(x^y)
( xor ) produzieren kann. F
kann auch berechnen B(x*y)
( und ). Tatsächlich sind dies nur Sonderfälle des einzelnen Vorgangs, den die Maschine ausführen kann - jeweils ein inneres Produkt , das F()
unten angegeben ist.
Für zwei Arrays gleicher Länge
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
inneres Produkt ist definiert als
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
„ Jede “ Mittel F()
können mehrere Paare von verarbeiten x[]
, y[]
in einem Arbeitsgang. Das x[]
und y[]
von einem Paar muss gleich lang sein; x[]
-s und y[]
-s von verschiedenen Paaren müssen nicht unbedingt.
Boxen werden durch eindeutige Ganzzahl-IDs dargestellt.
Eine Implementierung des inneren Produkts in JavaScript könnte folgendermaßen aussehen
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);
})
}
(Bitte übersetzen Sie das Obige in die Sprache Ihrer Wahl.)
Der Zugang zu einer F()
Implementierung als geeignet für Ihre Sprache (aber keinen Zugang zu H
oder B()
) und bei zwei Anordnungen von Box - IDs , welche die 16-Bit-Darstellungen von zwei ganzen Zahlen a
und b
Ihre Aufgabe ist es , Produkte Box - IDs für die 16-Bit - Binärdarstellung von a+b
(Überlauf verwerfen) mit der Mindestanzahl von F()
Anrufen.
Die Lösung, die F()
am wenigsten anruft, gewinnt. Krawatten werden durch Zählen der Gesamtzahl der x[],y[]
Paare, F()
mit denen aufgerufen wurde , unterbrochen - weniger ist besser. Wenn immer noch gebunden, bestimmt die Größe Ihres Codes (mit Ausnahme der Implementierung von F()
und seiner Helfer) den Gewinner auf herkömmliche Weise. Bitte verwenden Sie einen Titel wie "MyLang, 123 Anrufe, 456 Paare, 789 Bytes" für Ihre Antwort.
Schreiben Sie eine Funktion oder ein komplettes Programm. Eingabe / Ausgabe / Argumente / Ergebnis sind int-Arrays in jedem vernünftigen Format. Die binäre Darstellung kann klein oder groß sein - wählen Sie eine aus.
Anhang 1: Um die Herausforderung etwas zu vereinfachen, können Sie davon ausgehen, dass Felder mit den IDs 0 und 1 die Werte 0 und 1 enthalten. Dies gibt Ihnen Konstanten, die beispielsweise für die Negation nützlich sind ( x^1
ist "nicht"). Es gab natürlich Möglichkeiten, den Mangel an Konstanten zu umgehen, aber der Rest der Herausforderung ist sowieso schwer genug, also lasst uns diese Ablenkung beseitigen.
Anhang 2: Um das Kopfgeld zu gewinnen, müssen Sie einen der folgenden Schritte ausführen:
Veröffentlichen Sie Ihre Punktzahl (Anrufe, Paare, Bytes) und Ihren Code vor Ablauf der Frist
Veröffentlichen Sie Ihre Punktzahl und einen sha256-Hash Ihres Codes vor Ablauf der Frist. Geben Sie dann den tatsächlichen Code innerhalb von 23 Stunden nach Ablauf der Frist ein
y=f(x)
und davon x
abhängen lassen y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Ich brauche mehr Zeit, um herauszufinden, wie man es implementiert f
(Haskell erzwingt hier Kleinbuchstaben) - ich werde es morgen versuchen.
F
nur einmal aufrufen . Das wäre sicherlich Betrug, aber ich bin mir nicht sicher, ob es gut oder schlecht wäre.