Inversioni nascoste (filo dei ladri)


16

Si tratta di un di puzzle, filo dei poliziotti può essere trovato qui.

Il tuo compito sarà trovare un anagramma dei programmi forniti nel thread della polizia che esegua il suo inverso sinistro.

Dopo aver risolto una risposta, pubblica la soluzione come risposta in basso e informa il risponditore originale.

Sarai segnato sul numero di programmi che sei il primo a decifrare.

Risposte:


21

Python 3, 46 byte, Lynn

lambda x0223334566789:(x0223334566789*89)//178

Come faccio a "notificare il risponditore originale"?
GB,

Ha lasciato un commento che collega la tua risposta all'originale
Sefa,

Dovresti rilasciare f=all'inizio del codice poiché non è necessario e non fa parte della funzione originale
0

Fatto, l'ho appena incollato troppo velocemente.
GB

16
Qui sto davvero forzando una soluzione (e anche supponendo che ne esista una) e tu riesci a eludere l'intero problema! +1
orlp

14

Python 2, 225 byte, orlp

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

Suppongo di essere stato fortunato dopo aver indovinato divisori primi casuali tutto il giorno ...

(Il limite spot predefinito per c4.8xlarge è 4, ma sono riuscito a portarlo a 10 l'anno scorso. Ho dovuto modificare la configurazione FAAS da 16 slave a 6 (+3 mpi, 1 master). 20 poliselect, 12h 50m setacciamento, 2h 25 milioni di linoleum, 30 milioni di metri quadrati Costo totale ~ $ 70. Almeno @orlp è stato abbastanza carino da scegliere una dimensione risolvibile, ma non lo farò più! Grazie a @IlmariKaronen per l'ultimo passaggio, e sì sto scherzando sul indovinando: P)


Io ... cosa ... Ora mi sento male per costarti soldi :( Ho scelto intenzionalmente una dimensione che sarebbe ancora ragionevolmente piccola ma un costo troppo alto per attaccare. In realtà non pensavo che qualcuno avrebbe speso soldi per questo.
orlp

1
@orlp Ne vale assolutamente la pena come esperienza unica per me. Spero che le persone imparino qualcosa sulla sicurezza RSA a 512 bit in libertà da questo :)
Sp3000,

Questa è una vera dedizione al golf, spendendo non solo tempo ma denaro! Interessante notare che un utente malintenzionato potrebbe potenzialmente rompere RSA a 512 bit gratuitamente tramite le prove del servizio di calcolo cloud.
miglia

@miles Dovrei menzionare che AWS ha credito per gli studenti se qualcuno vuole provare, e non sarei sorpreso se altri servizi facessero lo stesso. Quindi probabilmente non sei lontano da quell'idea di prova, almeno per la prima volta. (Se qualcuno vuole provare però - assicurati di eliminare tutti i volumi, le AMI, ecc. Una volta che hai finito perché altrimenti ti verrà addebitato l'archiviazione)
Sp3000

11

Python 2, 83 byte, orlp

Originale:

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

Crepa:

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

Provalo online!

Cracking RSA eseguito da Wolfram Alpha . ;)


Ho appena realizzato che ~p*~qè decisamente più corto di -~p*-~q, oops.
orlp,

Ma come hai fatto a decodificare la (p*q-2*(p+q))/4parte? :)
orlp

Questa è stata la parte più difficile, vero? Fondamentalmente, conoscenza della funzione di Carmichael e del fatto che p/2ed q/2erano entrambi numeri primi dispari, e un mucchio di tentativi ed errori per trovare qualcosa che avrebbe funzionato usando i personaggi disponibili.
Ilmari Karonen,

Ho scelto intenzionalmente pe q(quelli veri, quelli nel codice sono p-1e q-1per scopi di golf) tali che (p-1)/2sono primi in modo che abbiamo φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). Questo ci consente di calcolare l'inverso modulare di 65537mod φ(pq)(ciò di cui abbiamo bisogno per RSA) usando l'identità di Eulero, rendendo la risposta molto più breve perché non abbiamo bisogno di implementare la logica inversa modulare o hardcode un'altra grande costante. A parte il -~q*-~p-> ~q*~p, hai trovato esattamente la mia funzione :)
orlp

1
In realtà, per scegliere un valore minore, credo φ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)per numeri primi sicuri pe q, perché φ(4) = 2. Ma λ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)è al massimo ((p-1)/2-1)((q-1)/2-1)/2, e qualsiasi multiplo, meno uno, farà per l'esponente. :)
Ilmari Karonen,

7

Python 3, 80 byte, Wolfram

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

Questo è stato davvero difficile da decifrare! Uso la libreria bisect , inclusa nella distribuzione di Python 3. La bisectfunzione accetta un elenco ordinato e un elemento e restituisce l'indice più a destra in cui è possibile inserire l'elemento per mantenere l'ordine. Gli diamo solo la qlista di quadrati dei quadrati a partire da 1e l'elemento q.


1
Stavo per suggerire che cambia (h+1)a -~h. Poi ho capito che non è questo il punto di questa sfida: P
ETHproductions

@ETHproductions Sarebbe comunque errato a causa della precedenza dell'operatore.
Sp3000,

@ Sp3000 Eh, non avevo idea che **avesse una precedenza maggiore rispetto ~a Python. Suppongo che sia meglio che in JS, in cui viene -~2**2generato un errore di sintassi ("un'espressione unaria non differenziata non può apparire sul lato sinistro di '**'").
ETHproductions

@ETHproductions In realtà lo hanno fatto per evitare ambiguità, che, come potrei aggiungere, è molto insolito per la maggior parte del design di JS.
Esolanging Fruit,

@ Challenger5 In realtà, non sarei in disaccordo con te lì: negli ultimi anni TC39 è stato estremamente attento a assicurarsi che tutte le nuove funzionalità aggiunte siano completamente prive di ambiguità (che include l' **operatore, aggiunto in ES2017)
ETHproductions

6

Javascript, 21 byte, Arnauld

Originale

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

Crepa

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

Restituisce la radice del cubo.


Ecco qua! ;)
Arnauld

@Arnauld: Trovo un po 'strano che JS ti permetta di chiamare funzioni con più argomenti di quelli per cui sono definiti. Mi chiedo quale sia il pensiero dietro quello.
Emigna,

6
Hai ragione, JS lo consente di progettazione. Gli argomenti extra non vengono completamente persi, poiché sono memorizzati nell'oggetto argomenti a cui è possibile accedere manualmente dalla funzione.
Arnauld,

5

7, 9 byte, ais523

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

Perché la forza bruta vince sempre e 9! è solo 362880


4

Processing.js, 59 byte, Kritixi Lithos

Originale:

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

Crepa:

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

Bene, è stato abbastanza facile. La parte più difficile è stata capire dove attaccare le virgole e gli asterischi extra. Fortunatamente, l'elaborazione sembra consentire parametri di funzione extra inutilizzati e espressioni virgola in stile C.


1
Apparentemente, l'interprete che ho collegato era sbagliato. In effetti, la maggior parte (o anche tutti) gli interpreti online probabilmente avranno torto poiché Processing-java viene pre-compilato in Processing.js. In questo momento, penso che il miglior modo di agire sia per me e per te cambiare le nostre risposte in "Processing.js" invece di Processing perché la tua risposta sarebbe valida (Processing-java fornisce tonnellate di errori). Invierò una risposta separata con lo stesso codice di Processing-Java, ma per questo l'interprete nido sarebbe installarlo da processing.org. Ben fatto comunque!
Kritixi Lithos,

4

JavaScript (ES6), 63 byte, SLuck49

Originale:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Crepa:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

Il codice base64 sopra decodifica in:



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

dove la ... sta per un mucchio di immondizia casuale che viene ignorata dall'interprete JS, poiché è in un commento.

Ho trovato questa soluzione per tentativi ed errori. Alla fine, l'unica parte davvero difficile erano le due nuove righe all'inizio del codice, necessarie per rendere la linea resto correttamente e per ottenere l' Min Matha Base64-codificare in qualcosa che era disponibile nel set di caratteri originali. Per prima cosa ho provato gli spazi, ma " M"base64-codifica "ICBN"e avevo bisogno dell'unica disponibile Bper codificare ".po"più avanti nel codice. "0+M", "1*M", "1?M"O altri simili prefissi no-op ho potuto pensare non funzionavano, ma a capo fatto.

Sospetto che questa potrebbe non essere esattamente la soluzione prevista, ma qualunque cosa funzioni. :)

demo:

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


Ottimo lavoro nel trovare qualcosa che ha funzionato, speravo che mettere i personaggi extra all'inizio avrebbe reso questo un po 'più difficile
SLuck49

Impressionante :) Ho adottato lo stesso identico approccio ma non pensavo di provare Newline. Stavo cercando di perdere una C altrove ma non andavo da nessuna parte.
Chris M,

3

Brain-Flak, 26 byte, Mago del grano

Originale (aggiunge 13)

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

Crack (sottrae 13)

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




3

JavaScript (ES6), 46 bytes, SLuck49

Original (calculates ln(x+1))

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

Crack

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

I never would have cracked this if I hadn't realized that the inverse is a Math built-in. (lg=19979699+55686).toString(9+25) is just a convoluted way of returning "expm1".


Nicely done! Yeah I was looking through the functions on Math to decide what to use, saw expm1, and said "Wait, that's a thing?"
SLuck49

2

J, 10 bytes, miles

1%:@*~>:[<

I have to write something here because the answer is too short.


2

J, 29 bytes, Zgarb

Original

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

Crack

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

Try it online!

Another crack equivalent is

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

Explanation

[:(](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

Yep, that works! It's a bit different from my solution, but there's a lot of leeway. The basic logic is the same though.
Zgarb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.