Decodifica il codice sorgente


142

Nota : questa sfida è ora chiusa ai nuovi invii di poliziotti. Questo per garantire che nessuno possa pubblicare invii che rimangono non crackati perché non ci sono più abbastanza rapinatori interessati alla sfida.

In questo gioco di poliziotti e ladri, ogni poliziotto scriverà un semplice programma per dare un singolo output. Quindi pubblicheranno quattro cose sul loro programma:

  1. La lingua
  2. La durata del programma
  3. L'output desiderato
  4. Una versione rimescolata del codice sorgente

Quindi, i ladri devono decodificare il codice sorgente in modo che il loro programma funzioni come l'originale.


Regole della polizia

Devi scrivere un semplice programma, che i ladri proveranno a ricreare.

Il tuo programma originale deve avere una semplice funzionalità: durante l'esecuzione, emette una singola stringa / numero e si ferma. Dovrebbe fornire lo stesso output indipendentemente da quando / dove viene eseguito e non dovrebbe dipendere da librerie aggiuntive o da Internet.

Il programma e l'output devono utilizzare ASCII stampabile (nuove righe e spazi consentiti). L'output non deve contenere più di 100 caratteri e il programma dovrebbe impiegare meno di circa 5 secondi per essere eseguito su una macchina ragionevole. Inoltre, non è consentito utilizzare l'hash (o altre funzioni crittografiche) nel programma

Quindi, si fornisce una versione codificata del codice sorgente e dell'output richiesto. Puoi confondere il tuo codice sorgente come preferisci, purché i caratteri siano conservati.

Il tuo punteggio è il programma più breve che hai inviato che non è stato crackato. Dopo un periodo di una settimana, un invio non crackato diventerà immune. Per richiedere questa immunità, è necessario modificare la risposta per mostrare la risposta corretta. (Chiarimento: fino a quando non si rivela la risposta, non si è immuni e si può ancora crackare.) Il punteggio più basso vince.

Risposte Cop semplici di esempio

Perl, 20 anni

ellir"lnto Wo d";prH

Hello World

O...

Perl, 15

*3i)xp3rn3*x3t(

272727

Regole rapinatore

I ladri pubblicheranno i loro tentativi di cracking come risposte in un thread separato, che si trova qui .

Hai un tentativo di decifrare ogni invio. Il tuo tentativo di cracking sarà una versione decodificata del codice sorgente. Se la tua ipotesi corrisponde alla descrizione (stessi caratteri, output e ovviamente lingua) e sei la prima ipotesi corretta, allora vinci un punto. È importante notare che il programma non deve corrispondere esattamente all'originale, utilizzare semplicemente gli stessi caratteri e avere le stesse funzionalità. Ciò significa che potrebbe esserci più di una risposta corretta.

Vince il ladro con il maggior numero di punti (incrinature riuscite).

Risposte rapinatrici di esempio semplici

Il tuo programma era print "Hello World";. (Anche se print"Hello World" ;avrebbe potuto funzionare anche.)

Il tuo programma era print(3**3x3)x3

Invio sicuro

  1. ASP / ASP.Net, 14 (Jamie Barker)
  2. Befunge-98, 15 (FireFly)
  3. GolfScript, 16 (Peter Taylor)
  4. CJam, 19 (DLosc)
  5. GolfScript, 20 (utente23013)
  6. Perl, 21 (primo)
  7. Python, 23 (mbomb007)
  8. Ruby, 27 (istocratico)
  9. SAS, 28 (ConMan)
  10. Ruby, 29 (istocratico)
  11. Python, 30 (mbomb007)
  12. JavaScript, 31 (hsl)
  13. Ruby, 33 (istocratico)
  14. Marbelous, 37 (es1024)
  15. Ruby, 43 (istocratico)
  16. PHP, 44 (kenorb)
  17. Ruby, 45 (istocratico)
  18. Marbelous, 45 (es1024)
  19. Python 2, 45 (Emil)
  20. PHP, 46 (Ismael Miguel)
  21. Haskell, 48 (nooodl)
  22. Python, 51 (DLosc)
  23. Python, 60 (Sp3000)
  24. Python 2, 62 (pesce fangoso)
  25. JavaScript, 68 (Jamie Barker)
  26. Mathematica, 73 (Arcinde)
  27. Haskell, 77 (proudhaskeller)
  28. Python, 90 (DLosc)
  29. C ++, 104 (utente23013)
  30. ECMAScript 6, 116 (Mateon1)
  31. C ++ 11, 121 (es1024)
  32. Grass, 134 (user23013)
  33. PowerShell, 182 (christopherw)

Argomenti irrisolti

In ordine di tempo di pubblicazione. Questa lista è stata gentilmente concessa da molti utenti.

Un piccolo strumento per verificare le soluzioni, per gentile concessione di n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳


4
@xnor Sì, questo è ciò che significa.
PhiNotPi

3
Potresti voler proibire l'hashing ... codegolf.stackexchange.com/questions/40304/…
NinjaBearMonkey

7
Probabilmente dovresti specificare che il vincitore deve pubblicare il codice sorgente originale dopo una settimana. Cosa mi impedisce di postare incomprensibilmente e sostenere che nessuno dei ladri ha avuto la risposta giusta?
user2023861

62
Ho pensato "Oh, sto solo scrivendo un programma di malbolge, mescolalo e vinci questa cosa!". Ma poi, ho provato a scrivere un programma di malbolge.
Rodolphito,

8
Attenzione: poliziotti, non usare Ideone per testare i tuoi invii, in quanto memorizza i tuoi programmi e altre persone possono vederli.
Rodolphito,

Risposte:


65

Python 3, taglia 74 ( Cracked )

Python non era più lo stesso dopo essere stato rieducato dal Grande Fratello.

Ingresso:

print(war is peace)
print(freedom is slavery)
print(ignorance is strength)

Ci sono due newline alla fine delle righe 1 e 2.

Produzione:

True
True
True

Si noti che ognuno Trueè nella propria riga.


1
Cosa c'è dietro la porta 101?
FryAmTheEggman,

5
Inizialmente avevo 2+2==5una quarta affermazione fino a quando non ho scoperto che la =rendeva troppo facile.
xnor

5
Nizza riferimento 1984.
Justin

2
Cracked . È stato eccellente.
Sp3000,

52

Python 3, taglia 12 ( Cracked )

print (abcd)

Il mio programma non produce output né errori.


4
Cracked . Bene, la soluzione è molto intuitiva.
matsjoyce,

2
Molto bello, ci andavo intda un po '.
Fox Wilson,

@matsjoyce Ben fatto. Questa era la mia soluzione prevista.
xnor

1
@matsjoyce Sì, mi aspettavo che qualcuno lo facesse alla fine. Tuttavia, incoraggio tutti a non viziarsi e provare a risolverlo a mano. Ti assicuro che è una soluzione carina.
xnor

Penso di averlo capito. La soluzione che ho trovato non funziona se prima digito pythone quindi digito la mia soluzione al prompt. Ma funziona, se inserisco la mia soluzione in un file e digito python file.
Kasperd,


26

Python 2, taglia 50

screpolato

Conosciamo già la risposta alla domanda, ma qual è la domanda?

Codice

print *********************--///222222222222222222

Si noti che non ci sono spazi finali o nuove righe. L'unico carattere di spazio bianco è il singolo spazio dopo print.

Produzione

42

Ho tentato di bilanciare lunghezza e difficoltà del codice, ma non mi sorprenderebbe se lo perdessi un po 'in entrambi i modi. Speriamo che sia sufficiente a scoraggiare la forza bruta, almeno.



6
Sarebbe stato meglio con la taglia 42.
un CVn

23

Pyth - 71 Cracked

Codice

C-3P0: "Sir, the possibility,..."* 
Han Solo: "Never Tell Me The Odds!"

Produzione

3720

* Inizialmente, George Lucas aveva interrotto Han C3-PO. **

** Ha chiamato questa la sua più grande idea da Jar-Jar.


Nota interessante: nonostante tutti i cambiamenti che Pyth ha subito, qui c'è ancora una risposta valida!


Originale

ts,*s,y30 l" : : i i Han Solo "eP-C"h"TsrhT

Spiegazione

I personaggi rimanenti passano alla riga successiva. Pyth interpreta solo la prima riga di un file.

ts,fai una 2-tupla e ottieni la loro somma -1.
*moltiplica:
s,y30 l"..."somma la 2-tupla contenente 2 * 30 e la lunghezza della stringa (18).
eP-C"h"Tottiene il fattore primo più grande del valore ascii di h meno 10 (47).
srhTottenere la somma dei numeri da 0 a 10.

Tutto sommato, questo in pratica calcola solo: (30 * 2 + 18) * (47) + 55-1. Dopo aver letto la risposta di @ isaacg ho notato che esiste una soluzione estremamente semplice: *h30tC"y"31 * 120.

aggiornato

*h30tC"y" "-P:Sir, e possibilit,...
Han Solo: Never Tell Me The Odds!"
Funziona ancora anche dopo tutto questo tempo ...

Ci scusiamo per la scarsa formattazione delle spiegazioni, non so come usare i blocchi dello spoiler: S (@ Sp3000 ha reso un po 'più bello per te, però)

Ora puoi eseguire Pyth online! Provalo qui. Grazie @isaacg :)


9
Quanto sopra può contenere informazioni palesemente inventate sulla creazione di Star-Wars.
FryAmTheEggman,


@FryAmTheEggman Puoi usare i tag in blocchi, ad es.<br>
Sp3000,

21

CJam, taglia 51 [SICURO]

Codice

main(int argc,char* argv){printf("Hello, World!");}

Produzione

55
2292213229222231957511222223333751125537511222222135723331131931959319319

Puoi giocarci con l'interprete online .

Questo dovrebbe essere più crackabile di quanto sembri.

Suggerimento

Inizia con la seconda riga dell'output. Alcune cifre non compaiono in tutto, e altre spesso sospettosamente. Perché potrebbe essere? Se riesci a decifrarlo, il resto dovrebbe quasi andare a posto.

Soluzione

"that rrrrraging london Hail!v"{elccimf(;W))},(*,pa

Il tempo deve essere stato piuttosto brutto quando mi è venuta in mente quell'anagramma ...

Il suggerimento avrebbe dovuto indicare il fatto che la seconda riga è composta da fattori primi scomposti. Speravo che da lì sarebbe stato possibile determinare quanti e quali personaggi entrassero nella stringa, lasciando solo pochi caratteri alla fine.


9
Aspetta questo è strapazzato ???
TheDoctor

18

Befunge-98, taglia 15 [SICURO]

Codice

"quick"
*+.@\_j

Produzione

3314

Originale

"u_ji@q.+k*c
"
Una caratteristica curiosa ma piuttosto nota di Befunge è che puoi terminare una stringa con la stessa virgoletta che la inizia, il che in sostanza spinge l'intera linea (tranne la citazione) nello stack. Come un trucco in più, ho ri-uso la stessa stringa ancora una volta , facendo uso di uper invertire il puntatore all'istruzione. Quindi è solo un po 'aritmetica: l'idea di base è riassumere tutti quei valori (che viene fatto usando kper ripetere l' +operazione).


Su quale interprete hai provato, e in particolare su quali ipotesi fanno riguardo alla larghezza di bit delle celle?
Peter Taylor,

@PeterTaylor L'ho provato su cfunge in Linux x86_64. Alcuni test sembrano indicare che utilizza numeri interi a 64 bit con segno, anche se posso dire che la mia soluzione non dipende dalla semantica di overflow, quindi non sono sicuro che sia importante.
FireFly

Ok, quindi non dovrei cercare overflow a 8 bit. Peccato, questo potrebbe averlo semplificato;)
Peter Taylor,

Ugh. Ho fatto programmi per la stampa 3312, 3300e molti altri nelle vicinanze 3314. Così vicino ...
Giustino,

@Quincunx excellent ...: P
FireFly

16

GolfScript (16 byte) [SICURO]

%%()*../1129n{}~

Uscita prevista:

-117345085515973157874551915956356303213327583847247840186528288852476459638212404362749

Fonte originale:

n)~{.*911%(}./2%


Questo output atteso esclude la nuova riga finale o la nuova riga non verrà semplicemente emessa?
Programma FOX

@ProgramFOX, l'output terminerà con una nuova riga. Gli unici modi che conosco per evitare ciò richiederebbero :.
Peter Taylor,


13

Python, 69 caratteri [ crackato da GRC ]

Strapazzate:

((((((((((((())))))))))))),,,,accdddiiiiillmmnopprrrrrssssssttttttttu

Produzione:

1083

Questo è solo un innocuo divertimento :) Testato su CPython 2.7.8, 3.3.2 e per diamine PyPy3 2.3.1.


Spiegazione

Utilizza funzioni built-in str, dict, listper costruire una stringa e poi si applica mapcon ordper convertire la stringa a un elenco di numeri interi, che vengono poi summed.




11

Python 3, 70 caratteri

Strapazzate:

""(((())))****++++222222222;;;;;=======cccccccccceeeiinnpprrttxxxxxxxx

Output (lungo 99 caratteri):

388626024960000000000026872002432000000000000676169243200000000000007317718780000000000000028820330

Aggiornare

È passata una settimana, quindi piuttosto che pubblicare la risposta, ecco un suggerimento:

Prova a prendere la radice quadrata del numero e a lavorare da lì



9

JavaScript, 94 incrinato da FireFly

alert(' '' '''((()))+++,,,,,,,,,,,,,000111111114444577888;;;;;======[[[]]]aaafhinorrrrvvvxx||)

Produzione

fun in the sun

Originale

a=alert;v='';r=[1,7,8,14,11,8,14,10,0,5,14,4,7,8];for(x in r)v+=('h'+(1==0)+a)[r[x]]||'';a(v);


Ho la sensazione, questo non funzionerà in tutti i browser / motori. In quale ambiente hai provato questo?
Martin Ender,


Oh ... e io ero convinto che tu lo fossi alertprima, dato che gli indici corrispondevano così bene ai personaggi necessari. Coincidenza interessante.
FireFly,

In realtà l'ho avuto anche io quando ho iniziato a lavorarci, ma l'ho modificato per ridurre le differenze del browser.
SLuck49

Non funziona su Chrome. Ho l'ultima versione. DiceSyntax Error: Unexpected String
Oliver Ni l'

8

Ruby, 38 anni - incrinato da Martin Büttner

print(succ(downcase!))$$$..[[]]6e0<><_

Produzione:

u

Originale:

$6.pincdwnca[]rescue$><<$!.to_s[((0))]



1
@ MartinBüttner Heh, da nessuna parte vicino l'originale. Ma la tua soluzione è forse ancora più terrificante dell'originale. ;)
Maniglia della porta

1
Ehi, c'è un pesce
TheDoctor,

Quindi le printe downcase!erano aringhe rosse. Mi aspettavo che la risposta usasse puts, non ci ho pensato $><<.
kernigh,

7

Python 3, taglia 16 ( Cracked )

Codice:

help tim__rolo__

Output (con newline alla fine):

Hello world!


1
@ MartinBüttner Sapevo che qualcuno ha visto l'uovo di Pasqua ...
matsjoyce,

1
Non l'ho fatto, ma sono stato veloce a cercarlo su Google. ;) Ad essere onesti, se non avessi avuto tanta fretta, probabilmente avrei potuto vedere che i personaggi rimanenti dopo helloerano un anagramma di import. ^^
Martin Ender,

7

Perl - 47 ( crackato da grc )

Codice (c'è anche uno spazio)

 """"$$$$$$((()))**....///;;[[]]~==01finoprrstx

Produzione:

012345012345012345012345012345

Puoi eseguirlo online qui e funziona sotto stricte warnings.



@grc Direi che è valido! Bel lavoro! Stampa la cosa giusta. Se vuoi alcuni suggerimenti sulla versione che funziona sotto stricte warningsfammi sapere.
hmatt1,

7

Ruby, 33 - crackato dall'utente23013

enpsttux [[[]]]++\-\**????$$$$...

Produzione:

[*]

Originale:

puts ?[+[*?*..?]][$$-$$]+?\\.next


Quale versione è questa?
Lynn,

@nooodl Ho 1.9.3, ma non c'è nulla di specifico per questa versione.
Maniglia della porta

Questo è difficile. Ecco quello che ho finora: puts ovviamente sarà la prima cosa lì, .nextè un'altra parola chiave che può essere utilizzata, e il resto è una sorta di stregoneria con $variabili ruby e creazione di array di caratteri .... +1
rodolphito


@ user23013 Nice! Non l'originale, però; Probabilmente dovrei avere dei caratteri di output che in realtà non erano nella fonte;)
Maniglia della porta

7

Python2, 132 caratteri

____        ,,,,:::''""""""""""((()))[[]]\\\0126aaaabcccceeeeeeeeeEffggiiiiiilllllmmmmnnnnnnooooopppppqqrrrrrrrrrssssStttttttuuvxxyy

Output (con una nuova riga):

chance

Versione aggiornata, 96 caratteri

La risposta alla versione originale ha suggerito execinvece di compile+ eval, quindi ecco una versione semplificata:

____       :::''""(())[[]]\\\0126aaabcccceeeeeeeeEffiimmnnnnooopppqqrrrrrrrrrssStttttttuuxxxxyy

Aggiornamento: rotto

Completamente crackato da Alex Van Liew e KennyTM . Le soluzioni originali erano (scorrere verso destra per rivelare lo spoiler):

                                                                                                                                eval(compile('try: compile("from __future__ import braces","","single")\nexcept SyntaxError as q:\n\tprint q[0][6:12]',"","single"))
                                                                                                                                exec('try:exec("from __future__ import braces")\nexcept SyntaxError as q:\n\tprint q[0][6:12]')
                                                                                                                                The hint meant "Consider {}, which are not present in the source code".

Quante newline ci sono?
Sp3000,

Nessuno (senza contare le newline logiche come i \nletterali di stringhe interne). Con le newline il codice potrebbe essere più breve.
Vi.

2
+1 per non dare abbastanza xs e cs per me di fare quello che voglio fare: P
SP3000

1
Devo pensare a qualche suggerimento? Cominciamo con un vago: Don't count ones which exist. Count ones which do not exist.
Vi.


7

Ruby, 29 [sicuro]

Sto provando a vedere quanto riesco a ottenere in Ruby senza essere rotto.

Codice

paper view
otool
$()**,.8<<=>

Produzione

[0][0, 3][0, 3, 6][0, 3, 6, 9][0, 3, 6, 9, 12][0, 3, 6, 9, 12, 16][0, 3, 6, 9, 12, 16, 20]

Originale

eval <<p*8 o=*o,$>.write(o) p

Spiegazione

La prima riga crea un ereditario che inizia sulla riga successiva ed è delimitato dal finale p, quindi concatena la stringa risultante a se stessa 8 volte. Dal momento che termina con una nuova riga, questo crea effettivamente un ciclo. Il codice in loop assegna un array alla variabile o, costituito dagli elementi in o.to_a(tramite la *scorciatoia), seguito dall'output di $<.write(o), che converte oin una stringa, lo stampa in STDOUT e restituisce il numero di byte stampati. Una variabile assegnata per la prima volta ha nillo scopo di valutare il lato destro, quindi alla prima esecuzione*oè vuoto e non scrive nulla e restituisce 0. Ogni round successivo genera l'array di byte emesso nei round precedenti. L'uso di un heredoc delimitato da p crea metodi di richiamo per l'output pe $><<, nei caratteri criptati, che non funzionerà perché è necessario il bytecount.


6

PHP, taglia 49 [ Cracked di Martin Büttner ]

Codice

sub(print2w, $+expect+$+one+$+str+$+in=$@~main$);

Produzione

{main}

Ti dispiacerebbe rivelare con quale versione di PHP hai provato questo?
Martin Ender,

@ MartinBüttner Non specificherò l'intervallo esatto, ma tutto dalla versione 5.3.0 in su avrà il risultato corretto.
bwoebi,

3
Cracked. Ci sono voluti solo ... 4 ore ...
Martin Ender il

@ MartinBüttner Eeeek !!!, complimenti! Non mi aspettavo che non ti arrendessi. :-)
bwoebi,



6

Haskell, 100 caratteri (non valido, output troppo lungo)

Codice

//Sup
tl=[]
while(syn==(+j)) tl+=b.a();
//(: #jquery :)\\
$("#jquery").on("click", j=>alert(j==m))

Produzione:

"\er\\e\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\


Originale

(#)=(>);(//)=(++)
l=j.show
main=putStr.l.l$l"eer"
j[]="\\"
j(y:u)=let(q,c)=break(#y)u in y:j c//j q

5
Per un momento ho pensato di leggere la domanda "Evolution of Hello World" .
Vi.

1
@Vi sì, ma penso che la distanza di Levenshtein sia un po 'più di 7 in questo post.
Zaq,

1
L'output è più lungo di 100 caratteri
Lynn

1
@Zaq: la limitazione della dimensione non è sulla dimensione del codice, ma sull'output!
Lynn,

1
Huh. E immagino che tu abbia fatto qualcosa con fix show. Sicuramente uncrackable
orgogliosi haskeller

6

J, 22 byte

Codice

!%()1348:::bbceehorvxx

Output (97 caratteri)

1226317306651180983274420265228191056569220222873505571155987454033425908908110103433163350999040

Mi aspetto che questo sia praticamente impossibile ...


6

CJam, 32 byte ( crackato )

Fonte criptata

"Beware the Jabberwock, my son!"

Produzione

4074552392882954617076720538102062920

2
Hm, da dove ti è venuta l'idea di usare una citazione come codice CJam criptato. ;)
Martin Ender,


@ MartinBüttner: questa è una frase di una poesia, non una citazione di un film. Totalmente diverso!
Dennis,

@Dennis Aspetta, il mio non era neanche di un film. (Non esattamente da una poesia , però.: D)
Martin Ender,


5

TinyMUSH 3.1 , 20

Strapazzate:

(#ret,#3!#+#2i\2#,@)

Produzione:

3210

6
Come dovremmo eseguire questo? Dov'è il riferimento linguistico? (Il link non aiuta qui).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

3
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀h Puoi eseguire questo codice collegandoti a un MUSH che esegue la versione TinyMUSH appropriata. Sfoglia qui per trovarne uno in cui Tipo di server è "MUSH", oppure scarica la sorgente del server da qui ed esegui un MUSH da solo.
Muqo,

5

Python 3, lunghezza 110 [ crackato da grc ]

Scrambled ( \nindica una nuova riga)

\n\n\n   ""((((())))),.......9::;===IOS[]__addeeegghiiiiiiiiijllmmnnoooooooppprrrrsssssssssstttttttttttuuuuuvwyyy

Produzione:

The better is Flat dense. break never of be do at never. If bad it honking

Eccone un altro divertente - non destinato ad essere difficile, ma solo qualcosa di insolito e perplesso. :)


Spiegazione

Le parole dall'aspetto casuale sono tratte dallo Zen di Python (PEP 20), che viene automaticamente stampato tramite l'uovo di Pasqua import this. Il passaggio è solo ogni nona parola, come suggerisce il 9::[]presente.
Per estrarre ogni nona parola senza stampare automaticamente il passaggio durante l'importazione, reindirizziamo sys.stdouta StringIO().



5

Javascript, 29 - Cracked

Esegui in una console del browser Chrome

Codice

23*47,(no,(.][j,i|i,j][.),on)

Produzione

181

Codice originale

[,,,].join(3)|[,4,].join(7)*2


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.