Cheapo Enigma Maschine (Cops)


15

Für Räuberpost , Cheapo Enigma-Maschine (Räuber)

Die Übermittlung eines Polizisten besteht aus einem Programm / einer Funktion, die ein einzelnes Datenbyte akzeptiert und ein einzelnes Datenbyte zurückgibt. Jede mögliche Eingabe muss eine eindeutige Ausgabe erzeugen. (Mit anderen Worten, Ihre Funktion muss bijektiv sein)

Räuber werden versuchen, Ihre Umkehrfunktion mit einem möglichst kurzen Code zu erzeugen. Ihr Ziel ist es also, die Invertierbarkeit Ihrer Funktion zu erschweren.

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

Ihre Byteanzahl darf 64 Bytes nicht überschreiten. 0-Byte-Lösungen sind nicht gewinnberechtigt.

Eingabe- / Ausgabeformat

8 Bits (0 oder 1) oder eine Ganzzahl zur Basis 10 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. Eingang und Ausgang sollten im selben Bereich liegen (binär, 1-256, 0-255 oder -128 bis 127). Der Räuber muss diesen Bereich auch für die Ein- und Ausgabe verwenden.

Wertung

Das Verhältnis Ihrer Byteanzahl zu dem des besten Räuberversuchs gegen Sie. Die niedrigste Punktzahl gewinnt.

Sie sind nur dann zum Sieg berechtigt (als Polizist), wenn ein Räuber versucht hat, Sie zu besiegen. (Dieser Räuber kann Sie sein)

Beispiel

C ++ verwendet einen Bereich von 0 bis 255 (31 Byte)

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

Mögliche Raubübermittlung in C ++, 32 Bytes

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

Die Verwendung derselben Sprache oder eines ähnlichen Algorithmus ist nicht erforderlich

Dies ergibt eine Punktzahl von 31/32 = 0,97 sowohl für den Polizisten als auch für den Räuber.


1
Woraus besteht ein Cop-Beitrag? Sprache, Größe und vollständiger Programm- / Funktionscode?
Arnauld

1
Ist es nicht ein bisschen kaputt, wenn der Bulle einfach eine willkürlich große Sache machen kann?
Destructible Lemon

1
Dieser Räuber könnten Sie sein. Was ist, wenn ich eine 64-Byte-Antwort von Cop, die N auf N abbildet, und eine Räuberantwort, die dasselbe in einem Byte tut, poste?
Arnauld

1
Sie können angeben, ob und wie die Cop-Übermittlung aktualisiert werden soll, wenn Räuber darauf antworten. (Das übliche "geknackte" Update trifft hier wohl nicht zu. Zumindest nicht als eindeutiger und endgültiger Riss.)
Arnauld,

3
Beim zweiten Gedanken möchten Sie diese Regel vielleicht ganz entfernen. Ich kann die meisten Antworten zerstören, indem ich einen Räuber in Jelly poste.
Dennis

Antworten:


7

Javascript, 11 8 Bytes, Ergebnis: 8/5

x=>x^x/2

Einfache Implementierung von Gray Code. Das Dekodieren benötigt normalerweise eine ganze Schleife. Mal sehen, wer mit der kleinsten oder sogar ohne Schleife kommt!


Ich denke, es x^x/4wird schwieriger sein, weil es dafür keine Buildins geben sollte ...
Christoph


1
Wie ist das Bijektiv?
Undichte Nonne

1
@LeakyNun Ich bin mir nicht sicher, welche Art von Antwort Sie erwarten, aber ich werde es versuchen: Gray-Code ist eine alternative Form der Darstellung einer Zahl, bei der sich jede fortlaufende Zahl nur in 1 Bit ändert (Hammig-Abstand ist immer 1). Für jede Zahl gibt es genau eine Graukodierung und eine Binärkodierung, daher bilden sie eine Bijektion. Beispiel: 7 ist 0111 in binär und 0100 in grau, die nächste Zahl 8 ist 1000 in binär und 1100 in grau. Gray-Codierung ist im Grunde die Kantencodierung von Binär.
Christoph

1
@LeakyNun ^ist bitweise xoder nicht Exponentiation. Wie auch immer, es sieht magisch aus
Евгений Новиков

7

C, 64 Bytes, Score 64/71 = 0,901

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

Übernimmt Eingaben im Bereich [0 255].

Probieren Sie es online! - Auf TIO (mit GCC) erzeugt dies:

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

Beachten Sie, dass es auf anderen Systemen zu einer anderen (aber immer noch gültigen) Ausgabe kommen kann, da C keine bestimmte randImplementierung erfordert . Mein Beitrag ist speziell die Version, die auf TIO läuft (wie verlinkt).


Ich bin ziemlich enttäuscht, dass ich nicht in der Lage war, eine Version wie meine original ( f(x){return rand(srand(x*229))/229%256;}) auf TIO zu bringen, da ich das für viel eleganter halte. Da das nur auf Clang unter OS X funktioniert, ist es nicht fair für die Konkurrenz. Es ist immer noch ziemlich umständlich, das rückgängig zu machen, also reicht es wohl.


Nun ... Das ist amüsant!
Matthew Roh

Lösung hier , aber ich hatte ein bisschen Probleme mit Ihrer srand(), so dass Sie sich entscheiden müssen, ob es in dieser Form akzeptabel ist.
Apfelschale

Ich verstehe nicht, wie dieses Programm die Bijection-Anforderung erfüllt, da die Ausgabe zufällig ist und nicht jede Eingabe eine eindeutige Ausgabe hat.
Weizen-Assistent

2
Das Problem ist nicht die Umsetzung. Das Problem ist, dass es meiner Meinung nach an den wichtigsten Ideen für diese Herausforderung mangelt: Einen Trivalisierungsalgorithmus zu finden (daher auf 64 Byte begrenzt und sprachunabhängig), der sich nicht umkehren lässt. Ihre Eingabe "fühlt" sich lückenhaft an: Sprachunabhängigkeit, die 64-Byte-Grenze durch Auslagerung an eine unbekannte Implementierung eines eingebauten (rand hängt nicht von der Sprache, sondern von der lokalen stdlib ab ) und der Hash- / Verschlüsselungsregel. Es entspricht den Regeln von PPCG, aber bestimmt nicht dem, was ghosts_in_the_code mit seinen Regeln beabsichtigt hat.
Christoph

1
@ghosts_in_the_code Gute RNGs und Hash-Funktionen sind beide so konzipiert, dass sie kaum umkehrbar sind. Aus diesem Grund denke ich, dass sie in diese Regel aufgenommen werden sollten (auch wenn die tatsächliche Implementierung möglicherweise nicht so gestaltet ist). Jedenfalls empfehle ich nicht, die Regeln zu diesem Zeitpunkt zu ändern.
Christoph


2

JavaScript, 44 Bytes 22/3

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

Verwendet die lexikografische Sortierung (Standardeinstellung Javascript), um alle Zahlen von 0 bis 255 neu anzuordnen

Probieren Sie es online!


1
22/3 - Eine andere Sprache scheint akzeptabel, auch wenn sie etwas merkwürdig ist. Ich dachte, ich hätte 5, aber 256 stören mich :).
Jonathan Allan


1

Javascript, 11/8 Bytes

x=>x**5%257

Domain / Bereich ist 1 bis 256.


Hm, ist Javascript bei vielen Exponenten schlecht? Dies funktioniert in Ruby: repl.it/HXvZ/0
histocrat

JavaScript hat nur Gleitkommazahlen mit doppelter Genauigkeit, daher kann nichts mit mehr als ~ 53 Bit genau dargestellt werden. x**3und x**5sollte funktionieren.
Dennis

Nun, dient mir richtig zur Annahme. Ich werde die Sprache wechseln.
Histokrat

Oder machen Sie Dennis 'Vorschlag, wenn die Regeln für tersere Sprachen gelten. :) Vielen Dank!
Histokrat

Leider sind die Regeln im Moment ein bisschen gebrochen, und ich würde das mit einer anderen Sprache umkehren dürfen. Gerade wegen der Genauigkeitsbeschränkung ist dies beim Invertieren mit JS ziemlich ausführlich.
Dennis


1

Javascript, 27/29 Bytes

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

Bearbeiten: Bereich / Domain ist 1..256. Mehr oder weniger durch rohe Gewalt erzeugt.


Leider ist es bijektiv, aber nicht im Bereich [0,256]: Der Wert 130 wird nie ausgegeben, aber ein Wert von 256 (was nicht für ein 8-Bit-Int passt).
Christoph

Ergebnis 27/29 . Ich mag das !
Christoph

1
Vielen Dank! Die Regeln erlauben es mir, einen Bereich von [1,256] anzugeben, und dieser Bereich ist bijektiv.
Histokrat



1

Ruby, 23 Bytes

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

Reichweite und Domain sind 0..255. Verketten Sie 228 x-mal mit sich selbst, und nehmen Sie dann das Ergebnis modulo 257 (0 ordnet 0 zu). 228 ist die erste magische Zahl nach 9, die für diesen Bereich gilt (gibt eindeutige Werte ohne 256 an).


0

Python 3, 55 Bytes

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

Domain / Range ist 0-255.


0

Python 3, 32 Bytes 32/23

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

Domain / Range ist 0-255.

Kehrt die ersten vier Bytes mit den letzten vier Bytes um und fügt den ersten Bytes eine Drei hinzu.



0

Mathematica, 13 Bytes

Mod[#^7,257]&

Verwendet den Bereich [1..256], obwohl er auch für den Bereich [0..255] gültig ist. Kopieren Sie eine der folgenden Codezeilen in die Wolfram-Sandbox, um die gesamte Tabelle anzuzeigen :

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)

0

Brainfuck , 37/11

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

Probieren Sie es online!

Nicht sehr gut, aber Bereich von 0-255



@ Tennis Gute Arbeit! Ich sollte eine solche Bytesprache nicht verwenden.
Christopher

3
Das Zensieren von Sprachnamen ist übrigens keine gute Idee. Ja, diese bestimmte Sprache hat einen gewöhnlichen und kindischen Namen, aber jeder weiß, wofür der Stern steht, und er kann von der Suchmaschine in der aktuellen Form nicht gefunden werden.
Dennis

@Dennis endlich behoben, dass
Christopher
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.