Máquina Cheapo Enigma (ladrões)

8

Para o posto dos policiais, a máquina Cheapo Enigma (Policiais)

O envio de um ladrão consiste em um programa / função que aceita a saída do código de um policial e retorna a entrada para todas as saídas fornecidas pelo código desse policial. (Em outras palavras, você deve escrever a função inversa)

Você não pode usar built-ins com o único objetivo de hash ou criptografia.

Formato de entrada / saída

8 bits (0 ou 1) ou um número inteiro de base 10 no intervalo de 1-256, 0-255 ou -128 a 127. Pode usar E / S padrão ou E / S de arquivo. A função também pode retornar um valor como saída. A entrada e a saída devem pertencer ao mesmo intervalo (como em binário, 1-256, 0-255 ou -128 a 127), que também deve ser o mesmo intervalo usado pelo policial.

Pontuação

Proporção entre a contagem de bytes da policial e a contagem de bytes. Maior pontuação ganha.

Você pode enviar uma tentativa de ladrão contra seu próprio código de policial para referência. (É claro que este código não é elegível para ganhar)

Notificação

Edite a resposta do policial correspondente para incluir sua nova contagem de bytes e a proporção correspondente.

ghosts_in_the_code
fonte
2
No começo, eu queria saber como você iria transformar Emigna em uma máquina. Então percebi que você não estava falando sobre o usuário.
Urna Mágica de Polvo
OK, desculpe por incomodá-lo novamente, mas quero ter certeza de que estou certo desta vez. Se a resposta cerebral lê e imprime bytes (pontos de código 0 a 255) e minha resposta Jelly pega um número inteiro entre 0 e 255 e retorna um número inteiro no mesmo intervalo, isso é aceitável?
Dennis
@ Dennis Não, não é. Talvez você (ou outra pessoa) possa sugerir uma redação alternativa que torne isso mais claro.
ghosts_in_the_code
@carusocomputing Emigna é uma máquina, certo? Ele tem todos os programas 05AB1E carregados em seu sistema de memória, sim?
caird coinheringaahing

Respostas:

3

JavaScript de Christoph , 25/8

f=(y,x=0)=>y?f(y/2,x^y):x

(intervalo 0-255)

Infelizmente, f=(y,x)=>y?f(y/2,x^y):xfunciona para todos os valores, exceto 0.

Nota técnica

Usamos, em y/2vez de y>>1salvar, um byte. Isso está abusando do fato de que qualquer valor de yeventualmente será arredondado para 0devido a um fluxo aritmético .

Arnauld
fonte
2

C, por Dave de 64/ 95 92 85

b,i,e,t[256];r(x){for(;!b;++i,b=e==x)for(srand(i&&e);t[e=rand()%256]++;);return i-1;}

Experimente aqui !

C, versão mais curta, 64/89 71

i,e,t[256];r(x){for(srand(1);t[e=rand()%256]++||++i,e!=x;);return i-1;}

Este é mais específico da implementação, mas funciona no TIO. Mesmo tamanho que a solução PHP, não consegui obtê-lo mais curto que isso.

Experimente aqui !

Maçã
fonte
Ok, eu vou abordar a apresentação da polícia então. Obrigado por me informar.
Ad Hoc Garf Hunter
1

Geléia , 22/3 = 7 1/3

⁹ḶDÞḊi

Experimente online!

A apresentação bobina por fənɛtɪk foi voltar a n th ( 0 indexados) número decimal lexicograficamente classificados usando o domínio [0255] .

A primeira vez que literalmente revertida a operação descrita, ⁹ḶDÞi⁸‘- leva a gama reduzida de 256 , ⁹Ḷe Þinstrui a classificá-lo por uma função-chave de conversão para uma lista decimal, D; em seguida, localiza o índice de, i, a entrada, e subtrai 1 , (listas de geléia são um indexados).

Depois, joguei o golfe desenfileirando a lista classificada com . Quando um item não é encontrado, iretorna 0 conforme o necessário para o primeiro elemento removido ( 0 ), enquanto todo o resto é encontrado um índice anteriormente, permitindo a remoção do decremento , que por sua vez fornece ientrada implícita à direita da esquerda (somente ) entrada para o link monádico.

Jonathan Allan
fonte
1

Javascript por Magenta, 32/23

x=>x%16*16+(x/16+13)%16

O código basicamente alterna os 4 bits inferiores e os superiores e faz uma adição de módulo em uma parte.

Christoph
fonte
1

Javascript por histocrat, 27/29

x=>x-65?x-126?x*127%258:131:6

Infelizmente, são necessários dois códigos rígidos para quebrá-lo. Observe que a função original não mapeia nenhum valor para 130, mas mapeia um valor para 256 .

Christoph
fonte
1
Ter 256 no intervalo é legal de acordo com as regras ("8 bits (0 ou 1) ou um número inteiro de base 10 no intervalo 1-256"). Este ainda é um ladrão válido nesse intervalo!
histocrat
1

PHP, Pontuação 64/71

for(srand(0);$a<256;)$b[$c=rand()%256]++||$d[$c]=$a++;echo$d[$argn]|0;

Felizmente, o PHP randapenas encaminha para o stdlib como C. Portanto, isso funciona enquanto estivermos usando o mesmo stdlib. Isso significa que ele funciona no TIO, mas não no, por exemplo, sandbox.onlinephpfunctions.com . A versão atual do código de Dave apenas repete uma sequência pseudo-aleatória e retorna o enésimo valor exclusivo, então eu acho que pode haver respostas muito mais curtas se uma linguagem de golfe também usar o stdlib.

Aqui está uma implementação do código de Dave que não depende do stdlib. Isso também pode ajudar.

Christoph
fonte
+1 por encontrar uma maneira de mudar o idioma neste! Alguma idéia de por que isso não precisa srand(1)? Também aqui está uma Experimente online!
31517 Dave
@Dave srand(x&&f(x-1))isso para apenas se, x==0portanto, for propagado 0na primeira rodada. Não sei por que as próximas chamadas não mudam.
Christoph
@ Dave parece srand(0)quebras rand(veja aqui ). Eu acho que srand(0)é automaticamente promovido a srand(1). Eu acho que se você pudesse usar uma semente diferente a cada vez, seria muito mais difícil quebrá-la.
Christoph
Interessante que isso funcione. Parece ser específico para a versão stdlib usada no TIO, o comportamento em C lá é aparentemente o mesmo, enquanto na minha máquina local com clang é necessário re-invocar srand com 0 resp. 1 em cada iteração, em vez de apenas invocando uma vez com 0.
Appleshell
1
@ Applepell parece que as suspeitas de Christoph estão corretas: glibc tem uma verificação especial. Veja aqui: stackoverflow.com/a/8049852/1180785 (desde que você menciona clang, eu estou supondo que o local é OSX, por isso não glibc)
Dave
0

Jelly , 11/8

*205%257

Experimente online para ver a tabela completa.

Caso envios de assaltantes em idiomas diferentes não sejam permitidos no futuro, chamo dibs na solução a seguir.

g=(x,y=0)=>x-++y**5%257?g(x,y):y
Dennis
fonte
0

C (gcc) por Bijan, 32/30

g(x){x=x?g(--x)*205+51&255:0;}

Nos divertimos jogando golfe, obrigado! x=permite pular o retorno com gcc e tcc (você pode alterar sua resposta para incluí-lo). g(--x)*205+51&255é o inverso.

Christoph
fonte
0

Geléia , 37/11

O_77×191%⁹Ọ

Usa o mesmo formato de E / S que o policial. Não tenho certeza se isso é necessário.

Experimente online para ver a tabela completa.

Como funciona

Para a entrada n , a resposta do policial calcula f (n): = ((((n + 5)% 256 × 2)% 256 + 2)% 256 × 9)% 256) . Como %é um operador linear, isso é equivalente a f (n) = (((n + 5) × 7 + 2) × 9)% 256 . Expandindo o termo certo, obtemos f (n) = (63n + 333)% 256 = (63n + 77)% 256 .

Inverter isso é bastante simples. Para desfazer a adição, basta subtrair 77 . Além disso, como 191 × 63% 256 = 12033% 256 = 1 , segue-se que 191 é o módulo inverso 256 de 63 , portanto, multiplicar por 191 desfaz a multiplicação por 63 . Dessa forma, g (n) = (n - 77) × 191% 256 define o inverso de f .

Dennis
fonte