Mesin Enigma Cheapo (Polisi)


15

Untuk pos perampok, mesin Enigma Cheapo (Perampok)

Pengajuan polisi akan terdiri dari program / fungsi yang menerima satu byte data dan mengembalikan satu byte data. Setiap input yang mungkin harus menghasilkan output yang unik. (Dengan kata lain, fungsi Anda harus bijective)

Perampok akan berusaha membuat fungsi terbalik Anda menggunakan kode sesingkat mungkin. Jadi tujuan Anda adalah membuat fungsi Anda sulit untuk dibalik.

Anda tidak dapat menggunakan bawaan yang memiliki tujuan hashing atau enkripsi.

Hitungan byte Anda tidak boleh melebihi 64 byte. Solusi 0-byte tidak memenuhi syarat untuk menang.

Input / Output format

8 bit (0 atau 1), atau integer basis-10 dalam rentang 1-256, 0-255 atau -128 hingga 127. Dapat menggunakan I / O standar atau file I / O. Fungsi juga dapat mengembalikan nilai sebagai output. Input dan output harus berada dalam kisaran yang sama (biner, 1-256, 0-255 atau -128 hingga 127). Perampok juga akan diminta untuk menggunakan rentang ini untuk input dan output.

Mencetak gol

Rasio jumlah byte Anda dengan upaya perampok terbaik melawan Anda. Skor terendah menang.

Anda berhak untuk menang (sebagai polisi) hanya jika perampok telah berusaha untuk mengalahkan Anda. (Perampok ini mungkin Anda)

Contoh

C ++, menggunakan rentang 0-255, 31 byte

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

Kemungkinan pengiriman robber dalam C ++, 32 byte

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

Menggunakan bahasa yang sama atau algoritma serupa bukanlah suatu keharusan

Ini memberikan skor 31/32 = 0,97 untuk polisi dan perampok.


1
Terdiri dari apa pengajuan polisi? Bahasa, ukuran dan kode program / fungsi lengkap?
Arnauld

1
bukankah itu sedikit rusak jika polisi bisa membuat hal yang besar secara sewenang-wenang?
Destructible Lemon

1
Perampok ini mungkin Anda. Bagaimana jika saya mengirim jawaban polisi 64 byte yang memetakan N ke N dan jawaban perampok yang melakukan hal yang sama dalam satu byte?
Arnauld

1
Anda mungkin ingin menentukan apakah / bagaimana pengajuan polisi harus diperbarui ketika perampok menjawabnya. (Pembaruan "retak" yang biasa tidak berlaku di sini, kurasa. Setidaknya bukan sebagai retakan yang unik dan definitif.)
Arnauld

3
Setelah dipikir-pikir, Anda mungkin ingin menghapus aturan itu sama sekali. Saya dapat menghancurkan sebagian besar jawaban dengan memposting perampok di Jelly.
Dennis

Jawaban:


7

Javascript, 11 8 bytes, Score: 8/5

x=>x^x/2

Implementasi sederhana dari kode abu-abu. Decoding biasanya membutuhkan seluruh loop. Mari kita lihat siapa yang menghasilkan yang terkecil atau bahkan tanpa loop!


Saya kira x^x/4akan lebih sulit karena seharusnya tidak ada builtin untuk itu ...
Christoph


1
Bagaimana bijective ini?
Leaky Nun

1
@ LeakyNun Uhm tidak yakin jawaban seperti apa yang Anda harapkan, tetapi saya akan coba: Kode abu-abu adalah bentuk alternatif mewakili angka di mana setiap angka berurutan hanya berubah dalam 1 bit (jarak hammig selalu 1). Untuk setiap angka ada satu pengkodean abu-abu dan satu pengkodean biner karena itu mereka membentuk sebuah bijection. Misalnya 7 adalah 0111 dalam biner dan 0100 dalam abu-abu, angka 8 berikutnya adalah 1000 dalam biner dan 1100 dalam abu-abu. Pengkodean abu-abu pada dasarnya adalah pengodean tepi dari biner.
Christoph

1
@ LeakyNun ^adalah bitwise xor, bukan eksponensial. Pokoknya itu terlihat ajaib
Евгений Новиков

7

C, 64 byte, Skor 64/71 = 0,901

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

Mengambil input dalam kisaran [0 255].

Cobalah online! - pada TIO (menggunakan GCC), ini menghasilkan:

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

Perhatikan bahwa pada sistem lain, mungkin menghasilkan output yang berbeda (tetapi masih valid), karena C tidak mengamanatkan randimplementasi tertentu . Kiriman saya adalah versi khusus yang berjalan pada TIO (sebagaimana ditautkan).


Saya cukup kecewa bahwa saya tidak bisa mendapatkan versi seperti asli saya ( f(x){return rand(srand(x*229))/229%256;}) untuk bekerja di TIO, karena saya pikir itu jauh lebih elegan. Karena itu hanya bekerja pada Dentang berjalan pada OS X, itu tidak adil untuk kompetisi. Yang ini masih agak canggung untuk berbalik, jadi kurasa sudah cukup.


Yah..Ini lucu!
Matius Roh

Solusi di sini , tapi saya agak kesulitan dengan Anda srand(), jadi Anda harus memutuskan apakah itu dapat diterima dalam formulir ini.
Appleshell

Saya gagal melihat bagaimana program ini memenuhi persyaratan Bijection, karena output acak tidak setiap input memiliki output unik.
Posting Rock Garf Hunter

2
Masalahnya bukan implementasinya. Masalahnya adalah bahwa itu tidak memiliki apa yang saya pikir semua ide kunci dari tantangan ini: Menemukan algoritma trival (oleh karena itu terbatas pada 64 byte dan bahasa independen) yang tidak dapat dibatalkan. Kiriman Anda "terasa" untuk dilonggarkan pada: Kemandirian bahasa, batas 64 byte dengan melakukan outsourcing ke implementasi bawaan yang tidak diketahui (rand tidak bergantung pada bahasa tetapi stdlib lokal ) dan aturan hash / enkripsi. Itu ada dalam aturan PPCG, tetapi jelas bukan apa yang dimaksudkan ghosts_in_the_code dengan aturannya.
Christoph

1
@ghosts_in_the_code RNGs dan fungsi hash yang baik dirancang agar hampir tidak dapat dibalik. Karena itu saya pikir mereka harus dimasukkan dalam aturan itu (bahkan jika implementasi sebenarnya mungkin tidak dirancang dengan cara ini). Lagi pula saya tidak merekomendasikan mengubah aturan pada tahap ini.
Christoph


2

JavaScript, 44 byte 22/3

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

Menggunakan pengurutan leksikografis (Javascript Default) untuk mengatur ulang semua angka dari 0-255

Cobalah online!


1
22/3 - bahasa yang berbeda tampaknya dapat diterima, meskipun sedikit aneh. Saya pikir saya punya 5, tetapi 256 menghalangi saya :).
Jonathan Allan


1

Javascript, 11/8 bytes

x=>x**5%257

Domain/range is 1 through 256.


Hm, is Javascript bad with large number exponents? This works in Ruby: repl.it/HXvZ/0
histocrat

JavaScript only has double-precision floats, so anything with more than ~53 bits cannot be represented exactly. x**3 and x**5 should work.
Dennis

Well, serves me right for assuming. I'll change languages.
histocrat

Or do Dennis's suggestion, given the rules favoring terser languages. :) Thank you!
histocrat

Unfortunately, the rules are a bit broken at the moment, and I would be allowed to invert this with another language. Precisely because of the precision limit, this will be rather verbose to invert using JS.
Dennis


1

Javascript, 27/29 bytes

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

Python 3, 32 bytes 32/23

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

Domain/Range is 0-255.

Flips the first four bytes with the last four, and adds a three to the first bytes.



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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.