Máquina Cheapo Enigma (Policiais)

15

Para o posto de ladrões, máquina Cheapo Enigma (ladrões)

O envio de um policial consiste em um programa / função que aceita um único byte de dados e retorna um único byte de dados. Toda entrada possível deve produzir uma saída única. (Em outras palavras, sua função deve ser bijetiva)

Os ladrões tentarão criar a sua função inversa usando um código o mais curto possível. Portanto, seu objetivo é dificultar a inversão de sua função.

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

Sua contagem de bytes não pode exceder 64 bytes. As soluções de 0 byte não são elegíveis para ganhar.

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 (binário, 1-256, 0-255 ou -128 a 127). O ladrão também precisará usar esse intervalo para entrada e saída.

Pontuação

A proporção da contagem de bytes é a da melhor tentativa de ladrão contra você. Menor pontuação ganha.

Você é elegível para ganhar (como policial) somente se um ladrão tentar derrotá-lo. (Este ladrão pode ser você)

Exemplo

C ++, usa intervalo de 0 a 255, 31 bytes

int x;
cin>>x;
cout<<(x+1)%256;

Possível envio de ladrão em C ++, 32 bytes

int f(int x)
{return x?x-1:255;}

Usar a mesma linguagem ou algoritmo semelhante não é um requisito

Isso dá uma pontuação de 31/32 = 0,97 para o policial e o ladrão.

ghosts_in_the_code
fonte
1
Em que consiste um envio de policial? Idioma, tamanho e código completo do programa / função?
Arnauld
1
não é um pouco quebrado se o policial pode fazer algo arbitrariamente grande?
destrutível limão
1
Esse assaltante pode ser você E se eu postar uma resposta de policial de 64 bytes que mapeie N para N e uma resposta de assaltante que faça a mesma coisa em um byte?
Arnauld
1
Você pode especificar se / como o envio do policial deve ser atualizado quando os ladrões o atenderem. (O usual "rachado" atualização não se aplica aqui, eu acho Pelo menos não como uma rachadura único e definitivo..)
Arnauld
3
Pensando bem, convém remover completamente essa regra. Eu posso destruir a maioria das respostas colocando um ladrão em Jelly.
Dennis

Respostas:

7

Javascript, 11 8 bytes, Pontuação: 8/5

x=>x^x/2

Implementação simples do código cinza. A decodificação geralmente precisa de um loop inteiro. Vamos ver quem cria o menor ou mesmo sem loop!

Christoph
fonte
Eu acho que x^x/4vai ser mais difícil porque não deve haver builtins para ele ...
Christoph
1
Pontuação: 25/8
Arnauld 24/04
1
Como isso é bijetivo?
Freira vazada
1
@LeakyNun Uhm, não tenho certeza de que tipo de resposta você espera, mas tentarei: O código cinza é uma forma alternativa de representar um número em que cada número consecutivo muda apenas em 1 bit (a distância do hammig é sempre 1). Para cada número há exatamente uma codificação cinza e uma codificação binária, portanto, elas formam uma bijeção. Por exemplo, 7 é 0111 em binário e 0100 em cinza, o próximo número 8 é 1000 em binário e 1100 em cinza. A codificação cinza é basicamente a codificação de borda do binário.
Christoph
1
@LeakyNun ^é xor bit a bit, não exponenciação. De qualquer forma, parece mágico #
30517
7

C, 64 bytes, Pontuação 64/71 = 0,901

T[256];f(x){srand(x&&f(x-1));for(;T[x=rand()%256]++;);return x;}

Recebe entrada no intervalo [0 255].

Experimente online! - no TIO (usando o GCC), isso produz:

103,198,105,115,081,255,074,236,041,205,186,171,242,251,227,070,
124,194,084,248,027,232,231,141,118,090,046,099,051,159,201,154,
102,050,013,183,049,088,163,037,093,005,023,233,094,212,178,155,
180,017,014,130,116,065,033,061,220,135,112,062,161,225,252,001,
126,151,234,107,150,143,056,092,042,176,059,175,060,024,219,002,
026,254,067,250,170,058,209,230,148,117,216,190,097,137,249,187,
168,153,015,149,177,235,241,179,239,247,000,229,202,011,203,208,
072,071,100,189,031,035,030,028,123,197,020,075,121,036,158,009,
172,016,080,021,111,034,025,125,245,127,164,019,181,078,152,224,
077,052,188,095,119,108,134,043,085,162,004,211,054,226,240,228,
079,073,253,169,008,138,010,213,068,091,243,142,076,215,045,066,
006,196,132,173,222,048,246,032,133,007,244,185,195,217,160,120,
218,106,083,144,087,238,207,096,210,053,101,063,098,128,165,089,
140,012,192,131,047,039,022,147,184,109,182,193,199,237,018,069,
057,157,174,104,122,166,055,110,003,040,139,086,145,114,129,113,
206,167,191,214,146,221,136,038,156,082,200,029,044,204,223,064

Observe que em outros sistemas, ele pode produzir resultados diferentes (mas ainda válidos), pois C não exige uma randimplementação específica . Minha submissão é especificamente a versão em execução no TIO (como vinculada).


Estou muito decepcionado por não ter conseguido que uma versão como a original ( f(x){return rand(srand(x*229))/229%256;}) funcionasse no TIO, pois acho que é muito mais elegante. Como isso só funciona no Clang rodando no OS X, não é justo para a concorrência. Esse ainda é bastante difícil de reverter, então é o suficiente, eu acho.

Dave
fonte
Bem ... isso é divertido!
Matthew Roh
Solução aqui , mas tive um pouco de dificuldade com a sua srand(), então você terá que decidir se é aceitável neste formulário.
Appleshell
Não consigo ver como esse programa atende ao requisito de Bijeção, pois a saída é aleatória, nem toda entrada tem uma saída única.
Post Rock Garf Hunter
2
O problema não é a implementação. O problema é que falta o que eu acho que são todas as idéias principais desse desafio: Encontrar um algoritmo trival (portanto limitado a 64 bytes e independente da linguagem) que não seja invertido para reverter. Sua submissão "parece" brigar com: Independência do idioma, o limite de 64 bytes terceirizando para uma implementação desconhecida de um builtin (o rand não depende do idioma, mas do stdlib local ) e da regra de hash / criptografia. Está dentro das regras do PPCG, mas certamente não é o que ghosts_in_the_code pretendia com suas regras.
Christoph
1
@ghosts_in_the_code boas RNGs e funções de hash são projetadas para dificilmente serem reversíveis. Portanto, acho que eles devem ser incluídos nessa regra (mesmo que a implementação real não possa ser projetada dessa maneira). De qualquer forma, não recomendo alterar as regras nesta fase.
Christoph
2

JavaScript, 44 bytes 22/3

x=>a.sort()[x]
for(a=[],i=0;i<256;)a[i]=i++;

Usa classificação lexicográfica (Javascript padrão) para reorganizar todos os números de 0 a 255

Experimente online!

fəˈnɛtɪk
fonte
1
22/3 - linguagem diferente parece aceitável, mesmo que um pouco estranha. Eu pensei que tinha 5, mas 256 ficaram no meu caminho :).
Jonathan Allan
1

Javascript, 11/8 bytes

x=>x**5%257

O domínio / intervalo é de 1 a 256.

histocrata
fonte
Hm, Javascript é ruim com expoentes de grande número? Isso funciona no Ruby: repl.it/HXvZ/0
histocrat
O JavaScript possui apenas flutuadores de precisão dupla, portanto, qualquer coisa com mais de ~ 53 bits não pode ser representada exatamente. x**3e x**5deve funcionar.
Dennis
Bem, serve-me bem para assumir. Eu vou mudar de idioma.
histocrat
Ou a sugestão de Dennis, dadas as regras que favorecem os idiomas terser. :) Obrigado!
histocrat
Infelizmente, as regras estão um pouco quebradas no momento, e eu poderia inverter isso com outro idioma. Precisamente por causa do limite de precisão, isso será bastante detalhado para inverter usando JS.
Dennis
1

Javascript, 27/29 bytes

x=>x-6?x*95%127+x*98%131:65

Editar: intervalo / domínio é 1..256. Gerado por força bruta, mais ou menos.

histocrata
fonte
Infelizmente é bijetivo, mas não está no intervalo [0,256): o valor de 130 nunca é emitido, mas um valor de 256 é (o que não se encaixa em um int de 8 bits).
Christoph
Pontuação 27/29 . Eu gosto disso !
Christoph
1
Obrigado! As regras permitem especificar um intervalo de [1.256], e é bijetivo nesse intervalo.
histocrat
1

Oitava , 16/6

@(x)mod(x*3,256)

Experimente online!

flawr
fonte
1
Pontuação: 16/6 (Nota: acho que não deve ser permitido usar outro idioma para a submissão de assaltantes, mas, neste momento, é).
Dennis
1
Também seria interessante saber se eu posso tentar bater o seu envio ladrão, fazendo outro policial (novamente usando Jelly ou MATL também)
flawr
1

Java, 35 bytes

int a(int v){return (v*v+v)%512/2;}

Domínio / intervalo são de 0 a 255

Targz
fonte
1

Ruby, 23 bytes

->x{('228'*x).to_i%257}

O intervalo e o domínio são 0..255. Concatene 228 para si mesmo x vezes e, em seguida, pegue o módulo de resultado 257 (0 mapeia para 0). 228 é o primeiro número mágico após 9 que funciona para esse intervalo (fornece valores distintos que não incluem 256).

histocrata
fonte
0

Python 3, 55 bytes

y=lambda x,i=3:x if i==0 else pow(3,y(5*x,i-1),257)-1

O domínio / intervalo é de 0 a 255.

Magenta
fonte
0

Python 3, 32 bytes 32/23

V=lambda x:((3+x)%16)*16+x//16

O domínio / intervalo é de 0 a 255.

Inverte os quatro primeiros bytes com os últimos quatro e adiciona três aos primeiros bytes.

Magenta
fonte
1
Pontuação 32/23
Christoph
0

Mathematica, 13 bytes

Mod[#^7,257]&

Usa o intervalo [1..256], embora seja igualmente válido no intervalo [0..255]. Para ver a tabela inteira, copie / cole uma das seguintes linhas de código na caixa de proteção Wolfram :

Array[ Mod[#^7,257]&, 256]   (for a list of values in order)
Array[ Rule[#,Mod[#^7,257]]&, 256]   (for a list of input-output rules)
Greg Martin
fonte
0

brainfuck , 37/11

,+++++[>+++++++<-]>++[<+++++++++>-]<.

Experimente online!

Não é muito bom, mas faixa de 0 a 255

Christopher
fonte
@Dennis Bom trabalho! Eu não deveria usar uma linguagem de bytey.
Christopher
3
A propósito, censurar nomes de idiomas não é uma boa ideia. Sim, esse idioma em particular tem um nome comum e infantil, mas todos sabem o que o asterisco representa e ele não pode ser encontrado pelo mecanismo de pesquisa em sua forma atual.
Dennis
@Dennis finalmente corrigiu isso
Christopher