Cheapo Enigma Maschine (Räuber)

8

Für die Post der Polizei , Cheapo Enigma Maschine (Cops)

Die Übermittlung eines Räubers besteht aus einem Programm / einer Funktion, die die Ausgabe des Codes eines Polizisten akzeptiert und die Eingabe für alle vom Code dieses Polizisten bereitgestellten Ausgaben zurückgibt. (Mit anderen Worten, Sie müssen die Umkehrfunktion schreiben)

Sie können keine integrierten Funktionen verwenden, die ausschließlich dem Hashing oder der Verschlüsselung dienen.

Eingabe- / Ausgabeformat

8 Bit (0 oder 1) oder eine Basis-10-Ganzzahl im Bereich von 1-256, 0-255 oder -128 bis 127. Kann Standard-E / A oder Datei-E / A verwenden. Die Funktion kann auch einen Wert als Ausgabe zurückgeben. Eingabe und Ausgabe müssen zu demselben Bereich gehören (wie in, binär, 1-256, 0-255 oder -128 bis 127), der auch derselbe Bereich sein muss, der vom Cop verwendet wird.

Wertung

Verhältnis der Byteanzahl des Cop zu Ihrer Byteanzahl. Die höchste Punktzahl gewinnt.

Sie können einen Räuberversuch gegen Ihren eigenen Cop-Code als Referenz einreichen. (Natürlich ist dieser Code nicht gewinnberechtigt)

Benachrichtigung

Bitte bearbeiten Sie die Antwort des entsprechenden Polizisten, um Ihre neue Byteanzahl und das entsprechende Verhältnis anzugeben.

Ghosts_in_the_code
quelle
2
Zuerst habe ich mich gefragt, wie Sie Emigna zu einer Maschine machen würden. Dann wurde mir klar, dass Sie nicht über den Benutzer sprachen.
Magic Octopus Urn
OK, tut mir leid, dass ich Sie wieder gestört habe, aber ich möchte sicherstellen, dass ich es diesmal richtig gemacht habe. Wenn die Brainfuck-Antwort Bytes liest und druckt (Codepunkte 0 bis 255) und meine Jelly-Antwort eine Ganzzahl zwischen 0 und 255 annimmt und eine Ganzzahl im gleichen Bereich zurückgibt, ist das akzeptabel?
Dennis
@ Tennis Nein, ist es nicht. Vielleicht könnten Sie (oder jemand anderes) einen alternativen Wortlaut vorschlagen, der dies klarer macht.
Ghosts_in_the_code
@carusocomputing Emigna ist eine Maschine, oder? Er hat jedes einzelne 05AB1E-Programm in sein Speichersystem geladen, ja?
Caird Coinheringaahing

Antworten:

3

JavaScript von Christoph , 8/25

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

(Bereich 0-255)

Funktioniert leider f=(y,x)=>y?f(y/2,x^y):xfür alle Werte außer 0.

Technischer Hinweis

Wir verwenden y/2eher als y>>1ein Byte zu speichern. Dies missbraucht die Tatsache, dass jeder Wert von aufgrund eines arithmetischen Unterlaufsy schließlich auf gerundet wird .0

Arnauld
quelle
2

C, von Dave , 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;}

Probieren Sie es hier aus !

C, kürzere Version, 64/89 71

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

Dieser ist implementierungsspezifischer, funktioniert jedoch mit TIO. Die gleiche Länge wie die PHP-Lösung konnte ich nicht kürzer bekommen.

Probieren Sie es hier aus !

Apfelschale
quelle
Ok, ich werde es dann mit der Einreichung der Polizei aufnehmen. Danke, dass du mich informiert hast.
Ad-hoc-Garf-Jäger
1

Gelee , 22/3 = 7 1/3

⁹ḶDÞḊi

Probieren Sie es online aus!

Die Cop-Einreichung von fəˈnɛtɪk bestand darin, die n- te ( 0- indizierte) lexikographisch sortierte Dezimalzahl unter Verwendung der Domäne [0,255] zurückzugeben .

I umgekehrt zunächst buchstäblich der Betrieb beschrieben, ⁹ḶDÞi⁸‘- nimmt den abgesenkte Bereich von 256 , ⁹Ḷund Þinstruiert sie durch eine Schlüsselfunktion der Umwandlung in eine Dezimalzahl Liste zu sortieren D; findet dann den Index, ider Eingang, und subtrahiert 1 , (Jelly Listen sind 1 -indexed).

Dann habe ich Golf gespielt, indem ich die sortierte Liste mit in die Warteschlange gestellt habe . Wenn ein Element gefunden wird nicht izurückkehrt 0 wie für das entfernte erste Element (erforderlich 0 ), während alles andere einen Index früher gefunden wird, um die Entfernung der Abnahme ermöglicht, , die wiederum gibt iauf seinem rechten implizite Eingabe von links (nur ) Eingabe in die monadische Verbindung.

Jonathan Allan
quelle
1

Javascript von Magenta, 32/23

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

Code schaltet grundsätzlich die unteren und oberen 4 Bits um und führt eine Modulo-Addition an einem Teil durch.

Christoph
quelle
1

Javascript von Histocrat, 27/29

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

Leider werden zwei harte Codierungen benötigt, um es zu brechen. Beachten Sie, dass die ursprüngliche Funktion 130 keinen Wert zuordnet, sondern 256 einen Wert .

Christoph
quelle
1
256 im Bereich zu haben ist gemäß den Regeln legal ("8 Bits (0 oder 1) oder eine Basis-10-Ganzzahl im Bereich 1-256"). Dies ist jedoch immer noch ein gültiger Räuber in diesem Bereich!
Histokrat
1

PHP, Punktzahl 64/71

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

Glücklicherweise randleitet PHP wie C nur an die stdlib weiter . Dies funktioniert also, solange wir dieselbe stdlib verwenden. Dies bedeutet, dass es unter TIO funktioniert, jedoch nicht unter sandbox.onlinephpfunctions.com . Die aktuelle Version von Daves Code durchläuft nur eine pseudozufällige Sequenz und gibt den n-ten eindeutigen Wert zurück. Ich denke, es gibt möglicherweise viel kürzere Antworten, wenn eine Golfsprache auch die stdlib verwendet.

Hier ist eine Implementierung von Daves Code, die nicht von der stdlib abhängt. Das könnte auch helfen.

Christoph
quelle
+1, um einen Weg zu finden, die Sprache zu wechseln! Irgendeine Idee, warum das nicht muss srand(1)? Auch hier ist ein Try it online!
Dave
@ Dave srand(x&&f(x-1))dies stoppt nur, wenn es x==0daher 0in der ersten Runde mit gesät wird . Nicht sicher, warum die nächsten Anrufe es nicht ändern.
Christoph
@ Dave scheint es srand(0)bricht rand(siehe hier ). Ich denke, wird srand(0)automatisch befördert srand(1). Ich denke, wenn Sie jedes Mal einen anderen Samen verwenden könnten, würde es viel schwieriger werden, ihn zu brechen.
Christoph
Interessant, dass das funktioniert. Scheint spezifisch für die auf TIO verwendete stdlib-Version zu sein, das Verhalten in C dort ist anscheinend das gleiche, während es auf meinem lokalen Computer mit clang erforderlich ist, srand mit 0 bzw. 0 erneut aufzurufen. 1 bei jeder Iteration, anstatt sie nur einmal mit 0
aufzurufen
1
@Appleshell scheint, dass Christophs Verdacht richtig ist: glibc hat einen speziellen Scheck. Siehe hier: stackoverflow.com/a/8049852/1180785 (da Sie Clang erwähnen, schätze ich, dass Ihre lokale OSX ist, also kein Glibc)
Dave
0

Gelee , 11/8

*205%257

Probieren Sie es online aus , um die gesamte Tabelle zu sehen.

Für den Fall, dass Räuberbeiträge in einer anderen Sprache in Zukunft nicht mehr zulässig sind, rufe ich bei der folgenden Lösung dibs auf.

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

C (gcc) von Bijan, 32/30

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

Wir hatten viel Spaß beim Golfen, danke! x=Ermöglicht das Überspringen der Rückgabe mit gcc und tcc (möglicherweise möchten Sie Ihre Antwort ändern, um sie einzuschließen). g(--x)*205+51&255ist das Gegenteil.

Christoph
quelle
0

Jelly , 37/11

O_77×191%⁹Ọ

Verwendet das gleiche E / A-Format wie der Cop. Ich bin mir nicht sicher, ob das erforderlich ist.

Probieren Sie es online aus , um die gesamte Tabelle zu sehen.

Wie es funktioniert

Für die Eingabe n wird die Cop-Antwort berechnet f (n): = ((((n + 5)% 256 × 2)% 256 + 2)% 256 × 9)% 256 . Da %es sich um einen linearen Operator handelt, entspricht dies f (n) = (((n + 5) × 7 + 2) × 9)% 256 . Wenn wir den richtigen Term erweitern, erhalten wir f (n) = (63n + 333)% 256 = (63n + 77)% 256 .

Dies umzukehren ist ziemlich einfach. Um die Addition rückgängig zu machen, müssen wir einfach 77 subtrahieren . Auch kann , da 191 × 63% 256 = 12033% 256 = 1 , folgt daraus , daß 191 ist 63 ‚s inverse modulo 256 , also durch Multiplikation 191 rückgängig macht durch Multiplikation 63 . Auf diese Weise definiert g (n) = (n - 77) × 191% 256 die Umkehrung von f .

Dennis
quelle