Ten konkurs się zakończył.
Ze względu na charakter wyzwań dla gliniarzy i rabusiów wyzwanie dla gliniarzy staje się znacznie łatwiejsze, gdy zainteresowanie związanym z nim wyzwaniem spadnie. Dlatego, mimo że nadal możesz publikować funkcje skrótu, twoja odpowiedź nie zostanie zaakceptowana ani nie będzie częścią tabeli wyników.
To wyzwanie jest poszukiwanie najkrótszej realizacji funkcji skrótu , która jest odporna na zderzenia , czyli powinno być niemożliwe do znalezienia dwóch różnych wiadomości z tego samego skrótu.
Jako policjant próbujesz wymyślić i wdrożyć funkcję skrótu, znajdując najlepszy kompromis między rozmiarem kodu a odpornością na kolizje. Użyj zbyt wielu bajtów, a inny policjant cię obezwładni!
Jako złodziej próbujesz udaremnić próby gliniarzy, łamiąc ich funkcje, udowadniając, że nie są one odpowiednie. Zmusi ich to do użycia większej liczby bajtów w celu wzmocnienia algorytmów!
Wyzwanie gliniarzy
Zadanie
Zaimplementuj kryptograficzną funkcję skrótu H: I -> O twojego wyboru, gdzie I jest zbiorem wszystkich nieujemnych liczb całkowitych poniżej 2 2 30, a O jest zbiorem wszystkich nieujemnych liczb całkowitych poniżej 2 128 .
Możesz albo wdrożyć H. jako rzeczywistą funkcję, która przyjmuje i zwraca pojedynczą liczbę całkowitą, ciąg znaków reprezentujący liczbę całkowitą lub tablicę liczb całkowitych lub pełny program, który odczytuje STDIN i drukuje do STDOUT w bazie 10 lub 16.
Punktacja
H , że musi oprzeć się wyzwaniu złodziei zdefiniowanemu poniżej.
Jeśli złodziej pokona twoje zgłoszenie w ciągu pierwszych 168 godzin po opublikowaniu, uznaje się je za pęknięte .
Implementacja H powinna być jak najkrótsza. Najkrótsze niezłapane zgłoszenie będzie zwycięzcą wyzwania gliniarzy.
Dodatkowe zasady
Jeśli implementujesz H jako funkcję, podaj opakowanie, aby wykonać funkcję z poziomu programu, który zachowuje się jak wyjaśniono powyżej.
Podaj co najmniej trzy wektory testowe dla swojego programu lub opakowania (przykładowe dane wejściowe i odpowiadające im dane wyjściowe).
H. może być twoim nowym projektem (preferowanym) lub znanym algorytmem, o ile sam go zaimplementujesz. Zabrania się korzystania z jakichkolwiek wbudowanych funkcji skrótu, funkcji kompresji, szyfru, PRNG itp.
Wszelkie wbudowane powszechnie używane do implementacji funkcji skrótu (np. Konwersja bazy) to uczciwa gra.
Wynik działania programu lub funkcji musi być deterministyczny.
Powinien istnieć darmowy (jak w przypadku piwa) kompilator / interpreter, który można uruchomić na platformie x86 lub x64 lub z poziomu przeglądarki internetowej.
Twój program lub funkcja powinna być dość wydajna i musi mieszać każdą wiadomość w I poniżej 2 2 19 w mniej niż sekundę.
W przypadkach krawędziowych decydujący będzie czas (ścienny) na moim komputerze (Intel Core i7-3770, 16 GiB pamięci RAM).
Biorąc pod uwagę naturę tego wyzwania, zabronione jest zmienianie kodu odpowiedzi w jakikolwiek sposób, niezależnie od tego, czy zmienia on wynik, czy nie.
Jeśli Twoje zgłoszenie zostało złamane (lub nawet jeśli nie zostało), możesz opublikować dodatkową odpowiedź.
Jeśli twoja odpowiedź jest nieprawidłowa (np. Nie jest zgodna ze specyfikacją I / O), usuń ją.
Przykład
Python 2.7, 22 bajty
def H(M): return M%17
Obwoluta
print H(int(input()))
Wyzwanie rabusiów
Zadanie
Złam dowolne oświadczenie gliniarzy, zamieszczając w wątku rabusiów : dwie wiadomości M i N w I takie, że H (M) = H (N) i M ≠ N .
Punktacja
Złamanie każdego zgłoszenia gliny daje ci jeden punkt. Złodziej z największą liczbą punktów wygrywa.
W przypadku remisu wygrywa ten związany bandyta, który złamał najdłuższe poddanie.
Dodatkowe zasady
Każde zgłoszenie policjanta może zostać złamane tylko raz.
Jeśli przesłanie policjanta opiera się na zachowaniu zdefiniowanym lub niezdefiniowanym, musisz jedynie znaleźć pęknięcie, które działa (weryfikowalnie) na twoim komputerze.
Każde pęknięcie należy do osobnej odpowiedzi w wątku złodziei.
Opublikowanie nieważnej próby złamania uniemożliwi zablokowanie tego konkretnego zgłoszenia przez 30 minut.
Nie możesz złamać własnego zgłoszenia.
Przykład
Python 2.7, 22 bajty według użytkownika8675309
1
i
18
Tabela liderów
Bezpieczne zgłoszenia
Nieprzetworzone zgłoszenia
Możesz użyć tego fragmentu stosu, aby uzyskać listę jeszcze nie spękanych odpowiedzi.
function g(p){$.getJSON('//api.stackexchange.com/2.2/questions/51068/answers?page='+p+'&pagesize=100&order=desc&sort=creation&site=codegolf&filter=!.Fjs-H6J36w0DtV5A_ZMzR7bRqt1e',function(s){s.items.map(function(a){var h=$('<div/>').html(a.body).children().first().text();if(!/cracked/i.test(h)&&(typeof a.comments=='undefined'||a.comments.filter(function(b){var c=$('<div/>').html(b.body);return /^cracked/i.test(c.text())||c.find('a').filter(function(){return /cracked/i.test($(this).text())}).length>0}).length==0)){var m=/^\s*((?:[^,(\s]|\s+[^-,(\s])+)\s*(?:[,(]|\s-).*?([0-9]+)/.exec(h);$('<tr/>').append($('<td/>').append($('<a/>').text(m?m[1]:h).attr('href',a.link)),$('<td class="score"/>').text(m?m[2]:'?'),$('<td/>').append($('<a/>').text(a.owner.display_name).attr('href',a.owner.link))).appendTo('#listcontent');}});if(s.length==100)g(p+1);});}g(1);
table th, table td {padding: 5px} th {text-align: left} .score {text-align: right} table a {display:block}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><table><tr><th>Language</th><th class="score">Length</th><th>User</th></tr><tbody id="listcontent"></tbody></table>