Zainspirowany tym komentarzem ...
Dziękujemy użytkownikom Step Hen , Wheat-Wizard i Dennis za pomoc w ugruntowaniu specyfikacji tego wyzwania przed jego opublikowaniem!
To jest wątek gliniarzy. Przejdź do wątku Rabusiów tutaj
W tym wyzwaniu masz za zadanie uruchomić kod, który sprawi, że Twój język nie będzie spełniał naszych kryteriów bycia językiem programowania. W tym wyzwaniu oznacza to, że język nie może już ...
Weź numeryczne dane wejściowe i wyjściowe
Dodaj dwie liczby razem
Sprawdź, czy określona liczba jest liczbą pierwszą, czy nie.
Jest to wyzwanie dla gliniarzy i złodziei , w którym istnieją dwa różne wyzwania o dwóch różnych celach: gliniarze spróbują napisać kod, który sprawi, że język będzie w większości bezużyteczny, a złodzieje spróbują znaleźć ukryte obejście, które pozwala glinom odzyskać swój język.
Jako policjant musisz napisać dwa fragmenty kodu:
Taki, który sprawia, że twój język jest w większości bezużyteczny, np. Poprzez usunięcie wbudowanych funkcji do pobierania danych wejściowych / wyjściowych i operacji numerycznych. Im więcej funkcji usuniesz, tym lepiej. Ten kod nie może ulec awarii ani wyjść. Powinno być możliwe dodanie kodu na końcu tego fragmentu, a ten kod zostanie poddany ocenie . I...
... fragment kodu, który przyjmuje dwie nieujemne liczby całkowite jako dane wejściowe, dodaje je do siebie i generuje ich sumę. Ten fragment kodu musi nadal poprawnie działać, nawet po uruchomieniu pierwszego fragmentu kodu. Gdy oba fragmenty zostaną połączone razem, muszą one utworzyć pełny program, który dodaje dwie liczby lub zdefiniować funkcję, która dodaje dwie liczby. W idealnym przypadku ten fragment kodu powinien polegać na bardzo niejasnym zachowaniu, aby był trudniejszy do znalezienia.
Możesz wybrać dowolną standardową metodę wejścia i wyjścia . Musisz jednak ujawnić dokładnie, jakiego formatu (wejścia i wyjścia) używasz. Rabuś nie może złamać twojej odpowiedzi, chyba że użyje tego samego formatu co ty.
Po napisaniu obu tych fragmentów musisz opublikować pierwszy jako odpowiedź, nie ujawniając drugiego. Twoja odpowiedź powinna zawierać wszystkie następujące informacje:
Pierwszy fragment (oczywiście nie sekundę).
Język (w tym niewielka wersja, ponieważ większość zgłoszeń prawdopodobnie będzie polegać na dziwnych przypadkowych przypadkach)
Format IO, w tym czy jest to funkcja czy pełny program. Rabusie muszą używać tego samego formatu, aby ich crack mógł być ważny.
Wszelkie dziwne przypadki krawędzi wymagane do odpowiedzi. Na przykład działa tylko na systemie Linux lub wymaga połączenia z Internetem . Oczywiście jest to nieco subiektywne, ale jeśli policjant ma jakiś skrajny przypadek, który zapobiega jego pękaniu, a następnie ujawnia to dopiero po bezpieczeństwie, uważam to za słabe sportowe. Potencjalny złodziej powinien mieć wszystkie informacje niezbędne do złamania odpowiedzi, zanim zostanie ona złamana.
Nie musisz ujawniać liczby bajtów, dopóki odpowiedź nie będzie bezpieczna.
Oto przykład. W przypadku pierwszego fragmentu kodu możesz przesłać następujący program w języku Python 3:
Python 3
print=None
Pobiera dane wejściowe ze STDIN i dane wyjściowe do STDOUT
A jako drugi fragment możesz napisać:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Jest to ważne, ponieważ weźmie dwie liczby jako dane wejściowe i wyświetli ich sumę, nawet jeśli połączysz oba fragmenty razem, np.
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Jednak złodziejowi będzie bardzo łatwo znaleźć rozwiązanie. Ponieważ byłoby to bardzo łatwe do złamania, możesz spróbować załatać to konkretne podejście w następujący sposób:
import sys
sys.stdout=None
print=None
Jednak nawet to ma bardzo łatwe obejście:
del print
a,b=int(input()),int(input())
print(a+b)
Jako policjant Twoim celem jest uczynienie ukrytego obejścia tak niejasnym, jak to możliwe, aby uniemożliwić złodziejom znalezienie go.
W rabusie będą patrzeć na jednej z odpowiedzi, i próbować go złamać. Mogą go złamać, pisząc dowolny prawidłowy fragment, który mógłby działać jako fragment 2 (dodanie dwóch liczb razem po tym, jak język stał się w większości bezużyteczny). To nie musi być ten sam fragment, jak pierwotnie zamierzałeś. Jeśli złodziej złamie twoją odpowiedź, pozostawi komentarz do twojej odpowiedzi, a następnie powinieneś ją edytować, aby wskazać, że została złamana. Jeśli Twój post jest pęknięty, edytuj swoją odpowiedź, aby pokazać rozwiązanie (fragment 2), które pierwotnie zamierzałeś. Nie jest to reguła sama w sobie , tylko przyjazna sugestia, aby gra była przyjemna. Nie musisz.
Jeśli przez cały tydzień odpowiedź pozostanie nieprzetarta, możesz edytować w drugim fragmencie i wskazać, że Twoja odpowiedź jest teraz bezpieczna . Jeśli nie edytujesz go po upływie tygodnia, inni użytkownicy mogą go złamać, dopóki tego nie zrobisz. Jeśli nie ujawnisz swojego drugiego fragmentu, nie możesz zdobyć punktów za odpowiedź lub nazwać go bezpiecznym.
Zwycięzca wątku gliniarzy jest najkrótszą bezpieczną odpowiedzią obejmującą oba fragmenty , liczone w bajtach, i ta odpowiedź zostanie zaakceptowana po upływie wystarczającego czasu. Zdajesz nie musisz ujawniać swój licznik bajtów aż twoja odpowiedź jest bezpieczne, ponieważ liczba bajtów ma znaczenia swój wynik aż twoja odpowiedź jest bezpieczny. W przypadku, gdy upłynie wystarczający czas i żadne odpowiedzi nie pozostaną bez krakowania, zwycięzcą zostanie odpowiedź, która pozostanie bez krakowania przez najdłuższy okres czasu.
Baw się dobrze!
Wyjaśnienia zasad
Pierwszy fragment kodu musi działać poprawnie bez żadnych danych wejściowych . Może wyświetlać cokolwiek zechcesz, a dane wyjściowe będą ignorowane - tak długo jak snippet zostanie zrobiony, drugi fragment działa poprawnie.
Drugi fragment musi zostać faktycznie wykonany, aby odpowiedź była poprawna. Oznacza to odpowiedź typu
import sys sys.exit()
nie jest poprawny, ponieważ nie łamie języka. Po prostu odchodzi. Podobnie, wprowadzenie nieskończonej pętli jest nieprawidłowe, ponieważ drugi fragment kodu nigdy nie zostanie wykonany.
Po zapewnieniu bezpieczeństwa twój wynik jest liczbą bajtów obu fragmentów .
Wróćmy do Proszę ujawnić wszelkie dziwne przypadki brzegowe wymagane do odpowiedzi na twoje pytanie ... Twoje zgłoszenie musi zawierać wystarczającą ilość informacji, zanim zostanie ujawnione, aby było odtwarzalne po ujawnieniu. Oznacza to, że jeśli Twoja odpowiedź stanie się bezpieczna, a następnie edytujesz: Oto moja odpowiedź. O tak, BTW to działa tylko wtedy, gdy uruchomisz go na Solarisie, żart jest z ciebie! Twoja odpowiedź jest nieprawidłowa i zostanie usunięta i nie zostanie uznana za kwalifikującą się do wygrania.
Drugi fragment kodu może ulec awarii po wypisaniu sumy - dopóki dane wyjściowe są nadal poprawne (na przykład, jeśli zdecydujesz się wyprowadzić dane do STDERR, a następnie otrzymasz kilka informacji o awarii, jest to nieprawidłowe).
Nie możesz edytować swojego kodu po przesłaniu odpowiedzi.
Nie możesz polegać na funkcjach kryptograficznych, takich jak szyfrowanie, funkcje skrótu, CSPRNG itp.
int main(){ do_evil_stuff(); }
gdzie powinien iść kod użytkownika? W funkcji? Po wszystkich oświadczeniach wmain
?