Transformatory w przebraniu (wątek gliniarzy)

10

Wątek rabusia jest tutaj

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. )
  • 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!

Jo King
źródło
„Jeśli program otrzyma inne dane wejściowe, powinien zwrócić inne dane wyjściowe.” Czy to oznacza, że ​​program nigdy nie powinien wypisywać tego samego dla innych danych wejściowych? Czy to oznacza, że ​​program nie powinien ciągle wysyłać czegoś niezależnie od danych wejściowych? (ISTNIEJE wejście, które nie jest sobie równe, w przeciwieństwie do danych FORALL, które nie są sobie równe, zwracają inne wyjście.)
tsh
@tsh Tylko dane wejściowe muszą mieć unikalne dane wyjściowe. Na przykład prawidłowe zgłoszenie może być programem umożliwiającym identyfikację , który daje wyniki 1samemu sobie lub w 0inny sposób
Jo King,
@JoKing Czyli przykładowe przesłanie Pythona 3 jest nieprawidłowe? Ponieważ oczywiście również generuje wyniki 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941dla niektórych innych ciągów.
Lynn,
@lynn Masz rację. Usunąłem ten przykład
Jo King

Odpowiedzi:

4

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):

238363505302130098723162537059

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:

711170237403706
111723603700633
Ten program trwa dwie liczby x i y , a wynik ekspresji 3)xy-y-2) (tj y(3)x-1)-2) ). Jeśli będziemy wykonywać te obliczenia na x=711170237403706 i y=111723603700633 , otrzymujemy wynik 238363505302130098723162537059 wymagane .

Zamierzano, aby żadne inne dane nie dawały pożądanego rezultatu, ponieważ:

Dane wejściowe należy wybrać tak, aby y(3)x-1)-2)=238363505302130098723162537059 , tj. y(3)x-1)=238363505302130098723162537061 (dodanie 2 po obu stronach). Ta liczba jest półpierwszą, z tylko dwoma czynnikami: 111723603700633 i 2133510712211117 . Tylko jedną z tych liczb, 2133510712211117 , można wyrazić w postaci 3)x-1 (dając (3)×711170237403706)-1=2133510712211117 ). Możemy więc jednoznacznie zidentyfikować, która liczba jestx a która jesty , co oznacza, że ​​działa tylko jedno wejście.

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):

Niestety istnieją dwie multiplikatywne partycje semiprime na dwa czynniki: jeden polega na podzieleniu go na dwa czynniki pierwsze, ale drugi to trywialny podział składający się z 1 i samej liczby. 1 , nie może być zapisany w postaci 3)x-1 o całkowitej x , a sygnał wyjściowy może być; dlatego potencjalny meta-crack wymaga podania danych wejściowych jako 79454501767376699574387512354 i 1 . Jednak pierwsza liczba tutaj obejmuje znaki ( 8 i 9), których nie ma w zestawie znaków dla 7 programów. Więc jeśli dane wejściowe są ograniczone do tego samego zestawu znaków co program, to rozwiązanie jest poprawne; ale jeśli dane wejściowe zawierające znaki spoza zestawu znaków programu są dozwolone, to rozwiązanie jest nieprawidłowe.

Wyjaśnienie

Oto, jak działa zamierzone rozwiązanie:

711170237403706 111723603700633
7 7 7 Stosy separatorów elementów
 111 023 403706 111723603700633 Początkowe elementy stosu
 111 Liczba 3, jednomyślnie
     023 DSL I / O dla „wprowadź liczbę”
         403706 111723603700633 Program główny
(Implikowany: wykonaj kopię głównego elementu programu, zachowując oryginał)
         40 Zamień {023} powyżej {program}, unikając tego
           3 Wykonaj operacje we / wy za pomocą {023}; pop {program}
     0 I / O: numeryczne
      23 Wpisz liczbę, kopiując {111} tyle razy
            706 Dołącz „6” do numeru (zmniejszając go)
                11 Naciśnij dwa puste elementy stosu
                  17236 Wciśnij element stosu „23” (nieskalowany)
                       0 Escape {23}, zużywa pusty element
                        3 Wykonaj operacje we / wy za pomocą {23}; pop {element poniżej}
                    23 Kopiowanie wierzch stosu wejściowych wiele razy
                         7006 Dołącz „66” (tzn. Odejmij 2)
                             3 Wyjście {jako liczba}
                              3 Wyjdź z programu (z powodu niskiego stosu)
Wiodące 7 i końcowe 3 nie są konieczne do działania programu, są tylko po to, aby uzyskać właściwe czynniki wyjściowe. Pomaga postępować zgodnie z tym programem, jeśli rozumiesz format liczbowy; Liczby są przechowywane w jednoargumentowy wariant, w którym 1i 7zwiększenia wartości o 1, a 0i 6zmniejszania wartości o 1 (w ten sposób dodanie 66zmniejsza wartość od 2, powtarzając mnożenia liczb on, i tak dalej). Dane wejściowe są wykonywane przez powtarzanie elementu stosu (więc jeśli element stosu ma 12345wartość wejściową 3) , nowy element stosu to 123451234512345 ).

rev ais523
źródło
3

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

&`nij.9=j.,)r31n=+(=ooj`[o.o.)1.s](>=6>t
Arnauld
źródło
Mogę tylko zmienić kolejność na o=>[...j=o,].sort(n=>(j+=113)&69).join`` , ale jnie mogę przejść do liczby całkowitej
l4m2
Pęknięty. To było całkiem fajne :-)
ETHproductions
3

Grusza , 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:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

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 (i 1jeśli nie ma dopasowania). A printjest 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 MZpaw 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.

ais523
źródło
1
Pęknięty .
user202729,
3

Perl 5 -p0777, 10 bajtów, wynik 10, bezpieczny

W)9r46<(k

Ostatni 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:

NUL wstawia dane wejściowe do co najmniej 10 znaków, a następnie XOR z łańcuchem svgOUT_TOP

co oznacza, że ​​sam program, jedyne wejście generujące pożądane wyjście, to:

$ _ ^ = abc | $ ^

Wypróbuj online!

Wyjaśnienie

Perl ma wiele zmiennych specjalnego przeznaczenia. Na przykład, gdy używane -p0777jest niejawne We / Wy, $_jest wprowadzane na początku programu i wyprowadzane na końcu programu.

Większość tych zmiennych ma bardzo prostą wartość domyślną. Jednak domyślną wartością $^aktualnie wybranego formatu u góry strony jest znacznie dłuższy ciąg STDOUT_TOP. Jako taki, możemy użyć tego jako bardzo zwięzłej metody zaciemniania poprzez XORing $^o wartości, którą chcemy zaciemnić (w tym przypadku program).

Aby ukryć wskaźnik _TOPna końcu, dopełniłem sam program do 10 znaków, dodając znak abc|, co oznacza, że ​​wszystkie znaki STDOUT_TOPbyłyby czymś XOR; wybór abc|na początku był łatwym sposobem na zachowanie wydruku głównie na wydruku (i aby trudniej było zauważyć, że XORing ciągiem wykonanym głównie z wielkich liter, ponieważ w ASCII, małe litery XOR są małe).

ais523
źródło
3

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:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(To 150 cyfr)

Powodzenia!

agtoever
źródło
Ups! Widzę teraz, że to wyzwanie już dawno się skończyło ... Dziwne, że pojawiło się na mojej osi czasu / w kanale. Ciekawe, czy ktokolwiek zareaguje na to ...
jeszcze
Pęknięty.
Boboback
2

05AB1E , 35 bajtów, wynik: 7

Wejście:
zstdin

Wynik:
QÕ Ƿe

Emigna
źródło
2

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 zstdin

Wynik

$`*2aJPJ#74(o);89

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 to24 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

$r;#AoW\U-@</u.?;;

który odwzorowuje na następną kostkę

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Wypróbuj tutaj

MickyT
źródło
2

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

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Rozwiązanie

ØJiⱮÄÆNPḃØ⁵ịØJ

Wypróbuj online!

Bubbler
źródło
Ponieważ konwersja ze strony kodowej / na Jelly jest trudna, warto mieć weryfikatora (który pobiera program, konwertuje go z UTF8 na Jelly, karmi się nim, konwertuje z Jelly na UTF8 i sprawdza, czy jest równy oczekiwanym wyjście)
user202729,
@ user202729 ten program Jelly,v⁼ ustąpi, 1jeś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ą 0błędne (jeśli wejście jest niepoprawnym kodem Jelly), jeśli nie.
Jonathan Allan,
1

JavaScript Firefox, <10 bajtów, wynik: 52, z argumentów funkcji wejściowych, pęknięty

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) koduje następujący ciąg:

function btoa() {
    [native code]
}

co daje:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

właśnie skopiowałem

l4m2
źródło
Przede wszystkim, po zrobieniu oczywistego, że to nie jest rzeczywisty kod? Po drugie, nie określasz, skąd pochodzi dane wejściowe. Zamieściłbym crack, ale szczerze mówiąc nie jestem pewien, czy to zgłoszenie jest prawidłowe.
Quintec
Pęknięty
Arnauld
Nie sądzę, aby w tym poście było konieczne umieszczenie wpisu crack - ludzie mogą po prostu kliknąć link, aby wyświetlić crack.
user202729,
1

GCC 61-> 61 bajtów

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Pełny program, weź wejście ze standardowego wejścia i wyjdź na standardowe wyjście

l4m2
źródło
Czy jest miejsce po ostatnim 50?
tsh
@tsh To zrzut
heksowy
1

Perl 6, 43 bajty, wynik: 15, ze standardowego wejścia

49671296789805
donaldh
źródło
2
Tylko sprawdzam, ponieważ twoja poprzednia odpowiedź nie była zgodna z regułami dla unikalnego wyjścia dla twojego programu jako danych wejściowych, czy możesz potwierdzić, że to przesłanie?
Jo King
Tak myślę.
donaldh
1

J , 26 bajtów, wynik: 52, bezpieczny

Program nie jest REPL, ale pełnym skryptem, który akceptuje stdini jawnie drukuje stdout.

Wejście

Standardowe wejście.

Wynik

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

Nie, to nie jest metoda szyfrowania.


Rozwiązanie

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

Wypróbuj online!

Bubbler
źródło
1

Beczka , 6 bajtów, wynik: 6

Wejście

Od stdinza pomocą?

Wynik

5\x1c"\x1c"9

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!

Lyxal
źródło
0

 Perl 6, 31 bajtów, wynik: 39, od standardowego - Cracked

Pęknięty tutaj

().1111111111112222235abcegijkmnorstvy

Surowe rozwiązanie. Może przetrwać.

donaldh
źródło
Jestem prawie pewien, że złamałem twoje rozwiązanie i podejrzewam, że twój program nie przestrzega zasady, że różne dane wejściowe powinny generować różne wyniki.
nwellnhof,