チープエニグママシン(警官)


15

強盗の投稿、Chepo Enigmaマシン(強盗)

警官の提出は、1バイトのデータを受け入れ、1バイトのデータを返すプログラム/関数で構成されます。可能な入力はすべて、一意の出力を生成する必要があります。(つまり、関数は全単射でなければなりません)

強盗は、可能な限り短いコードを使用して、あなたの逆関数を作成しようとします。だからあなたの目的は、あなたの機能を逆転させることを困難にすることです。

ハッシュまたは暗号化のみを目的とするビルトインを使用することはできません。

バイト数は64バイトを超えることはできません。0バイトのソリューションは勝ちません。

入出力フォーマット

8ビット(0または1)、または範囲1〜256、0〜255、または-128〜127の10進整数。標準I / OまたはファイルI / Oを使用できます。関数は、出力として値を返すこともできます。入力と出力は同じ範囲(バイナリ、1〜256、0〜255または-128〜127)に属している必要があります。この範囲を入力および出力に使用するには、強盗も必要です。

得点

あなたに対する最高の強盗の試みのそれに対するあなたのバイト数の比率。最低スコアが勝ちます。

強盗があなたを倒そうとした場合にのみ、(警官として)勝利する資格があります。(この強盗はあなたかもしれません)

C ++、0〜255の範囲、31バイトを使用

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

C ++での強盗の送信、32バイト

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

同じ言語または類似のアルゴリズムを使用することは必須ではありません

これにより、警官と強盗の両方に31/32 = 0.97のスコアが与えられます。


1
警官の提出物は何で構成されていますか?言語、サイズ、完全なプログラム/機能コード?
アーナルド

1
警官がarbitrarily意的に大きなものを作ることができれば、それは少し壊れていませんか?
破壊可能なレモン

1
この強盗はあなたかもしれません NをNにマッピングする64バイトの警官の答えと1バイトで同じことをする強盗の答えを投稿したらどうでしょうか?
アーナルド

1
強盗が応答したときに警官の提出を更新するかどうか/どのように更新するかを指定できます。(通常の「クラック」アップデートはここでは適用されません。少なくともユニークで決定的なクラックとしてではありません。)
Arnauld

3
考え直して、そのルールを完全に削除することもできます。ゼリーに強盗を投稿することで、ほとんどの回答を破棄できます。
デニス

回答:


7

Javascriptを、11 8バイト、スコア:8月5日

x=>x^x/2

グレーコードの簡単な実装。通常、デコードにはループ全体が必要です。誰が最小のループを思いつくか、ループなしで考えてみましょう!


それのx^x/4ための組み込みがあるべきではないので、私は難しいと思います...-
クリストフ


1
この全単射はどうですか?
リーキー修道女

1
@LeakyNun Uhmはあなたがどのような答えを期待するかわからないが、試してみる:グレーコードは、連続する各数字が1ビットでのみ変化する数字を表す代替形式です(ハミグ距離は常に1)。各数値に対して、グレーエンコーディングとバイナリエンコーディングがそれぞれ1つずつ存在するため、全単射を形成します。たとえば、7はバイナリで0111、グレーで0100で、次の数字8はバイナリで1000、グレーで1100です。グレーコーディングは、基本的にバイナリのエッジコーディングです。
クリストフ

1
@LeakyNun ^はビット単位のxorであり、べき乗ではありません。とにかくそれは魔法に見える
ЕвгенийНовиков

7

C、64バイト、スコア64/71 = 0.901

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

[0 255]の範囲の入力を取ります。

オンラインでお試しください!— TIO(GCCを使用)では、これにより以下が生成されます。

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

Cは特定のrand実装を要求していないため、他のシステムでは異なる(しかしまだ有効な)出力を生成する可能性があることに注意してください。私の提出物は、具体的にはTIOで実行されているバージョンです(リンクされているとおり)。


私は、オリジナル(f(x){return rand(srand(x*229))/229%256;})のようなバージョンをTIOで動作させることができなかったことに非常に失望しています。これはOS Xで実行されているClangでのみ機能するため、競合他社にとって公平ではありません。これはまだ反転するのがかなり厄介なので、それで十分だと思います。


まあ..これは面白いです!
マシュー盧

ここでの解決策ですが、あなたのには少し苦労しましたsrand()ので、この形式で受け入れられるかどうかを判断する必要があります。
アップルシェル

出力がランダムであるため、このプログラムが全単射の要件をどのように満たしているかを確認できません。すべての入力に一意の出力があるわけではありません。
ポストロックガーフハンター

2
問題は実装ではありません。問題は、この挑戦​​のすべての重要な考えであると思うものが欠けていることです:逆転するのに非自明な三値アルゴリズム(したがって、64バイトに制限され、言語に依存しない)を見つける。あなたの投稿は抜け穴に「感じ」ます:言語の独立性、組み込みの未知の実装へのアウトソーシングによる64バイトの制限(randは言語ではなくローカルのstdlibに依存します)およびハッシュ/暗号化ルール。PPCGのルールの範囲内ですが、ghosts_in_the_codeが彼のルールで意図したものではありません。
クリストフ

1
@ghosts_in_the_code優れたRNGとハッシュ関数は両方とも、ほとんど元に戻らないように設計されています。したがって、実際の実装がこのように設計されていない場合でも、それらをそのルールに含める必要があると思います。とにかく、この段階でルールを変更することはお勧めしません。
クリストフ




1

Javascript、11/8バイト

x=>x**5%257

ドメイン/範囲は1〜256です。


ええと、Javascriptは大きな指数で悪いのですか?これはRubyで動作します:repl.it/HXvZ/0
histocrat

JavaScriptには倍精度の浮動小数点数しかありません。したがって、53ビットを超えるものは正確に表現できません。x**3そして、x**5動作するはずです。
デニス

まあ、私を推測するのにぴったりです。言語を変更します。
-histocrat

または、より簡潔な言語を優先する規則を考えて、デニスの提案を行います。:) ありがとうございました!
-histocrat

残念ながら、現時点ではルールが少し破られており、別の言語でこれを逆にすることができます。精度の制限のために、これはJSを使用して反転するにはかなり冗長です。
デニス


1

Javascript、27/29バイト

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

Edit: Range/Domain is 1..256. Generated via brute force, more or less.


Sadly it's bijective but not in range [0,256): the value of 130 is never outputted but a value of 256 is (which doesn't fit a 8 bit int).
Christoph

Score 27 / 29. I like it !
Christoph

1
Thanks! The rules allow me to specify a range of [1,256], and it's bijective on that range.
histocrat

1

Octave, 16/6

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

Try it online!


1
Score: 16/6 (Note: I don't think it should be allowed to use another language for the robber submission, but at this point, it is.)
Dennis

1
It would also be interesting to know whether I can try to beat your robber submission by making another cop (again using Jelly or MATL too)
flawr


1

Ruby, 23 bytes

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

Range and domain is 0..255. Concatenate 228 to itself x times, then take the result modulo 257 (0 maps to 0). 228 is the first magic number after 9 that works for this range (gives distinct values that don't include 256).


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 is 0-255.



0

Mathematica, 13 bytes

Mod[#^7,257]&

Uses the range [1..256], although it's equally valid on the range [0..255]. To see the entire table, copy/paste one of the following lines of code into the Wolfram sandbox:

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

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

Try it online!

Not very good but range of 0-255



@Dennis Nice job! I should not use such a bytey language.
Christopher

3
By the way, censoring language names isn't a good idea. Yes, this particular languages has an ordinary and childish name, but everyone knows what the asterisk stands for, and it cannot be found by the search engine in its current form.
Dennis

@Dennis finally fixed that
Christopher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.