Machine Cheapo Enigma (flics)

15

Pour le poste des voleurs, machine Cheapo Enigma (voleurs)

La soumission d'un policier consistera en un programme / fonction qui accepte un seul octet de données et renvoie un seul octet de données. Chaque entrée possible doit produire une sortie unique. (En d'autres termes, votre fonction doit être bijective)

Les voleurs tenteront de créer la fonction inverse de la vôtre en utilisant un code aussi court que possible. Votre objectif est donc de rendre votre fonction difficile à inverser.

Vous ne pouvez pas utiliser de fonctions intégrées ayant pour seul but de hacher ou de chiffrer.

Votre nombre d'octets ne peut pas dépasser 64 octets. Les solutions à 0 octet ne sont pas éligibles pour gagner.

Format d'entrée / sortie

8 bits (0 ou 1) ou un entier en base 10 dans la plage 1-256, 0-255 ou -128 à 127. Peut utiliser des E / S standard ou des E / S de fichiers. La fonction peut également renvoyer une valeur en sortie. L'entrée et la sortie doivent appartenir à la même plage (binaire, 1-256, 0-255 ou -128 à 127). Le voleur devra également utiliser cette plage pour les entrées et les sorties.

Notation

Rapport de votre nombre d'octets à celui de la meilleure tentative de voleur contre vous. Le score le plus bas l'emporte.

Vous ne pouvez gagner (en tant que flic) que si un voleur a tenté de vous vaincre. (Ce voleur peut être vous)

Exemple

C ++, utilise une plage de 0 à 255, 31 octets

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

Soumission possible de voleur en C ++, 32 octets

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

L'utilisation du même langage ou d'un algorithme similaire n'est pas obligatoire

Cela donne un score de 31/32 = 0,97 à la fois au flic et au voleur.

ghosts_in_the_code
la source
1
En quoi consiste une soumission de flic? Langue, taille et code de programme / fonction complet?
Arnauld
1
n'est-ce pas un peu cassé si le flic peut juste faire une chose arbitrairement grande?
Destructible Lemon
1
Ce voleur peut être vous Et si je poste une réponse de flic de 64 octets qui mappe N à N et une réponse de voleur qui fait la même chose dans un octet?
Arnauld
1
Vous voudrez peut-être spécifier si / comment la soumission du flic doit être mise à jour lorsque les voleurs y répondent. (La mise à jour "craquée" habituelle ne s'applique pas ici, je suppose. Du moins pas comme une fissure unique et définitive.)
Arnauld
3
À bien y penser, vous voudrez peut-être supprimer complètement cette règle. Je peux détruire la plupart des réponses en publiant un voleur dans Jelly.
Dennis

Réponses:

7

Javascript, 11 8 octets, score: 8/5

x=>x^x/2

Implémentation simple du code gris. Le décodage nécessite généralement une boucle entière. Voyons qui propose le plus petit ou même sans boucle!

Christoph
la source
Je suppose que ce x^x/4sera plus difficile car il ne devrait pas y avoir de construction pour cela ...
Christoph
1
Score: 8/25
Arnauld
1
Comment est ce bijectif?
Leaky Nun
1
@LeakyNun Uhm ne sais pas quel genre de réponse vous attendez mais j'essaierai: Le code gris est une forme alternative de représenter un nombre où chaque numéro consécutif ne change que sur 1 bit (la distance de hammig est toujours 1). Pour chaque nombre il y a exactement un codage gris et un codage binaire donc ils forment une bijection. Par exemple, 7 est 0111 en binaire et 0100 en gris, le nombre suivant 8 est 1000 en binaire et 1100 en gris. Le codage gris est essentiellement le codage de bord du binaire.
Christoph
1
@LeakyNun ^est xor au niveau du bit, pas une exponentiation. Quoi qu'il en soit, cela semble magique
Евгений Новиков
7

C, 64 octets, score 64/71 = 0,901

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

Prend entrée dans la plage [0 255].

Essayez-le en ligne! - sur TIO (en utilisant GCC), cela produit:

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

Notez que sur d'autres systèmes, il peut produire une sortie différente (mais toujours valide), car C ne requiert pas une randimplémentation spécifique . Ma soumission est spécifiquement la version fonctionnant sur TIO (comme liée).


Je suis assez déçu de ne pas avoir pu obtenir une version comme ma version originale ( f(x){return rand(srand(x*229))/229%256;}) pour travailler sur TIO, car je pense que c'est beaucoup plus élégant. Comme cela ne fonctionne que sur Clang fonctionnant sous OS X, ce n'est pas juste pour la concurrence. Celui-ci est encore assez difficile à inverser, donc cela suffit, je suppose.

Dave
la source
Eh bien ... c'est amusant!
Matthew Roh
Solution ici , mais j'ai eu un peu de mal avec votre srand(), donc vous devrez décider si c'est acceptable sous cette forme.
Appleshell
Je ne vois pas comment ce programme remplit l'exigence Bijection, car la sortie est aléatoire et chaque entrée n'a pas une sortie unique.
Post Rock Garf Hunter
2
Le problème n'est pas la mise en œuvre. Le problème est qu'il manque ce que je pense sont toutes les idées clés de ce défi: trouver un algorithme trival (donc limité à 64 octets et indépendant du langage) qui n'est pas rival à inverser. Votre soumission "semble" échapper à: l'indépendance de la langue, la limite de 64 octets en sous-traitant à une implémentation inconnue d'un module intégré (rand ne dépend pas de la langue mais de la stdlib locale ) et de la règle de hachage / cryptage. C'est dans les règles de PPCG mais certainement pas ce que ghosts_in_the_code voulait avec ses règles.
Christoph
1
@ghosts_in_the_code de bons RNG et fonctions de hachage sont tous deux conçus pour être difficilement réversibles. Par conséquent, je pense qu'ils devraient être inclus dans cette règle (même si la mise en œuvre réelle pourrait ne pas être conçue de cette façon). Quoi qu'il en soit, je ne recommande pas de modifier les règles à ce stade.
Christoph
2

JavaScript, 44 octets 22/3

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

Utilise le tri lexicographique (Javascript par défaut) pour réorganiser tous les nombres de 0 à 255

Essayez-le en ligne!

fəˈnɛtɪk
la source
1
22/3 - une langue différente semble acceptable, même si elle est un peu étrange. Je pensais en avoir 5, mais 256 m'ont gêné :).
Jonathan Allan
1

Javascript, 11/8 octets

x=>x**5%257

Le domaine / plage est compris entre 1 et 256.

histocrate
la source
Hm, Javascript est-il mauvais avec un grand nombre d'exposants? Cela fonctionne dans Ruby: repl.it/HXvZ/0
histocrat
JavaScript n'a que des flottants double précision, donc tout ce qui a plus de ~ 53 bits ne peut pas être représenté exactement. x**3et x**5devrait fonctionner.
Dennis
Eh bien, ça me sert de supposer. Je vais changer de langue.
histocrate
Ou faites la suggestion de Dennis, étant donné les règles favorisant les langues terser. :) Merci!
histocrate
Malheureusement, les règles sont un peu brisées pour le moment, et je serais autorisé à inverser cela avec une autre langue. Précisément à cause de la limite de précision, ce sera plutôt bavard à inverser en utilisant JS.
Dennis
1

Javascript, 27/29 octets

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

Modifier: la plage / le domaine est compris entre 1 et 256. Généré par force brute, plus ou moins.

histocrate
la source
Malheureusement, c'est bijectif mais pas dans la plage [0,256): la valeur de 130 n'est jamais sortie mais une valeur de 256 l'est (ce qui ne correspond pas à un 8 bits).
Christoph
Score 27/29 . Je l'aime !
Christoph
1
Merci! Les règles me permettent de spécifier une plage de [1 256], et c'est un bijectif sur cette plage.
histocrate
1

Octave , 16/6

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

Essayez-le en ligne!

flawr
la source
1
Score: 16/6 (Remarque: je ne pense pas qu'il devrait être autorisé à utiliser une autre langue pour la soumission de voleur, mais à ce stade, c'est le cas.)
Dennis
1
Il serait également intéressant de savoir si je peux essayer de battre votre soumission de voleur en faisant un autre flic (en utilisant également Jelly ou MATL aussi)
flawr
1

Java, 35 octets

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

Le domaine / la plage sont compris entre 0 et 255

Targz
la source
1

Rubis, 23 octets

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

La plage et le domaine sont compris entre 0 et 255. Concaténer 228 à lui-même x fois, puis prendre le résultat modulo 257 (0 correspond à 0). 228 est le premier nombre magique après 9 qui fonctionne pour cette plage (donne des valeurs distinctes qui n'incluent pas 256).

histocrate
la source
0

Python 3, 55 octets

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

Le domaine / plage est compris entre 0 et 255.

Magenta
la source
0

Python 3, 32 octets 32/23

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

Le domaine / plage est compris entre 0 et 255.

Retourne les quatre premiers octets avec les quatre derniers et ajoute trois aux premiers octets.

Magenta
la source
1
Score 32/23
Christoph
0

Mathematica, 13 octets

Mod[#^7,257]&

Utilise la plage [1..256], bien qu'elle soit également valable sur la plage [0..255]. Pour voir l'intégralité du tableau, copiez / collez l'une des lignes de code suivantes dans le sandbox 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
la source
0

brainfuck , 37/11

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

Essayez-le en ligne!

Pas très bon mais plage de 0 à 255

Christophe
la source
@Dennis Beau travail! Je ne devrais pas utiliser un tel langage d'octets.
Christopher
3
Soit dit en passant, censurer les noms de langue n'est pas une bonne idée. Oui, ces langues particulières ont un nom ordinaire et enfantin, mais tout le monde sait ce que signifie l'astérisque, et il ne peut pas être trouvé par le moteur de recherche dans sa forme actuelle.
Dennis
@Dennis a finalement corrigé cela
Christopher