Hidden Inversions (Thread rabusiów)

16

To łamigłówka , wątek gliniarzy można znaleźć tutaj.

Twoim zadaniem będzie znalezienie anagramu dostarczonych programów w wątku gliniarzy, który wykonuje lewą stronę odwrotną.

Gdy złamiesz odpowiedź, opublikuj rozwiązanie jako odpowiedź poniżej i powiadom pierwotnego odbiorcę.

Zostaniesz oceniony na podstawie liczby programów, które pierwszy złamałeś.

Post Rock Garf Hunter
źródło

Odpowiedzi:

21

Python 3, 46 bajtów, Lynn

lambda x0223334566789:(x0223334566789*89)//178
GB
źródło
Jak „powiadomić pierwotnego odbiorcę”?
GB
Pozostawił komentarz łączący twoją odpowiedź na temat oryginału
Sefa
Powinieneś upuścić f=kod na początku kodu, ponieważ nie jest potrzebny i nie jest częścią oryginalnej funkcji
0
Gotowe, po prostu skopiowałem to zbyt szybko.
GB
16
Tutaj jestem brutalnie zmuszając się do rozwiązania (a nawet zakładając, że takie istnieje), a ty po prostu omijasz cały problem! +1
orlp
14

Python 2, 225 bajtów lub lp

p=90930641353124136621573325641513715557077985927835294018496194596645372722158;q=101979812089012306249375934082966806799688507587087308196267706260111970225882#--223444799
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Chyba miałem szczęście po zgadywaniu losowych dzielników głównych przez cały dzień ...

(Domyślny limit miejsc 4,8 x duży to 4, ale w zeszłym roku udało mi się podnieść go do 10. Musiałem dostosować konfigurację FAAS z 16 niewolników do 6 (+3 mpi, 1 master). 20 m polyselect, 12h 50m przesiewanie, 2h 25 m linalg, 30 m kw. Całkowity koszt ~ 70 USD. Przynajmniej @orlp był wystarczająco miły, aby wybrać rozmiar do rozwiązania, ale nie robię tego ponownie! Dzięki @IlmariKaronen za ostatni krok, i tak żartuję z zgadywanie: P)

Sp3000
źródło
Ja .. co ... Teraz czuję się źle z powodu tracenia pieniędzy :( Celowo wybrałem rozmiar, który nadal byłby rozsądnie mały, ale zbyt wysoki koszt ataku. Nie sądziłem, że ktoś wyda na to pieniądze.
orlp
1
@orlp Całkowicie warto to dla mnie jednorazowe doświadczenie. Mam nadzieję, że ludzie dowiedzą się na ten temat na temat 512-bitowego bezpieczeństwa RSA :)
Sp3000,
To prawdziwe poświęcenie dla golfa, spędzanie nie tylko czasu, ale i pieniędzy! Interesujące jest to, że osoba atakująca może potencjalnie złamać 512-bitowy RSA za darmo za pośrednictwem prób usługi przetwarzania w chmurze.
mile
@miles Powinienem wspomnieć, że AWS ma uznanie dla studentów, jeśli ktoś chce spróbować, i nie byłbym zaskoczony, gdyby inne usługi zrobiły to samo. Stąd prawdopodobnie nie jesteś tak blisko z tym pomysłem na próby, przynajmniej po raz pierwszy. (Jeśli ktoś chce spróbować - pamiętaj, aby usunąć wszystkie woluminy, AMI itp., Gdy skończysz, ponieważ w przeciwnym razie zostanie naliczona opłata za miejsce)
Sp3000
11

Python 2, 83 bajty lublp

Oryginalny:

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

Pęknięcie:

p=3207399658;q=3428998126#--11
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Wypróbuj online!

Pękanie RSA wykonane przez Wolfram Alpha . ;)

Ilmari Karonen
źródło
Właśnie sobie uświadomiłem, że ~p*~qjest krótszy niż -~p*-~q, ups.
lub
Jak udało ci się jednak odtworzyć (p*q-2*(p+q))/4część? :)
orlp
To była najtrudniejsza część, prawda? Zasadniczo, znajomość funkcji Carmichael oraz fakt, że p/2i q/2były zarówno nieparzystych liczb pierwszych, a kilka prób i błędów, aby znaleźć coś, co będzie działać, korzystając z dostępnych znaków.
Ilmari Karonen
Celowo wybrałem pi q(te prawdziwe w kodzie są p-1i q-1do gry w golfa) takie, które (p-1)/2są najważniejsze, więc mamy φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). To pozwala nam obliczyć modularną odwrotność 65537mod φ(pq)(czego potrzebujemy dla RSA) przy użyciu tożsamości Eulera, dzięki czemu odpowiedź jest znacznie krótsza, ponieważ nie musimy implementować modularnej odwrotności logiki ani twardego kodu innej dużej stałej. Oprócz -~q*-~p-> ~q*~pznalazłeś dokładnie moją funkcję :)
orlp 16.01.17
1
Właściwie, aby wybrać drobną nitkę, wierzę φ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)w bezpieczne liczby pierwsze pi q, ponieważφ(4) = 2 . Ale λ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)jest co najwyżej ((p-1)/2-1)((q-1)/2-1)/2i każda wielokrotność tego, minus jeden, wystarczy dla wykładnika. :)
Ilmari Karonen
7

Python 3, 80 bajtów, Wolfram

from bisect import*
q=int(input())
print(bisect([(h+1)**2 for h in range(q)],q))

To było naprawdę trudne do złamania! Korzystam z biblioteki dwusiecznej , która jest zawarta w dystrybucji Python 3. bisectFunkcja przyjmuje posortowanej listy i element i zwraca po prawej stronie, gdzie indeks element może być wprowadzony do utrzymania porządku. Po prostu podajemy mu qlistę kwadratów zaczynającą się od 1i element q.

Zgarb
źródło
1
Chciałem zaproponować zmianę (h+1)na -~h. Potem zdałem sobie sprawę, że nie o to chodzi w tym wyzwaniu: P
ETHprodukcje
@ETHproductions I tak byłoby niepoprawne ze względu na pierwszeństwo operatora.
Sp3000,
@ Sp3000 Huh, nie miałem pojęcia, że **ma wyższy priorytet niż ~w Pythonie. Przypuszczam, że jest to lepsze niż w JS, gdzie -~2**2generuje błąd składniowy („niepoznane wyrażenie jednoargumentowe nie może pojawić się po lewej stronie„ ** ””).
ETHproductions
@ETHproductions W rzeczywistości zrobili to, aby uniknąć dwuznaczności, co, jak mogę dodać, jest bardzo nietypowe dla większości projektów JS.
Esolanging Fruit 15.07.17
@ Challenger5 Tak naprawdę musiałbym się z tobą nie zgodzić: w ostatnich latach TC39 dołożył wszelkich starań, aby wszelkie dodane nowe funkcje były jak najbardziej wolne od dwuznaczności (w tym **operatora dodanego w ES2017)
ETHproductions
6

JavaScript, 21 bajtów, Arnauld

Oryginalny

b=>Math.pow(b,torc=3)

Pęknięcie

o=>Math.cbrt(o,pbw=3)

Zwraca pierwiastek kostki.

Emigna
źródło
Proszę bardzo! ;)
Arnauld
@Arnauld: Wydaje mi się trochę dziwne, że JS pozwala na wywoływanie funkcji z większą liczbą argumentów, niż są zdefiniowane. Zastanawiam się, jaka jest za tym myśl.
Emigna
6
Masz rację, JS pozwala na to z założenia. Dodatkowe argumenty nie są jednak całkowicie tracone, ponieważ są przechowywane w obiekcie argumentów, do którego funkcja może uzyskać dostęp ręcznie.
Arnauld
5

7, 9 bajtów, ais523

00000000: 0173 dc25 7e13 dcb6 1f                   .s.%~....

Ponieważ brutalna siła zawsze wygrywa, a 9! jest tylko 362880

GB
źródło
4

Processing.js, 59 bajtów, Kritixi Lithos

Oryginalny:

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

Pęknięcie:

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

Cóż, to było dość łatwe. Najtrudniejsze było ustalenie, gdzie umieścić dodatkowe przecinki i gwiazdki. Na szczęście wydaje się, że Przetwarzanie pozwala na dodatkowe nieużywane parametry funkcji, a także wyrażenia przecinków w stylu C.

Ilmari Karonen
źródło
1
Najwyraźniej tłumacz, który podłączyłem, był zły. W rzeczywistości większość (lub nawet wszystkie) internetowych tłumaczy prawdopodobnie będzie w błędzie, ponieważ Processing-java została wstępnie skompilowana do Processing.js. W tej chwili myślę, że najlepszym rozwiązaniem byłoby dla mnie, a ty zmieniłbyś nasze odpowiedzi na „Processing.js” zamiast Processing, ponieważ wtedy twoja odpowiedź byłaby prawidłowa (Processing-java daje mnóstwo błędów). Wyślę osobną odpowiedź z tym samym kodem, co Processing-java, ale w tym celu interpreter gniazd powinien zainstalować go z processing.org. Dobra robota i tak!
Kritixi Lithos
4

JavaScript (ES6), 63 bajty, SLuck49

Oryginalny:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Pęknięcie:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

Powyższy kod base64 dekoduje:



Math.pow(x-1,0.5) //...

gdzie ... oznacza grupę losowych śmieci, które są ignorowane przez interpreter JS, ponieważ są w komentarzu.

Znalazłem to rozwiązanie metodą prób i błędów. W końcu, tak naprawdę tylko Najtrudniejsze były dwa znaki nowej linii na początku kodu, potrzebne do linii odpocząć prawidłowo i aby dostać Msię Mathdo base64 zakodować do czegoś, co było dostępne w oryginalnym zestawie znaków. Najpierw wypróbowałem spacje, ale " M"kodowałem base64 "ICBN"i potrzebowałem jedynej dostępnej Bdo kodowania ".po"później w kodzie. "0+M", "1*M", "1?M"Lub innych podobnych prefiksy no-op mogłem pomyśleć nie działało, ale nowe linie zrobił.

Podejrzewam, że nie może to być dokładnie zamierzone rozwiązanie, ale cokolwiek - to działa. :)

Próbny:

var f = x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)
var g = x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)
for (var i = -0; i <= 10; i++) console.log(i, '->', f(i), '->', g(f(i)))

Ilmari Karonen
źródło
Dobra praca ze znalezieniem czegoś, co zadziałało, miałem nadzieję, że umieszczenie dodatkowych postaci na początku sprawi, że będzie to trochę trudniejsze
SLuck49
Imponujące :) Podjąłem to samo podejście, ale nie pomyślałem o wypróbowaniu nowej linii. Próbowałem zgubić C gdzie indziej, ale nic nie osiągnąłem.
Chris M
3

Brain-Flak, 26 bajtów, Kreator pszenicy

Oryginał (dodaje 13)

((((()()())){}[()]){}{}{})

Crack (odejmuje 13)

([(((()())()){}){}{}](){})
0 '
źródło
3

J, 8 bajtów, mil

[:]-:[+:

Prosta zamiana +:na -:(podwójna na połowę).

Conor O'Brien
źródło
Ponadto można zamienić na lewo i prawo czasowniki: [:[+:]-:.
randomra
3

Python 2, 47 bajtów, Kreator pszenicy

lambda x:sorted(a**2for a in range(x)).index(x)
nmjcman101
źródło
Dobra robota! Znalazłeś dokładnie to, co miałem na myśli
Post Rock Garf Hunter
3

JavaScript (ES6), 46 bajtów, SLuck49

Oryginał (oblicza ln (x + 1))

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

Pęknięcie

x=>Math[(lg=19979699+55686).toString(9+25)](x)

Nigdy bym tego nie złamał, gdybym nie zdał sobie sprawy, że odwrotność jest Mathwbudowana . (lg=19979699+55686).toString(9+25)to po prostu zawiły sposób powrotu "expm1".

ETHprodukcje
źródło
Ładnie wykonane! Tak, przeglądałem funkcje matematyki, aby zdecydować, czego użyć, zobaczyłem expm1i powiedziałem: „Czekaj, to jest coś?”
SLuck49,
2

J, 10 bajtów, mil

1%:@*~>:[<

Muszę tu coś napisać, ponieważ odpowiedź jest za krótka.

GB
źródło
2

J, 29 bajtów, Zgarb

Oryginalny

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

Pęknięcie

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

Wypróbuj online!

Kolejnym odpowiednikiem crack jest

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

Wyjaśnienie

[:(](07-5)"3 #.-:&#$,)5#.inv]  Input: integer n
                            ]  Get n
                      5        The constant 5
                       #.inv   Get the digits of n in base 5
[:(                  )         Operate on those digits D
                    ,            Flatten D (does nothing since it is already a list)
                  #              Get the length of D
               -:&               Halve it
                   $             Reshape D to half its length (only the base 2 digits)
    (07-5)"3                     The constant 2 with rank 3
             #.                  Convert the front-half of D to a decimal from base 2
   ]                             Return the right result
mile
źródło
Tak, to działa! To trochę różni się od mojego rozwiązania, ale jest dużo swobody. Podstawowa logika jest jednak taka sama.
Zgarb