To łamigłówka gliniarzy i rabusiów, których wątek rabusiów można znaleźć tutaj .
Twoim zadaniem będzie napisanie dwóch programów (lub funkcji) w taki sposób, że będą to wzajemnie anagramy, a jeden wykona lewą odwrotność drugiego. Programy te mogą akceptować i wyprowadzać dowolną liczbę całkowitą lub liczbę zespoloną. Jeśli zdecydujesz się wziąć liczby jako punkty postaci lub w jakikolwiek inny rozsądny sposób, musisz zaznaczyć, że robisz to w swojej odpowiedzi. Jeśli zdecydujesz się ograniczyć domenę swojej funkcji, musisz również wskazać ograniczoną domenę w swojej odpowiedzi.
Następnie zaprezentujesz pierwszy program w postaci odpowiedzi z lewą odwrotnością ukrytą dla rabusiów do znalezienia.
Pokazany program musi implementować funkcję iniekcyjną (w przeciwnym razie istniałaby ukryta odpowiedź).
Jeśli twoja odpowiedź nie została złamana w ciągu tygodnia, możesz ujawnić ukrytą odpowiedź i oznaczyć ją jako bezpieczną . Bezpieczne odpowiedzi nie mogą zostać złamane przez złodziei i pozostaną niezakłócone na czas nieokreślony.
Celem będzie stworzenie najkrótszej niezakłóconej odpowiedzi w bajtach.
Przykład
Możesz pokazać następujący program python, który dodaje jeden do danych wejściowych
lambda x:~-x
Rozwiązaniem może być:
lambda x:-~x
Odejmuje to jeden od danych wejściowych
źródło
Odpowiedzi:
Python 3, 80 bajtów ( Cracked )
Domena: dodatnie liczby całkowite. Funkcja to po prostu podniesienie liczby do kwadratu. Wejście do stdin, wyjście do stdout, a także funkcja odwrotna. Zauważ, że Python ignoruje tutaj trzecią linię, ponieważ jest poprawna pod względem składniowym, a 1 jest już prawdziwą wartością, więc Python nawet nie sprawdza, czy odpowiednia część „lub” jest dobrze zdefiniowana.
Rabusie powinni napisać funkcję sqrt, która będzie działać poprawnie na wszystkich niezerowych kwadratach, wypisując taką liczbę całkowitą, jaka jest, bez zmiennoprzecinkowych (więc na wejściu „4” powinno być „2” lub „2 \ n”, a nie „2.0” lub „2.0 \ n”).
źródło
Python 3, 46 bajtów, pęknięty
Podwaja wejście.
źródło
/
podział na zmiennoprzecinkowe.7 , 9 bajtów, pęknięty
Ten program jest pełen znaków niedrukowalnych, więc oto zrzut heksowy:
Uwaga: używa to procedury wprowadzania liczb, która nie jest w stanie wprowadzić liczb ujemnych, więc to przesłanie jest ograniczone tylko do nieujemnych liczb całkowitych.
Jednym z problemów związanych z wyzwaniami gliniarzy i rabusiów jest to, że nie piszesz wyjaśnień kodu (aby utrudnić złamanie). Z drugiej strony oznacza to, że nie muszę tutaj zadawać sobie trudu.
Jako język wybrałem 7, ponieważ, szczególnie w jej skompresowanej notacji, jest dość trudny do odczytania i nie rozumiem, dlaczego to tylko ja muszę zadawać sobie trud z przemieszczaniem się po 8-bitowych fragmentach programów napisanych w 3-bitowe kodowanie. Powodzenia!
Wyjaśnienie
Teraz, gdy program został złamany (niestety brutalną siłą; to zawsze stanowi zagrożenie w tych krótkich rozwiązaniach), równie dobrze mogę wyjaśnić, o co mi chodziło. To było właściwie dość do rozwiązania, czytając program; Mogłem uczynić to znacznie trudniejszym, ale to wydawało się złym pomysłem, gdy istnieją pęknięcia z użyciem siły.
Zaczniemy od przedstawienia programu w bardziej naturalny sposób. Jak zwykle, pogrubione cyfry oznaczają polecenia, które działają natychmiast (z których nie wszystkie są reprezentowalna w programie,
6
i7
to tylko2
na5
nie), numery unbolded reprezentowania ich ekwiwalenty (uciekł0
do5
, z których wszystkie są reprezentowalna w oryginalnym programie; notatka to0
jest ucieczka6
i1
ucieczka7
):Zestaw poleceń dostępnych w źródle 7 programów oznacza, że jest to po prostu literał reprezentujący oryginalny stos (nic więcej nie można zrobić za pomocą tylko znaków ucieczki
6
i7
). Pierwszą rzeczą, którą program zrobi, jest wrzucenie stosu rzeczy na stos. Oto jak wygląda stos po uruchomieniu programu (|
oddziela elementy stosu, jak zwykle w 7):Ostatni element stosu jest następnie kopiowany, aby stać się kodem do uruchomienia (pozostając na stosie). Tak się składa, że jest to jedyna część programu, która jest kodem; wszystko inne to tylko dane. Oto, co to tłumaczy:
Innymi słowy, jest to głównie garść instrukcji We / Wy. Przeanalizujmy to szczegółowo:
73
odrzuca to73363
, co wciąż jest na wierzchu stosu.3
wypisuje023
i odrzuca34662
. W ten sposób można zauważyć, że34662
jest to komentarz, który został użyty do przechowywania bajtów potrzebnych w innej wersji programu. Jeśli chodzi o to, co023
dzieje się podczas wyjścia, wybiera format wejścia / wyjścia 0 (liczby całkowite), a następnie23
dyrektywę, która żąda od implementacji wprowadzenia liczby całkowitej (w 7 wprowadzasz dane wyjściowe, wysyłając określone kody, które wymagają wprowadzenia). Wprowadzanie odbywa się poprzez wykonanie kopii elementu stosu poniżej, np. Jeśli wejściowa liczba całkowita wynosi 10, stanie się następny element stosu (obecnie7
)7777777777
. Dlatego akceptujemy dane wprowadzane przez użytkownika w postaci dziesiętnej, ale są one przechowywane jako jednoargumentowe.6
ucieka z górnego elementu stosu (zmieniając każde wystąpienie7
na1
; w ten sposób są uciekane ciągi składające się wyłącznie z7
s), a następnie dołącza go do elementu stosu przed (772
). Więc nasze dane są teraz coś w rodzaju7721111111111
.3
wyprowadza dany element stosu (i wyrzuca pusty element stosu, który jest częścią domyślnego stosu początkowego). Jego wartość jest obliczana na podstawie liczby1
s i7
s, i odejmując liczbę0
s i6
s. (Środek2
jest w większości przypadków ignorowany; jeśli znajduje się na końcu ciągu, stanie się końcowym znakiem nowej linii, a nie zostanie zignorowany, ale reguły PPCG nie przejmują się tym.) wejście plus 2.W tym momencie na stosie nie ma nic użytecznego i nic w programie, więc program się kończy.
Jak to odwrócić? Jest to prosta sprawa zmieniając
11
się00
tak, że jesteśmy poprzedzenie znaków do wejścia, które czynią go 2 niższe, aniżeli 2 wyższego. Jest00
wygodnie ukrytych osiem cyfr ósemkowych (tak, aby cyfry i bajty ósemkowe były ze sobą w linii), więc możemy po prostu zamienić je11
na początku.źródło
JavaScript (ES6), 21 bajtów, pęknięty
To jest proste.
Zwraca kostkę danych wejściowych.
źródło
Python 2, 83 bajty, pęknięty
Jest to podobne do mojej innej odpowiedzi. Jednak używa 64-bitowego RSA i jest dość słabo kryptograficznie. Jeśli potrafisz obrabować tę odpowiedź, możesz teoretycznie obrabować również moją drugą, mając wystarczająco dużo czasu.
źródło
Python 2, 47 bajtów, Cracked
Domena dla tej funkcji to {x ∈ ℤ | x> 0}. Kwadratowo wpływa na wejście.
nmjcman101 znalazł zamierzone rozwiązanie:
źródło
JavaScript (ES6), 46 bajtów, pęknięty
Ta funkcja zwraca
ln(x+1)
gdziex
jest liczbą nieujemną.Stosowanie
Uwaga: Z uwagi na charakter liczb zmiennoprzecinkowych liczby
f(g(x))
mogą nie być dokładnie równex
. Przykład:f(g(4))=3.9999999999999996
źródło
J, 8 bajtów, pęknięty
Kolejny prosty na początek.
Podwaja wejście.
źródło
Processing.js, 59 bajtów, pęknięty!
Ta funkcja zwielokrotnia wartość wejściową przez
204
(17*-4*-3=204
). Pobiera wartość int jako dane wejściowe i zwraca liczbę zmiennoprzecinkową. Zgodnie z oczekiwaniami, odwrotność dzieli dane wejściowe przez204
.Interpretator online do przetwarzania-js można znaleźć tutaj .
źródło
J, 10 bajtów, pęknięty
Kolejny prosty. Zwraca n 2 -1.
źródło
JavaScript (ES6), 15 bajtów, złamany przez Emignę
Możesz to przetestować w następujący sposób:
Pęknięty
Moje zamierzone rozwiązanie jest trochę inne niż crack Emigny:
źródło
J , 29 bajtów ( Popękane przez mile)
Jest to czasownik, który przyjmuje dodatnią liczbę całkowitą wejściu i wykonuje następujące czynności:
Wypróbuj online!
Moje rozwiązanie
Logika jest prawie taka sama jak w crackie. Łącznik rang
"
może utknąć w wielu różnych miejscach (i używam go, aby pozbyć się niepotrzebnych0
i3
), ponieważ tak naprawdę nic nie robi w rozwiązaniu.źródło
Przetwarzanie (java), 59 bajtów, BEZPIECZNE
Ta funkcja mnoży dane wejściowe przez
204
(17*-4*-3=204
). Pobiera wartość int jako dane wejściowe i zwraca liczbę zmiennoprzecinkową. Zgodnie z oczekiwaniami, odwrotność dzieli dane wejściowe przez204
. Uwaga: oba programy przyjmują liczbę int jako dane wejściowe i wypuszczają liczbę zmiennoprzecinkową.Ta odpowiedź jest dokładnie taka sama jak moja inna odpowiedź, z tą różnicą, że moja inna odpowiedź została napisana w Processing.js. Poznaj Processing-java, mniej gadatliwego kuzyna Javy. Możesz pobrać Przetwarzanie tutaj na processing.org.
Pęknięcie
Ten program dzieli argument przez
204
. Ale jak? Wejdźmy do funkcji.Dość proste, ale jak to
blue( get(0, 0) )
się stało204
? To jest centralny punkt tego wniosku. Po pierwsze,get(0,0)
pobiera kolor piksela znajdującego się w(0,0)
(lewy górny róg okna, które zawsze otwiera się w szkicu Przetwarzanie). Następnieblue()
pobiera niebieską wartość tego piksela, która jest204
!Aby wymyślić to zgłoszenie, eksperymentowałem, drukując różne atrybuty koloru uzyskanego przez
get(0,0)
. I okazało się, że czerwony, zielony, niebieski, alfa są wartości204
,204
,204
i255
odpowiednio. Z tego postanowiłem zrobić prostą operację z tym numerem i skończyłem z tym postem.źródło
JavaScript (ES6), 63 bajty Cracked przez Ilmari Karonen
Czas na jakieś
atob
bzdury. Ta funkcja zwracax*x+1
gdziex
jest liczbą nieujemną.Stosowanie
Zamierzony
Istnieje wiele potencjalnych rozwiązań, ale miałem nadzieję, że wiodące postacie zrzucą porządek bajtów na tyle, aby utrudnić to. C'est la
atob
źródło
Brain-Flak , 26 bajtów, Pęknięty
Oryginalny
My Crack
1000000000 's Crack
źródło
Python 2, 225 bajtów, spakowany przez Sp3000
Dziedziną tej funkcji jest [0, n), gdzie n jest ogromną liczbą powyżej. Tak, ta funkcja jest odwracalna w tej domenie. I chyba, że popełniłem błąd, złamanie tej odpowiedzi jest tak trudne, jak złamanie 512-bitowego RSA.
źródło
J, 15 bajtów
Pobiera nieujemną liczbę całkowitą n , konwertuje ją na listę cyfr binarnych i łączy te cyfry jako liczbę podstawową 10.
Wypróbuj online!
źródło