Este é um quebra - cabeça de policiais e ladrões, o fio dos ladrões pode ser encontrado aqui .
Sua tarefa será escrever dois programas (ou funções), de modo que eles sejam anagramas um do outro e um execute o inverso esquerdo do outro. Esses programas podem aceitar e gerar quantos números inteiros ou complexos forem desejados. Se você escolher pegar números como pontos de caráter ou qualquer outro meio razoável, deverá indicar que está fazendo isso em sua resposta. Se você optar por restringir o domínio de sua função, também deverá indicar o domínio restrito em sua resposta.
Você apresentará o primeiro programa na forma de uma resposta com o inverso esquerdo oculto para os ladrões encontrarem.
O programa mostrado deve implementar uma função injetiva (caso contrário, seria impossível a existência de uma resposta oculta).
Se sua resposta não tiver sido quebrada em uma semana, você poderá revelar a resposta oculta e marcá-la como segura . Respostas seguras não podem ser decifradas por ladrões e permanecerão desatualizadas indefinidamente.
O objetivo será criar a resposta mais curta e sem quebra em bytes.
Exemplo
Você pode mostrar o seguinte programa python que adiciona um à entrada
lambda x:~-x
Uma solução poderia ser:
lambda x:-~x
Isso subtrai um da entrada
fonte
Respostas:
Python 3, 80 bytes ( rachado )
Domínio: números inteiros positivos. A função é apenas quadratura de um número. Entrada para stdin, saída para stdout, bem como na função inversa. Observe que o Python ignora a terceira linha aqui, porque é sintaticamente válida e 1 já é um valor verdadeiro, portanto o Python nem olha se a parte correta de 'ou' está bem definida.
Os ladrões devem escrever uma função sqrt que funcione corretamente em todos os quadrados diferentes de zero, imprimindo o valor inteiro como está, sem ponto flutuante (a saída '4' da entrada deve ser '2' ou '2 \ n', não '2,0' ou '2.0 \ n').
fonte
Python 3, 46 bytes, quebrado
Duplica a entrada.
fonte
/
acontece com a divisão de flutuação.7 , 9 bytes, rachado
Este programa é cheio de caracteres não imprimíveis, então aqui está um hexdump:
Nota: isso usa uma rotina de entrada numérica que é incapaz de inserir números negativos; portanto, esse envio é restrito apenas a números inteiros não negativos.
Um problema com desafios de policiais e ladrões é que você não escreve explicações sobre o código (para dificultar o crack). Por outro lado, isso significa que não preciso me preocupar com o problema aqui.
Escolhi 7 como idioma porque, especialmente em sua notação compactada, é muito difícil de ler e não vejo por que deveria ser apenas eu quem precisava se dar ao trabalho de mover em pedaços de programas de 8 bits escritos em uma codificação de 3 bits. Boa sorte!
Explicação
Agora que o programa foi quebrado (por força bruta, infelizmente; isso sempre é um perigo nessas breves soluções), também posso explicar o que estava fazendo. Isso era realmente bastante solucionável ao ler o programa; Eu poderia ter dificultado muito, mas isso me pareceu uma péssima idéia quando existem brechas de força bruta.
Começaremos representando o programa em uma codificação mais natural. Como de costume, os números em negrito indicam os comandos que são executados imediatamente (não todos os quais são representável em um programa;
6
e7
são, mas2
para5
que não são), números unbolded representam seus equivalentes escaparam (0
a5
, todos os quais são representável no programa original; nota que0
é um escape6
e1
é um escape7
):O conjunto de comandos disponíveis em uma fonte de 7 programas significa que é basicamente apenas um literal que representa a pilha original (não há mais nada que você possa fazer com apenas comandos escapados
6
e7
). Portanto, a primeira coisa que um programa fará é colocar um monte de coisas na pilha. Veja como a pilha cuida da execução do programa (|
separa os elementos da pilha, como de costume em 7):O elemento final da pilha é copiado para se tornar o código a ser executado (enquanto permanece na pilha). Por acaso, essa é a única parte do programa que é código; tudo o resto são apenas dados. Aqui está o que ele se traduz:
Em outras palavras, isso é basicamente apenas um monte de instruções de E / S. Vamos analisar isso em detalhes:
73
descarta o73363
que ainda está no topo da pilha.3
produz o023
e descarta o34662
. Assim, pode-se ver que este34662
é um comentário, que foi usado para armazenar os bytes necessários na outra versão do programa. Quanto ao que023
ocorre quando a saída é selecionada, seleciona o formato de E / S 0 (inteiros) e, em seguida,23
é uma diretiva que solicita que a implementação insira um número inteiro (em 7, você insere através da saída de códigos específicos que solicitam entrada). A entrada é feita fazendo cópias do elemento da pilha abaixo, por exemplo, se o número inteiro da entrada for 10, o próximo elemento da pilha (atualmente7
) se tornará7777777777
. Portanto, estamos aceitando a entrada do usuário em decimal, mas ela está sendo armazenada como unária.6
escapa o elemento da pilha superior (alterando cada instância de7
para1
; é assim que as cadeias consistindo inteiramente de7
s são escapadas) e, em seguida, anexa-o ao elemento da pilha antes de (772
). Portanto, nossos dados agora são algo parecidos7721111111111
.3
gera o elemento de pilha em questão (e exibe um elemento de pilha em branco que faz parte da pilha inicial padrão). Seu valor é calculado com base no número de1
s e7
s, e subtraindo o número de0
s e6
s. (O2
meio é ignorado na maioria dos casos; se estiver no final da cadeia, ele se tornará uma nova linha à direita em vez de ser ignorada, mas as regras do PPCG não se importam com isso.) Assim, a saída é a original entrada mais 2.Neste ponto, não há nada útil na pilha e nada no programa, portanto o programa é encerrado.
Como invertemos isso? É uma simples questão de alterar
11
para00
, para que acrescentemos caracteres à entrada que a torna 2 menor, em vez de 2 maior. Existem00
oito dígitos octais convenientemente ocultos mais adiante no programa (para que os dígitos octais e bytes sejam alinhados um com o outro), para que possamos trocá-lo simplesmente11
no início.fonte
JavaScript (ES6), 21 bytes, Cracked
Este é fácil.
Retorna o cubo da entrada.
fonte
Python 2, 83 bytes, quebrado
Isso é semelhante à minha outra resposta. No entanto, isso usa RSA de 64 bits e é criptograficamente bastante fraco. Se você pode roubar essa resposta, teoricamente também pode roubar a minha outra, com tempo suficiente.
fonte
Python 2, 47 bytes, Rachado
O domínio para esta função é {x ∈ ℤ | x> 0}. Ele esquadrinha sua entrada.
nmjcman101 encontrou a solução pretendida:
fonte
JavaScript (ES6), 46 bytes, Rachado
Esta função retorna
ln(x+1)
ondex
é um número não negativo.Uso
Nota: Devido à natureza dos números de ponto flutuante,
f(g(x))
podem não ser exatamente iguaisx
. Exemplo:f(g(4))=3.9999999999999996
fonte
J, 8 bytes, quebrado
Outro simples para começar.
Duplica a entrada.
fonte
Processing.js, 59 bytes, Rachado!
Esta função multiplica a entrada por
204
(17*-4*-3=204
). Ele recebe um int como entrada e gera um float. Como esperado, o inverso divide a entrada por204
.Um intérprete online para processing-js pode ser encontrado aqui .
fonte
J, 10 bytes, quebrado
Outro simples. Retorna n 2 -1.
fonte
JavaScript (ES6), 15 bytes, quebrado por Emigna
Você pode testá-lo como:
Rachado
Minha solução pretendida é um pouco diferente do crack de Emigna:
fonte
J , 29 bytes ( Rachado por milhas)
Este é um verbo que recebe um número inteiro positivo como entrada e faz o seguinte:
Experimente online!
Minha solução
A lógica é praticamente a mesma do crack. A conjunção de classificação
"
pode estar presa em muitos lugares diferentes (e eu a uso para livrar-se do desnecessário0
e3
), já que realmente não faz nada na solução.fonte
Processamento (java), 59 bytes, SAFE
Esta função multiplica a entrada por
204
(17*-4*-3=204
). Ele recebe um int como entrada e gera um float. Como esperado, o inverso divide a entrada por204
. Nota: ambos os programas recebem um int como entrada e emitem um float.Essa resposta é exatamente igual à minha outra resposta, exceto que minha outra resposta foi escrita em Processing.js. Conheça Processing-java, o primo menos detalhado do Java. Você pode fazer o download do Processing aqui em processing.org.
The Crack
Este programa divide o argumento por
204
. Mas como? Vamos entrar na função.Simples o suficiente, mas como se
blue( get(0, 0) )
torna204
? Esta é a peça central desta submissão. Primeiro,get(0,0)
obtém a cor do pixel localizado em(0,0)
(no canto superior esquerdo da janela, que sempre abre em um esboço de Processamento). Em seguida,blue()
obtém o valor azul desse pixel, que é204
!Para chegar a essa submissão, experimentei imprimindo os diferentes atributos da cor obtida por
get(0,0)
. Eu descobri que os, verde, azul, vermelho são valores alfa204
,204
,204
e255
, respectivamente. A partir disso, decidi fazer uma operação simples com esse número e terminei com este post.fonte
JavaScript (ES6), 63 bytes Rachado por Ilmari Karonen
Hora de um
atob
absurdo. Esta função retornax*x+1
ondex
é um número não negativo.Uso
Pretendido
Há um grande número de soluções em potencial, mas eu esperava que os personagens principais jogassem fora a ordem de bytes o suficiente para dificultar isso. C'est la
atob
fonte
Brain-Flak , 26 bytes, Rachado
Original
My Crack
1000000000 's crack
fonte
Python 2, 225 bytes, quebrado pelo Sp3000
O domínio desta função é [0, n), onde n é o grande número acima. Sim, esta função é invertível neste domínio. E, a menos que eu errei, quebrar essa resposta é tão difícil quanto quebrar o RSA de 512 bits.
fonte
J, 15 bytes
Pega um número inteiro não negativo n , converte-o em uma lista de dígitos binários e combina esses dígitos como um número base 10.
Experimente online!
fonte