Wyzwanie
Przedstawiam wam kolejne wyzwanie szpiegowskie kontra szpiegowskie rzucające obfuscators kontra krakersy. W tym przypadku dane, które mają być chronione, nie są danymi wejściowymi, lecz wyjściowymi .
Zasady wyzwania są proste. Napisz procedurę z następującymi specyfikacjami:
- Procedura może być napisana w dowolnym języku, ale nie może przekraczać 320 bajtów.
- Procedura musi zaakceptować trzy 32-bitowe liczby całkowite ze znakiem jako dane wejściowe. Może mieć postać funkcji, która akceptuje 3 argumenty, funkcji, która akceptuje pojedynczą tablicę 3-elementową lub kompletnego programu, który odczytuje 3 liczby całkowite z dowolnego standardowego wejścia.
- Procedura musi wyprowadzać jedną 32-bitową liczbę całkowitą ze znakiem.
- We wszystkich możliwych wejściach procedura musi generować od 2 do 1000 (włącznie) unikalnych wartości. Liczba unikalnych wartości, które może wygenerować procedura, nazywana jest jej kluczem .
Na przykład program C.
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
ma klucz 9, ponieważ (miejmy nadzieję) może tylko wyjście wartości dziewięć 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, i24
.
Niektóre dodatkowe ograniczenia są następujące:
- Procedura musi być w pełni deterministyczna i niezmienna w czasie, zwracając identyczne wyniki dla identycznych danych wejściowych. Procedura nie powinna wywoływać generatorów liczb pseudolosowych.
- Procedura może nie polegać na „ukrytych zmiennych”, takich jak dane w plikach, zmienne systemowe lub funkcje języka ezoterycznego. Na przykład procedury zwykle nie powinny odnosić się do stałych, chyba że stałe są jasno zdefiniowane w samym kodzie. Procedury oparte na dziwactwach kompilatora, wynikach matematycznie niezdefiniowanych operacji, błędach arytmetycznych itp. Są również mocno odradzane. W razie wątpliwości proszę pytać.
- Ty (koder) musisz dokładnie wiedzieć, ile unikalnych wyjść może wygenerować procedura i powinieneś być w stanie zapewnić przynajmniej jedną sekwencję wejściową, która wytwarza każde wyjście. (Ponieważ potencjalnie mogą istnieć setki unikatowych danych wyjściowych, ten zestaw będzie zawsze wymagany tylko w przypadku zakwestionowania klucza.)
Ponieważ problem ten jest znacznie mniej podobny do klasycznego szyfrowania niż poprzedni, spodziewam się, że będzie on dostępny dla szerszej publiczności.
Im bardziej kreatywny, tym lepiej.
Punktacja
Najkrótsze niezakłócone zgłoszenia w liczbie bajtów zostaną ogłoszone zwycięzcami.
W przypadku jakichkolwiek nieporozumień prosimy pytać lub komentować.
Kontr-wyzwanie
Wszystkich czytelników, w tym tych, którzy przesłali własne procedury, zachęca się do „łamania” zgłoszeń. Zgłoszenie jest łamane, gdy jego klucz jest publikowany w powiązanej sekcji komentarzy. Jeśli przesłanie trwa 72 godziny bez modyfikacji lub krakowania, jest uważane za „bezpieczne”, a wszelkie kolejne sukcesy w krakowaniu będą ignorowane ze względu na konkurs.
Dozwolona jest tylko jedna próba krakowania na zgłoszenie na czytnika. Na przykład, jeśli prześlę użytkownikowi X: „Twój klucz ma 20 lat” i się mylę, użytkownik X zignoruje moje przypuszczenia jako niepoprawne i nie będę już mógł przesyłać dodatkowych domysłów dla tego przesłania.
Zgłoszone zgłoszenia są eliminowane ze sporów (pod warunkiem, że nie są „bezpieczne”). Nie należy ich edytować. Jeśli czytelnik chce przedstawić nową procedurę, powinien to zrobić w osobnej odpowiedzi.
Wynik krakersa to liczba przesłanych przez niego zgłoszeń (zgodnych lub nie). W przypadku krakersów o identycznej liczbie, ranking jest określany przez całkowitą liczbę bajtów dla wszystkich złamanych zgłoszeń (im wyższa, tym lepsza).
Krakersy o najwyższym wyniku zostaną ogłoszone zwycięzcami wraz z twórcami zwycięskich procedur.
Proszę nie łamać własnego zgłoszenia.
Powodzenia. :)
Tabela liderów
Ostatnia aktualizacja 2 września, 10:45 EST
Bariery nieruchome (niezłamane zgłoszenia):
- CJam, 105 [Dennis]
Unstoppable Forces (crackers):
- Dennis [ Java, 269 ; C 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
itp ...