Zadaniem gliniarzy jest napisanie funkcji lub programu, który, gdy otrzyma dane wejściowe, generuje skończony ciąg deterministyczny. Jeśli program otrzyma inne dane wejściowe, powinien zwrócić inne dane wyjściowe.
Zasady:
- Zgłoszenia składają się z
- Nazwa języka
- Jeśli zostaną użyte jakieś flagi, powinny zostać ujawnione.
- Liczba bajtów programu
- Liczba bajtów danych wyjściowych
- Wynik
- Jeśli jest szczególnie długi, podaj pastę lub coś podobnego
- Jeśli zawiera niedrukowalne materiały, podaj zrzut heksowy.
- Końcowe znaki nowej linii i białe znaki powinny być uwzględnione w danych wyjściowych
- Skąd pochodzi dane wejściowe (STDIN, wiersz poleceń itp. )
- Nazwa języka
- Jeśli ma to zastosowanie, możesz założyć, że bajt reprezentujący EOF nie jest obecny na wejściu, chyba że użyjesz tego bajtu w swoim programie.
- Jeśli twój program jest pęknięty, dodaj link do odpowiedniej odpowiedzi w wątku rabusia w swoim tytule.
- Twój program nie jest bezpieczny, dopóki nie minie tydzień i tak go oznaczysz.
- Nie podobają mi się takie techniki, jak rozsiewanie losowe za pomocą wejściowych lub kryptograficznych funkcji skrótu. Nie mogę ich powstrzymać, ale nie przyjmuję rozwiązania, które wykorzystuje którekolwiek z nich . Zauważ również, że niektóre z tych technik mogą mieć kolizje, w których inny ciąg generuje ten sam wynik.
- Twoim celem jest jak najkrótsze wyjście. Najkrótsze bezpieczne rozwiązanie opublikowane w ciągu trzech tygodni od opublikowania tego pytania wygrywa!
Zadaniem rabusia jest znalezienie programu o rozmiarze równym lub mniejszym niż oryginał, który również przestrzega powyższych zasad.
Jeśli złodziej rozbije Twój program przy użyciu innego rozwiązania niż zamierzone, masz możliwość jego „odblokowania” przez udowodnienie, że jego rozwiązanie jest nieprawidłowe. Możesz to zrobić, znajdując dane wejściowe do programu rabusia, który wygeneruje takie same dane wyjściowe.
Przykładowe przesłanie:
pieprzenie mózgu, 10 bajtów, wynik: 10
]<.[<],>[,
To rozwiązanie to [>,] <[. <], Które po prostu odwraca dane wejściowe
Powodzenia!
code-challenge
cops-and-robbers
Jo King
źródło
źródło
1
samemu sobie lub w0
inny sposób1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941
dla niektórych innych ciągów.Odpowiedzi:
7 , 31 znaków, wynik 30, bezpieczny, ale prawdopodobnie uszkodzony?
Program 7 jest zwykle tylko liczbą, ale może zawierać spacje, dzieląc go na wiele liczb. To przedłożenie składa się zatem z dwóch liczb (które są domyślnie konkatenowane przez interpretera 7), a program podobnie przyjmuje dwie liczby jako dane wejściowe, poprzez standardowe dane wejściowe. („31 znaków” w nagłówku to łączna długość dwóch cyfr plus jeden znak oddzielający białe znaki; cyfry tworzące liczby są interpretowane jako ósemkowe, gdy są używane jako program, ale dziesiętne, gdy są używane jako dane wejściowe, oraz to cyfry są takie same w obu przypadkach, a nie rzeczywiste liczby. Zauważ, że nie ma znaczenia ani w przypadku traktowania jako programu, ani w przypadku wprowadzania danych, niezależnie od tego, czy oddzielasz je spacją, czy znakiem nowej linii; mam nadzieję, że nie unieważniają przesłanie).
Oczekiwanym wynikiem jest następująca liczba (wyrażona tutaj w systemie dziesiętnym, ponieważ jest to format wyjściowy, którego używa 7 interpreter):
Zauważ, że 7 interpreter połączony z wiki Esolang wewnętrznie przechowuje liczby w jedności, co oznacza, że prawdopodobnie nie masz wystarczającej ilości pamięci, aby uruchomić program na sobie, aby zobaczyć, co robi. Program zweryfikowałem ręcznie, sprawdzając jego zachowanie i testując go na niewielkich nakładach, aby sprawdzić, czy działał zgodnie z oczekiwaniami. Alternatywnym podejściem byłoby napisanie interpretera, który wykorzystuje bardziej wydajną metodę przechowywania liczb.
Unikanie pęknięć tutaj było trochę uciążliwe, ale w końcu jestem teraz zadowolony, że żadne inne liczby poza tymi w samym programie nie są w stanie wygenerować 238363505302130098723162537059. ( EDYCJA tydzień później: Mogłem się mylić, w zależności od tego, jak interpretujesz pytanie; patrz poniżej. )
Rozwiązanie
Pierwotny program to:
Zamierzano, aby żadne inne dane nie dawały pożądanego rezultatu, ponieważ:
Jednak w zależności od tego, jak interpretujesz pytanie, może istnieć drugie wejście, które generuje pożądany wynik (w ten sposób unieważniając to rozwiązanie):
Wyjaśnienie
Oto, jak działa zamierzone rozwiązanie:
źródło
Node.js v10.9.0 , 40 bajtów, wynik: 40, pęknięty
Wejście
Jest to funkcja przyjmująca dokładnie jeden parametr.
Wynik
źródło
o=>[...j=o,].sort(n=>(j+=113)&69).join``
, alej
nie mogę przejść do liczby całkowitejGrusza , 46 bajtów ASCII, wynik 0, pęknięty
Wejście pobierane jest ze standardowego wejścia. Oczekiwany wynik (na standardowym wyjściu) to pusty ciąg znaków (tzn. Gdy program podaje się jako argument, nie należy drukować żadnego wyniku).
Innymi słowy, wyzwaniem tutaj jest napisanie programu A Pear Tree, który nie wypuszcza niczego na standardowe wyjście, gdy otrzymuje się go na standardowym wejściu, i który wysyła coś na standardowe wyjście, gdy otrzymuje coś innego niż siebie na standardowym wejściu, bez użycia ponad 46 bajtów. (Udało mi się to zrobić, trzymając program również w formacie ASCII do wydrukowania, mimo że A Pear Tree często używa znaków spoza ASCII i znaków niedrukowalnych.) To jest skutecznie zadanie napisania programu identyfikującego się w określonym formacie wyjściowym (tzn. ciąg zerowy, gdy identyfikacja się powiedzie); jednak drzewo gruszy ma co najmniej dwa zwroty, które sprawiają, że zadanie jest nieco trudniejsze niż się wydaje, gdy wykonuje się je w tym konkretnym języku (dlatego wybrałem je do złożenia gliny).
Moje rozwiązanie
Moje rozwiązanie jest trochę inne niż crack:
Wypróbuj online!
Zamiast używać
exit
, zamiast tego ustawiam$_
(niejawne dane wyjściowe) i$\
(nowy wiersz po danych wyjściowych, w tym dane niejawne) na ciąg zerowy, jeśli istnieje dopasowanie (i1
jeśli nie ma dopasowania). Aprint
jest nadal wymagane, ponieważ niejawne dane wyjściowe są włączane tylko wtedy, gdy istnieje co najmniej jeden bajt danych wejściowych (dlatego musimy jawnie wydrukować coś, jeśli otrzymamy pusty ciąg znaków jako dane wejściowe, które różnią się od programu).Każdy program A Pear Tree musi zawierać gdzieś sumę kontrolną (tak jest
MZpa
w tym rozwiązaniu). Zarówno moje rozwiązanie, jak i crack wybierają nazwy zmiennych (i zmieniają inne drobne szczegóły kodu), aby suma kontrolna składała się wyłącznie z liter ASCII.źródło
Perl 5
-p0777
, 10 bajtów, wynik 10, bezpiecznyOstatni znak to „shift out”, kod znaku 14 (dziesiętny) / 0E (szesnastkowy). Wszystkie pozostałe są drukowalne ASCII.
Ponieważ używamy niejawnego argumentu We / Wy Perla
-p0777
, dane wejściowe pochodzą ze standardowego wejścia, a dane wyjściowe przechodzą na standardowe wyjście.Rozwiązanie
Program wykonuje następujące czynności:
co oznacza, że sam program, jedyne wejście generujące pożądane wyjście, to:
Wypróbuj online!
Wyjaśnienie
źródło
Python 3, pęknięte 50 bajtów
Wejście i wyjście z / na standardowe wejście / wyjście. Wyjście jest różne dla każdego wejścia. Unikalne dane wyjściowe po podaniu kodu źródłowego:
(To 150 cyfr)
Powodzenia!
źródło
05AB1E , 35 bajtów, wynik: 7
Wejście:
z
stdin
Wynik:
QÕ Ƿe
źródło
Cubix , 18 bajtów, wynik 18, bezpieczny
Szkoda, że to wyzwanie nie zyskało większej uwagi, ale czasem tak się dzieje. Chciałem zostawić to niebezpieczne, ale postanowiłem opublikować rozwiązanie, zanim o nim zapomnę.
To powinno być dość łatwe do złamania.
Dane wejściowe z
stdin
Wynik
Edytować: Powinienem wspomnieć, że oczekuje to źródła w jego skróconej formie ... a teraz zauważyłem, że brakuje bajtu (niedrukowalnego) w wyniku, który zepsułem podczas publikowania. Należy skopiować teraz. Wartości szesnastkowe to
24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39
Założeniem było usunięcie wydruku pierwszego znaku, a następnie usunięcie odwrotnego indeksu ze znaku, np. [Znaki] - [0, len ([znaki]) .. 2]
Kod jest
który odwzorowuje na następną kostkę
Wypróbuj tutaj
źródło
Galaretka , 14 bajtów, Wynik: 21, Bezpieczny
Zarówno rozmiar programu, jak i wyjścia są liczone przy użyciu strony kodowej Jelly.
Wejście
Pierwszy argument wiersza poleceń.
Wynik
Rozwiązanie
Wypróbuj online!
źródło
v⁼
ustąpi,1
jeśli dane wejściowe ocenione jako kod Jelly z wejściem wejściowym są równe wejściowi i albo ustąpią albo będą0
błędne (jeśli wejście jest niepoprawnym kodem Jelly), jeśli nie.JavaScript Firefox, <10 bajtów, wynik: 52, z argumentów funkcji wejściowych, pęknięty
btoa(btoa)
koduje następujący ciąg:co daje:
właśnie skopiowałem
źródło
GCC 61-> 61 bajtów
Pełny program, weź wejście ze standardowego wejścia i wyjdź na standardowe wyjście
źródło
50
?Perl 6, 43 bajty, wynik: 15, ze standardowego wejścia
źródło
Pepe , 23 bajty, wynik: 23, złamany przez MickyT
Wejście:
standard
Wynik:
źródło
J , 26 bajtów, wynik: 52, bezpieczny
Program nie jest REPL, ale pełnym skryptem, który akceptuje
stdin
i jawnie drukujestdout
.Wejście
Standardowe wejście.
Wynik
Nie, to nie jest metoda szyfrowania.
Rozwiązanie
Wypróbuj online!
źródło
Beczka , 6 bajtów, wynik: 6
Wejście
Od
stdin
za pomocą?
Wynik
Pamiętaj, że są to sekwencje specjalne dla niezadrukowanych bajtów. Zamień ucieczki na dosłowne znaki. Surowy tekst dostępny tutaj
Powodzenia z tym! Do zobaczenia w przyszłym tygodniu!
źródło
Perl 6, 31 bajtów, wynik: 39, od standardowego - Cracked
Pęknięty tutaj
Surowe rozwiązanie. Może przetrwać.
źródło