Decifrar o código-fonte


142

Nota : Este desafio está encerrado para novos envios de policiais. Isso é para garantir que ninguém possa postar envios que permaneçam ilegais porque não há mais ladrões interessados ​​no desafio.

Neste jogo de policiais e ladrões, cada policial escreverá um programa simples para fornecer uma única saída. Eles tornarão públicas quatro coisas sobre seu programa:

  1. O idioma
  2. A duração do programa
  3. A saída desejada
  4. Uma versão codificada do código-fonte

Em seguida, os ladrões devem decifrar o código-fonte para que seu programa funcione como o original.


Regras da polícia

Você deve escrever um programa simples, que os ladrões tentem recriar.

Seu programa original deve ter uma funcionalidade simples: após a execução, ele gera uma única string / número e pára. Ele deve fornecer a mesma saída, independentemente de quando / onde é executado, e não deve depender de bibliotecas extras ou da Internet.

Seu programa e saída devem usar ASCII imprimível (novas linhas e espaços permitidos). A saída deve ter no máximo 100 caracteres e o programa deve levar menos de 5 segundos para ser executado em uma máquina razoável. Você também não tem permissão para usar hash (ou outras funções criptográficas) em seu programa.

Em seguida, você fornece uma versão codificada do código-fonte e a saída necessária. Você pode embaralhar seu código-fonte da maneira que desejar, desde que os caracteres sejam conservados.

Sua pontuação é o programa mais curto que você enviou e que não foi quebrado. Após um período de uma semana, um envio sem rachaduras se tornará imune. Para reivindicar essa imunidade, edite sua resposta para mostrar a resposta correta. (Esclarecimento: Até que você revele a resposta, você não está imune e ainda pode ser quebrado.) A pontuação mais baixa vence.

Exemplo simples de respostas de policial

Perl, 20

ellir"lnto Wo d";prH

Hello World

Ou...

Perl, 15

*3i)xp3rn3*x3t(

272727

Regras de ladrão

Os ladrões postarão suas tentativas de cracking como respostas em um tópico separado, localizado aqui .

Você tem uma tentativa de quebrar cada envio. Sua tentativa de quebra será uma versão sem codificação do código-fonte. Se o seu palpite corresponder à descrição (mesmos caracteres, resultado e, é claro, o idioma), e você for o primeiro palpite correto, então ganhará um ponto. É importante observar que o seu programa não precisa corresponder exatamente ao original, basta usar os mesmos caracteres e ter a mesma funcionalidade. Isso significa que pode haver mais de uma resposta correta.

O ladrão com mais pontos (rachaduras bem-sucedidas) vence.

Respostas de ladrões de exemplo simples

O seu programa foi print "Hello World";. (Embora print"Hello World" ;também possa ter funcionado.)

Seu programa foi print(3**3x3)x3

Submissões seguras

  1. ASP / ASP.Net, 14 (Jamie Barker)
  2. Befunge-98, 15 (FireFly)
  3. GolfScript, 16 anos (Peter Taylor)
  4. CJam, 19 (DLosc)
  5. GolfScript, 20 (usuário23013)
  6. Perl, 21 (primo)
  7. Python, 23 (mbomb007)
  8. Ruby, 27 anos (histocrata)
  9. SAS, 28 (ConMan)
  10. Ruby, 29 (histocrata)
  11. Python, 30 (mbomb007)
  12. JavaScript, 31 (hsl)
  13. Ruby, 33 anos (histocrata)
  14. Marbelous, 37 (es1024)
  15. Ruby, 43 anos (histocrata)
  16. PHP, 44 (kenorb)
  17. Ruby, 45 (histocrata)
  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 (peixes enlameados)
  25. JavaScript, 68 (Jamie Barker)
  26. Mathematica, 73 (Arcinde)
  27. Haskell, 77 (proudhaskeller)
  28. Python, 90 (DLosc)
  29. C ++, 104 (usuário23013)
  30. ECMAScript 6, 116 (Mateon1)
  31. C ++ 11, 121 (es1024)
  32. Grass, 134 (usuário23013)
  33. PowerShell, 182 (christopherw)

Envios não resolvidos

Em ordem de horário da postagem. Esta lista é cortesia de muitos usuários.

Uma pequena ferramenta para verificar soluções, cortesia de n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳


4
@ xnor Sim, é isso que significa.
PhiNotPi

3
Você pode querer proibir hashing ... codegolf.stackexchange.com/questions/40304/...
NinjaBearMonkey

7
Você provavelmente deve especificar que o vencedor deve publicar o código fonte original após uma semana. O que me impede de publicar comentários sem sentido e afirmar que nenhum dos ladrões obteve a resposta certa?
precisa saber é o seguinte

62
Eu pensei "Oh, eu apenas escrevo um programa malbolge, embaralhe e ganhe essa coisa!". Mas então, tentei escrever um programa malbolge.
Rodolphito

8
Aviso: Policiais, não use o Ideone para testar seus envios, pois ele armazena seus programas e outras pessoas podem vê-los.
Rodolphito 6/11

Respostas:


65

Python 3, tamanho 74 ( rachado )

Python não era o mesmo depois de ser reeducado pelo Big Brother.

Entrada:

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

Existem duas novas linhas no final das linhas 1 e 2.

Resultado:

True
True
True

Observe que cada um Trueestá em sua própria linha.


1
O que há por trás da porta 101?
FryAmTheEggman

5
Originalmente, eu tinha 2+2==5uma quarta afirmação até descobrir que =era fácil demais.
Xnor

5
Nice 1984 reference.
7267 Justin

2
Rachado . Isso foi excelente.
Sp3000 #

52

Python 3, tamanho 12 ( rachado )

print (abcd)

Meu programa não produz saída nem erros.


4
Rachado . Bom, a solução é muito contra-intuitiva.
precisa saber é o seguinte

2
Muito bom, eu estava indo intpor um tempo.
Fox Wilson

@matsjoyce Muito bem feito. Essa foi a minha solução pretendida.
xnor

1
@matsjoyce Sim, eu esperava que alguém fizesse isso eventualmente. Ainda assim, encorajo todos a não se estragarem e a tentar resolvê-lo manualmente. Garanto-lhe que é uma solução fofa.
Xnor

Eu acho que entendi. A solução que encontrei não funcionará se eu digitar primeiro pythone depois digitar minha solução no prompt. Mas funciona, se eu colocar minha solução em um arquivo e tipo python file.
kasperd


26

Python 2, tamanho 50

Rachado

Já sabemos a resposta à pergunta, mas qual é a pergunta?

Código

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

Observe que não há espaços à direita ou novas linhas. O único caractere de espaço em branco é o espaço único depois print.

Resultado

42

Tentei equilibrar o comprimento e a dificuldade do código, mas não me surpreenderia se eu o perdesse um pouco. Espero que seja suficiente desencorajar a força bruta, pelo menos.



6
Este teria sido melhor com o tamanho 42.
um CVn

23

Pitão - 71 Rachado

Código

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

Resultado

3720

* Originalmente, George Lucas tinha Han interrompendo C3-PO. **

** Ele chamou isso de sua melhor idéia desde Jar-Jar.


Nota interessante: apesar de todas as mudanças pelas quais Pyth passou, ainda há uma resposta válida aqui!


Original

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

Explicação

Os caracteres restantes vão para a próxima linha. Pyth interpreta apenas a primeira linha de um arquivo.

ts,faça uma tupla de 2 e obtenha a soma -1.
*multiplicar:
s,y30 l"..."soma a tupla 2 que contém 2 * 30 e o comprimento da string (18).
eP-C"h"Tobtenha o maior fator primo do valor ascii de h menos 10 (47).
srhTobtenha a soma dos números de 0 a 10.

No geral, isso basicamente calcula: (30 * 2 + 18) * (47) + 55-1. Depois de ler a resposta de @ isaacg, notei que existe uma solução extremamente simples: *h30tC"y"31 * 120.

Atualizada

*h30tC"y" "-P:Sir, e possibilit,...
Han Solo: Never Tell Me The Odds!"
Ainda funciona mesmo depois de todo esse tempo ...

Desculpem a formatação da explicação deficiente, não sei como usar blocos de spoiler: S (o @ Sp3000 tornou um pouco melhor para você)

Agora você pode executar o Pyth online! Experimente aqui. Obrigado @isaacg :)


9
O texto acima pode conter informações ostensivamente inventadas sobre a criação de Guerra nas Estrelas.
FryAmTheEggman


@FryAmTheEggman Você pode usar tags em blocos, por exemplo<br>
Sp3000 7/14

21

CJam, tamanho 51 [SEGURO]

Código

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

Resultado

55
2292213229222231957511222223333751125537511222222135723331131931959319319

Você pode brincar com isso no intérprete online .

Isso deve ser mais quebrável do que parece.

Sugestão

Comece com a segunda linha da saída. Alguns dígitos não aparecem em tudo e outros com desconfiança. Por que poderia ser isso? Se você puder decifrar isso, o resto quase cairá no lugar.

Solução

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

O tempo deve ter ficado muito ruim quando descobri esse anagrama ...

A dica deveria apontar para o fato de que a segunda linha é composta de fatorações primárias esmagadas. Eu esperava que, a partir daí, fosse possível determinar quantos e quais caracteres serão inseridos na string, deixando apenas alguns caracteres no final.


9
Espera, isso está embaralhado ???
TheDoctor

18

Befunge-98, tamanho 15 [SEGURO]

Código

"quick"
*+.@\_j

Resultado

3314

Original

"u_ji@q.+k*c
"
Uma característica curiosa, mas um tanto conhecida do Befunge, é que você pode finalizar uma string com a mesma citação que a inicia, o que em essência empurra toda a linha (exceto a citação) na pilha. Como um truque extra, reutilizo a mesma string novamente , usando-o upara reverter o ponteiro de instruções. Então é apenas uma aritmética: a idéia central é resumir todos esses valores (o que é feito kpara repetir a +operação).


Em quais intérpretes você o testou e, em particular, que suposições eles fazem sobre a largura de bit da célula?
Peter Taylor

@ PeterTaylor Eu testei no cfunge sob x86_64 linux. Alguns testes parecem indicar que ele usa números inteiros assinados de 64 bits, embora eu possa dizer que minha solução não depende da semântica de estouro, então não tenho certeza se isso importa.
FireFly

Ok, então eu não deveria estar procurando estouros de 8 bits. Vergonha, que poderia ter simplificado it;)
Peter Taylor

Ugh. Fiz programas para imprimir 3312, 3300e vários outros perto 3314. Tão perto ...
Justin

@Quincunx excellent ...: P
FireFly

16

GolfScript (16 bytes) [SEGURO]

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

Saída esperada:

-117345085515973157874551915956356303213327583847247840186528288852476459638212404362749

Fonte original:

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


Esta saída esperada exclui a nova linha à direita ou a nova linha simplesmente não será emitida?
precisa

@ProgramFOX, a saída terminará em uma nova linha. As únicas maneiras que conheço de evitar isso exigiriam :.
Peter Taylor


13

Python, 69 caracteres [ cracked by grc ]

Mexidos:

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

Resultado:

1083

Este é apenas um pouco de diversão inofensiva :) Testado no CPython 2.7.8, 3.3.2 e no PyPy3 2.3.1.


Explicação

Usa funções embutidas str, dict, listpara construir uma cadeia e, em seguida, aplica-se mapcom ordpara converter a string para uma lista de inteiros, que são então summed.




11

Python 3, 70 caracteres

Mexidos:

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

Saída (99 caracteres):

388626024960000000000026872002432000000000000676169243200000000000007317718780000000000000028820330

Atualizar

Já faz uma semana, então, em vez de postar a resposta, aqui está uma dica:

Tente pegar a raiz quadrada do número e trabalhar a partir daí



9

JavaScript, 94 rachado por FireFly

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

Resultado

fun in the sun

Original

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


Sinto que isso não funcionará em todos os navegadores / mecanismos. Em que ambiente você testou isso?
10138 Martin Ender


Ah ... e eu estava convencido de que você tinha alertprimeiro, já que os índices combinavam muito bem com os caracteres necessários. Interessante coincidência.
FireFly

Na verdade, eu também o tive primeiro quando comecei a trabalhar nele, mas mudei para reduzir as diferenças do navegador.
SLuck49

Não funciona no Chrome. Eu tenho a versão mais recente. DizSyntax Error: Unexpected String
Oliver Ni


7

Python 3, tamanho 16 ( rachado )

Código:

help tim__rolo__

Saída (com nova linha no final):

Hello world!


1
@ MartinBüttner Eu sabia que alguém tenha visto o ovo de páscoa ...
matsjoyce

1
Eu não tinha, mas fui rápido no google. ;) Para ser honesto, se eu não estivesse com tanta pressa, provavelmente poderia ter visto que os personagens restantes helloeram um anagrama de import. ^^
Martin Ender

7

Perl - 47 ( cracked by grc )

Código (também há um espaço)

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

Resultado:

012345012345012345012345012345

Você pode executá-lo on-line aqui e funciona sob stricte warnings.



@grc Eu diria que é válido! Bom trabalho! Imprime a coisa certa. Se você quiser algumas dicas sobre a versão que é executada em baixo stricte warningsme avise.
hmatt1

7

Ruby, 33 - decifrado pelo usuário23013

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

Resultado:

[*]

Original:

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


Qual versão é essa?
Lynn

@ nooodl Eu tenho 1.9.3, mas não há nada específico da versão sobre este.
Maçaneta da porta

Isso é difícil. Aqui está o que eu tenho até agora: puts obviamente será a primeira coisa a existir, .nextoutra palavra-chave que pode ser usada, e o resto é algum tipo de feitiçaria com $variáveis ruby e criação de array de caracteres ... +1
rodolphito


@ user23013 Nice! Não é o original; Eu provavelmente deveria ter caracteres de saída que não estavam realmente na fonte;)
Maçaneta da porta

7

Python2, 132 caracteres

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

Saída (com uma nova linha):

chance

Versão atualizada, 96 caracteres

Resposta à versão original sugerida em execvez de compile+ eval, então aqui está uma versão simplificada:

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

Atualização: rachado

Totalmente rachado por Alex Van Liew e KennyTM . As soluções originais foram (role para a direita para revelar o 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".

Quantas novas linhas existem?
SP3000

Nenhuma (sem contar novas linhas lógicas, como \nliterais de strings internas). Com as novas linhas, o código pode ser menor.
Vi.

2
+1 para não dar suficiente xs e cs para eu fazer o que eu quero fazer: P
SP3000

1
Devo pensar em alguma dica? Vamos começar com um vago: Don't count ones which exist. Count ones which do not exist.
Vi.


7

Ruby, 29 [seguro]

Tentando ver o quão curto eu consigo entrar em Ruby sem ser rachado.

Código

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

Resultado

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

Original

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

Explicação

A primeira linha cria um heredoc que inicia na próxima linha e é delimitado pela direita p, depois concatena a string resultante para si mesma 8 vezes. Como termina em uma nova linha, isso efetivamente cria um loop. O código em loop atribui uma matriz à variável o, composta pelos elementos em o.to_a(via *atalho), seguida pela saída de $<.write(o), que converte está vazia e a gravação não produz nada e retorna 0. Cada rodada subsequente gera a matriz de bytes na saída anterior. rodadas. O uso de um heredoc delimitado por p cria métodos de isca para saída e , nos caracteres embaralhados, isso não funcionará porque você precisa do número de bytes.o em uma string, imprime em STDOUT e retorna o número de bytes impressos. Uma variável atribuída pela primeira vez tem nilcomo objetivo avaliar o lado direito, portanto, na primeira execução*op$><<


6

PHP, tamanho 49 [ Rachado por Martin Büttner ]

Código

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

Resultado

{main}

Você se importaria de divulgar com qual versão PHP você testou isso?
Martin Ender

@ MartinBüttner Não especificarei o intervalo exato, mas tudo a partir da versão 5.3.0 terá o resultado correto.
bwoebi

3
Rachado. Só tomou como ... 4 horas ...
Martin Ender

@ MartinBüttner uau, parabéns! Não esperava que você não desistisse. :-)
bwoebi



6

Haskell, 100 caracteres (inválido, saída muito longa)

Código

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

Resultado:

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


Original

(#)=(>);(//)=(++)
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
Pensei por um momento que estava lendo a pergunta "Evolution of Hello World" .
Vi.

1
@ Vi sim, mas acho que a distância de Levenshtein é um pouquinho maior que 7 neste post.
Zaq 5/11

1
A saída é superior a 100 caracteres
Lynn

1
@Zaq: a limitação de tamanho não está no tamanho do código, está na saída!
Lynn

1
Hã. E eu acho que você fez alguma coisa fix show. Definitivamente
invencível

6

J, 22 bytes

Código

!%()1348:::bbceehorvxx

Saída (97 caracteres)

1226317306651180983274420265228191056569220222873505571155987454033425908908110103433163350999040

Eu espero que isso seja praticamente impossível ...


6

CJam, 32 bytes ( quebrado )

Fonte mexida

"Beware the Jabberwock, my son!"

Resultado

4074552392882954617076720538102062920

2
Hum, de onde você tirou a ideia de usar uma citação como código CJam codificado? ;)
Martin Enders


@ MartinBüttner: Essa é uma linha de um poema, não uma citação de filme. Inteiramente diferente!
Dennis

@ Dennis Espere, o meu também não era de um filme. (Não é exatamente a partir de um poema , embora: D.)
Martin Ender


5

TinyMUSH 3.1 , 20

Mexidos:

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

Resultado:

3210

6
Como devemos executar isso? Onde está a referência de idioma? (O link não ajuda aqui).
N

3
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀h Você pode executar este código conectando-se a um MUSH executando a versão apropriada do TinyMUSH. Navegue aqui para encontrar um em que Tipo de servidor seja "MUSH" ou faça o download da fonte do servidor a partir daqui e execute você mesmo um MUSH.
6114 Muqo

5

Python 3, comprimento 110 [ cracked by grc ]

Mexidos ( \ndenota uma nova linha)

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

Resultado:

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

Aqui está outro divertido - não destinado a ser difícil, mas apenas algo incomum e confuso. :)


Explicação

As palavras de aparência aleatória são retiradas do Zen of Python (PEP 20), que é impresso automaticamente através do ovo da páscoa import this. A passagem é apenas toda nona palavra, como sugerido pelo 9::[]presente.
Para extrair cada nona palavra sem imprimir automaticamente a passagem ao importar, redirecionamos sys.stdoutpara a StringIO().



5

Javascript, 29 - Rachado

Executar em um console do navegador Chrome

Código

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

Resultado

181

Código original

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.