Hidden Inversions (Wątek gliniarzy)


35

To łamigłówka 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


Czy możemy mieć wyimaginowane / złożone liczby całkowite?
Stewie Griffin

@stewie, jeśli zaznaczysz, że możesz
Wheat Wizard

1
Czy anagramowanie jest zdefiniowane jako przepuszczanie znaków lub przepuszczanie bajtów (w językach, które nie używają zestawu znaków jednobajtowych)?

1. „ Następnie zaprezentujesz jeden z programów ” wydaje się sugerować, że możemy wybrać, który z nich przedstawić, ale zdanie trwa dalej „ z lewą odwrotnością ukrytą ”, co oznacza, że ​​musimy przedstawić konkretny. Który to jest? 2. Pytanie wyraźnie określa „ program ” i nie wydaje się zezwalać na funkcje, ale przykładem jest raczej funkcja niż program. Który to jest?
Peter Taylor

Czy wielkie litery mają znaczenie?
Kritixi Lithos

Odpowiedzi:


12

Python 3, 80 bajtów ( Cracked )

bhmq = int(input())
print(bhmq ** 2)
(1 or [(sqrt),(specification+of*integerr)])

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”).


1
Ten mi się podoba. Złudnie trudno go złamać
Wheat Wizard

3
Witamy w ppcg! Miły pierwszy post!
Rɪᴋᴇʀ

1
Bez względu na to pęknięcie, pomyliłem się. Pytanie wciąż pozostaje aktualne.
orlp

1
Powiedziałbym „nie”, jeśli naprawdę wolno mi nałożyć to ograniczenie na reguły dotyczące wyzwania.
Wolfram


11

Python 3, 46 bajtów, pęknięty

lambda x:x*(1999888577766665//844333333222200)

Podwaja wejście.


3
Jak działa „Python” u gliniarzy? Czy możemy wybrać dowolną wersję, za pomocą której można zaatakować twoją odpowiedź?
orlp

Och, to jest konkretnie Python 3 , przepraszam. Tak jak /podział na zmiennoprzecinkowe.
Lynn

3
Właśnie udowodniłeś, że to wyzwanie nie jest warte mojego czasu. Iść dalej.
mbomb007


11

7 , 9 bajtów, pęknięty

Ten program jest pełen znaków niedrukowalnych, więc oto zrzut heksowy:

00000000: 2573 dc01 7e13 dcb6 1f                   %s..~....

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 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, 6i 7to tylko 2na 5nie), numery unbolded reprezentowania ich ekwiwalenty (uciekł 0do 5, z których wszystkie są reprezentowalna w oryginalnym programie; notatka to 0jest ucieczka 6i 1ucieczka 7):

112 7 1 7 34002 77 023 67 13303

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 6i 7). 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):

772 | 7 | 34662 | 023 | 73363

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:

73363 
7       Wciśnij pusty element na stos
  3 Wyrzuć      górny element stosu, odrzuć element poniżej
 73      Łączny efekt tych: odrzuć element górnego stosu
   3     Wyrzuć element górnego stosu, odrzuć element poniżej
    6    Wyjdź z górnego elementu stosu, a następnie dołącz go do elementu poniżej
     3   Wyjmij element górnego stosu, odrzuć element poniżej

Innymi słowy, jest to głównie garść instrukcji We / Wy. Przeanalizujmy to szczegółowo:

  • 73odrzuca to 73363, co wciąż jest na wierzchu stosu.
  • 3wypisuje 023i odrzuca 34662. W ten sposób można zauważyć, że 34662jest to komentarz, który został użyty do przechowywania bajtów potrzebnych w innej wersji programu. Jeśli chodzi o to, co 023dzieje się podczas wyjścia, wybiera format wejścia / wyjścia 0 (liczby całkowite), a następnie 23dyrektywę, 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 (obecnie 7) 7777777777. Dlatego akceptujemy dane wprowadzane przez użytkownika w postaci dziesiętnej, ale są one przechowywane jako jednoargumentowe.
  • 6ucieka z górnego elementu stosu (zmieniając każde wystąpienie 7na 1; w ten sposób są uciekane ciągi składające się wyłącznie z 7s), a następnie dołącza go do elementu stosu przed ( 772). Więc nasze dane są teraz coś w rodzaju 7721111111111.
  • Na koniec 3wyprowadza 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 i 7s, i odejmując liczbę 0s i 6s. (Środek 2jest 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 11się 00tak, ż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ć je 11na początku.



Uwaga dodatkowa: nie musisz wyjaśniać swojego kodu, ale dobrze byłoby wiedzieć, co robi Twój program.
GB

@GB: Dałem pełne wyjaśnienie programu (w tym wyjaśnienie, jak działa crack).


6

Python 2, 83 bajty, pęknięty

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

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.



5

Python 2, 47 bajtów, Cracked

lambda x:x**2or (iron() and saxifrage.extend())

Domena dla tej funkcji to {x ∈ ℤ | x> 0}. Kwadratowo wpływa na wejście.


nmjcman101 znalazł zamierzone rozwiązanie:

lambda x:sorted(a**2for a in range(x)).index(x)


1
Haha, uwielbiam wymyślone wywołania funkcji
FlipTack

1
Pęknięty To było zabawne, utknąłem na posortowanym anagramie, który zostawiłem!
nmjcman101

5

JavaScript (ES6), 46 bajtów, pęknięty

x=>Math.log(x+(+String(t=985921996597669)[5]))

Ta funkcja zwraca ln(x+1)gdziex jest liczbą nieujemną.

Stosowanie

(x=>Math.log(x+(+String(t=985921996597669)[5])))(5)

Uwaga: Z uwagi na charakter liczb zmiennoprzecinkowych liczby f(g(x))mogą nie być dokładnie równe x. Przykład:f(g(4))=3.9999999999999996


Pęknięty. To była naprawdę dobra zabawa :-)
ETHproductions


4

Processing.js, 59 bajtów, pęknięty!

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

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 .





4

J , 29 bajtów ( Popękane przez mile)

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Jest to czasownik, który przyjmuje dodatnią liczbę całkowitą wejściu i wykonuje następujące czynności:

  1. Konwertuj na bazy 2 i 4.
  2. Wypełnij reprezentację base-4 zerami, aby mieć taką samą długość jak reprezentacja base-2.
  3. Połącz dwie reprezentacje (najpierw baza-2).
  4. Zinterpretuj konkatenację jako reprezentację base-5 i przekonwertuj na liczbę całkowitą.

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ę niepotrzebnych 0i 3), ponieważ tak naprawdę nic nie robi w rozwiązaniu.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]

Nie rozumiem J, ale moje eksperymenty pokazują, że faktycznie bierze to liczbę całkowitą w zasadach 2 i 4, dodaje zera na końcu zasady 4, aby ich długość była równa, a dopiero potem konkatenuje. Czy te zera są zamierzone?
Wolfram

@Wolfram Zera są zamierzone, to właśnie próbowałem powiedzieć „jednocześnie”. W przeciwnym razie nie sądzę, że byłoby to odwracalne.
Zgarb

@Wolfram Dodałem bardziej wyraźny opis.
Zgarb,


4

Przetwarzanie (java), 59 bajtów, BEZPIECZNE

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Ta funkcja mnoży dane wejściowe przez204 ( 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

float ap(int i){return i*pow(blue(get(0,0)),-1);}//++7*4*-3

Ten program dzieli argument przez 204. Ale jak? Wejdźmy do funkcji.

i *                              //multiply i by
         blue( get(0, 0) )       //this (evaluates to 204)
    pow(                  , -1)  //raises to the -1 power (ie its reciprocal)

Dość proste, ale jak to blue( get(0, 0) )się stało 204? 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ępnie blue()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ści 204, 204, 204i 255odpowiednio. Z tego postanowiłem zrobić prostą operację z tym numerem i skończyłem z tym postem.


Myślałem, że Kotlin jest mniej rozwodnionym kuzynem Jawy! Przyznaję, że rodzina języków C jest dość duża ... ale jak wyglądałoby to drzewo genealogiczne ...
97 CAD

Wierzę, że ci się udało, nikt nie złamał twojego postu i minął tydzień.
mile

3

JavaScript (ES6), 63 bajty Cracked przez Ilmari Karonen

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Czas na jakieś atobbzdury. Ta funkcja zwraca x*x+1gdzie xjest liczbą nieujemną.

Stosowanie

(x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`))(5)

Zamierzony

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

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 laatob



Czy przypadkowo ponownie opublikowałeś kod wyzwania jako zamierzone rozwiązanie? :)
Ilmari Karonen

@IlmariKaronen Dzięki, to nauczy mnie kopiować / wklejać ... lol tak racja: P
SLuck49


2

Python 2, 225 bajtów, spakowany przez Sp3000

#((()))****+,,---/000555666888;==oppppppqqqqqw~~
lambda n:pow(n,65537,9273089718324971160906816222280219512637222672577602579509954532420895497077475973192045191331307498433055746131266769952623190481881511473086869829441397)

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.


1
Wymuszanie brutalne jest znacznie łatwiejsze niż wymuszanie brutalne RSA, ponieważ masz już przybliżony schemat stałej, której potrzebujesz. Z drugiej strony jest to prawdopodobnie zbyt trudne do zarządzania w praktyce.

4
Należy pamiętać, że istnieje meta post dotyczący randomizacji w wyzwaniach CnR
Kritixi Lithos

5
@KritixiLithos Moja odpowiedź nie zawiera losowości, skrótów ani wbudowanego kodu kryptograficznego. To dosłownie jedno modułowe potęgowanie.
orlp

2
Twoja odpowiedź ma na celu rozwiązanie problemu, o którym wiadomo, że jest trudny do rozwiązania, dlatego pasuje do meta postu (zwłaszcza, że ​​bezpośrednio wspomina o RSA). Myślę, że nawet jeśli masz luki w meta, twój skrypt nadal zasługuje na moją opinię.
Christoph


0

J, 15 bajtów

(".&,'10.')#.#:

Pobiera nieujemną liczbę całkowitą n , konwertuje ją na listę cyfr binarnych i łączy te cyfry jako liczbę podstawową 10.

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.