Wyobraź sobie, że masz dwa pola B(x)
i B(y)
każdy z nich zawiera nieznany bit - 0 lub 1 oraz maszynę, F
która może je prześwietlić i wytworzyć trzecie pole dla B(x^y)
( xor ). F
może również obliczyć B(x*y)
( i ). W rzeczywistości są to tylko szczególne przypadki pojedynczej operacji, którą może wykonać maszyna - każda z nich to produkt wewnętrzny oznaczony F()
poniżej.
Dla dwóch tablic o tej samej długości
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
produkt wewnętrzny jest zdefiniowany jako
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
„ Każdy ” oznacza F()
może przetwarzać wiele par x[]
, y[]
za jednym zamachem. Od x[]
i y[]
od jednej pary muszą być tej samej długości; x[]
-s i y[]
-s z różnych par niekoniecznie muszą.
Pola są reprezentowane przez unikalne identyfikatory liczb całkowitych.
Może wyglądać implementacja produktu wewnętrznego w 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);
})
}
(Proszę przetłumaczyć powyższe na wybrany język).
Biorąc pod uwagę dostęp do F()
implementacji odpowiedniej dla twojego języka (ale nie ma dostępu do H
lub B()
) i podane dwie tablice identyfikatorów pól stanowiących 16-bitowe reprezentacje binarne dwóch liczb całkowitych, a
a b
Twoim zadaniem jest wytworzenie identyfikatorów pól dla 16-bitowej reprezentacji binarnej od a+b
(przepełnienie odrzucając) z minimalną liczbą F()
połączeń.
Rozwiązanie, które wywołuje F()
najmniej czasu, wygrywa. Więzy zostaną zerwane przez policzenie łącznej liczby x[],y[]
par, F()
z którymi wywołano - mniej znaczy lepiej. Jeśli nadal jest związany, rozmiar twojego kodu (wyłączając implementację F()
i jego pomocników) określa zwycięzcę w tradycyjny sposób golfa. Jako odpowiedzi użyj tytułu „MyLang, 123 połączenia, 456 par, 789 bajtów”.
Napisz funkcję lub pełny program. Dane wejściowe / wyjściowe / argumenty / wynik są tablicami int w dowolnym rozsądnym formacie. Reprezentacja binarna może być mała lub duża - wybierz jedną.
Dodatek 1: Aby nieco ułatwić wyzwanie, możesz założyć, że pola o identyfikatorach 0 i 1 zawierają wartości 0 i 1. Daje to stałe, przydatne np. Do negacji ( x^1
to „nie”). Oczywiście istniały sposoby obejścia braku stałych, ale reszta wyzwania i tak jest wystarczająco trudna, więc wyeliminujmy to rozproszenie.
Dodatek 2: Aby wygrać nagrodę, musisz wykonać jedną z następujących czynności:
opublikuj swój wynik (połączenia, pary, bajty) i kod przed upływem terminu
opublikuj swój wynik i skrót sha256 kodu przed upływem terminu; następnie opublikuj rzeczywisty kod w ciągu 23 godzin po terminie
y=f(x)
i pozwolę x
polegać y
.
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]
Potrzebuję więcej czasu, aby dowiedzieć się, jak wdrożyć f
(Haskell zmusza tu małe litery) - jutro spróbuję.
F
tylko raz. To z pewnością byłoby oszustwo, ale nie jestem pewien, czy byłoby to dobre oszustwo, czy złe.