Máy giá rẻ Enigma (Cops)


15

Đối với bài đăng của kẻ cướp, máy Cheapo Enigma (Cướp)

Nội dung gửi của cảnh sát sẽ bao gồm một chương trình / chức năng chấp nhận một byte dữ liệu và trả về một byte dữ liệu. Mỗi đầu vào có thể phải tạo ra một đầu ra duy nhất. (Nói cách khác, chức năng của bạn phải là tính từ)

Những tên cướp sẽ cố gắng tạo ra chức năng nghịch đảo của bạn bằng cách sử dụng mã càng ngắn càng tốt. Vì vậy, mục tiêu của bạn là làm cho chức năng của bạn khó đảo ngược.

Bạn không thể sử dụng các phần dựng sẵn có mục đích duy nhất là băm hoặc mã hóa.

Số byte của bạn không thể vượt quá 64 byte. Các giải pháp 0 byte không đủ điều kiện để giành chiến thắng.

Định dạng đầu vào / đầu ra

8 bit (0 hoặc 1) hoặc số nguyên cơ số 10 trong phạm vi 1-256, 0-255 hoặc -128 đến 127. Có thể sử dụng I / O tiêu chuẩn hoặc I / O tệp. Hàm cũng có thể trả về một giá trị là đầu ra. Đầu vào và đầu ra phải thuộc cùng một phạm vi (nhị phân, 1-256, 0-255 hoặc -128 đến 127). Tên cướp cũng sẽ được yêu cầu sử dụng phạm vi này cho đầu vào và đầu ra.

Chấm điểm

Tỷ lệ số byte của bạn so với nỗ lực của tên cướp giỏi nhất đối với bạn. Điểm số thấp nhất chiến thắng.

Bạn đủ điều kiện để giành chiến thắng (với tư cách là cảnh sát) chỉ khi một tên cướp đã cố gắng đánh bại bạn. (Tên cướp này có thể là bạn)

Thí dụ

C ++, sử dụng phạm vi 0-255, 31 byte

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

Trình cướp có thể có trong C ++, 32 byte

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

Sử dụng cùng một ngôn ngữ hoặc một thuật toán tương tự không phải là một yêu cầu

Điều này cho điểm 31/32 = 0,97 cho cả cảnh sát và kẻ cướp.


1
Một trình cảnh sát bao gồm những gì? Ngôn ngữ, kích thước và mã chương trình / chức năng đầy đủ?
Arnauld

1
không phải là một chút hỏng nếu cảnh sát chỉ có thể làm cho một điều lớn tùy ý?
Lemon phá hủy

1
Tên cướp này có thể là bạn Điều gì xảy ra nếu tôi đăng câu trả lời của cảnh sát 64 byte ánh xạ N đến N và câu trả lời của tên cướp thực hiện điều tương tự trong một byte?
Arnauld

1
Bạn có thể muốn chỉ định nếu / cách thức gửi cảnh sát nên được cập nhật khi kẻ cướp trả lời. (Bản cập nhật "bẻ khóa" thông thường không áp dụng ở đây, tôi đoán vậy. Ít nhất không phải là một vết nứt độc đáo và dứt khoát.)
Arnauld

3
Về ý nghĩ thứ hai, bạn có thể muốn loại bỏ hoàn toàn quy tắc đó. Tôi có thể phá hủy hầu hết các câu trả lời bằng cách đăng một tên cướp trong Jelly.
Dennis

Câu trả lời:


7

Javascript, 11 8 byte, Điểm: 8/5

x=>x^x/2

Thực hiện đơn giản mã màu xám. Giải mã thông thường cần một vòng lặp. Chúng ta hãy xem ai nghĩ ra cái nhỏ nhất hoặc thậm chí không có vòng lặp!


Tôi đoán x^x/4sẽ khó hơn vì không nên có nội dung cho nó ...
Christoph


1
Làm thế nào là sinh vật này?
Leaky Nun

1
@LeakyNun Uhm không chắc bạn mong đợi câu trả lời nào nhưng tôi sẽ thử: Mã màu xám là một hình thức thay thế đại diện cho một số trong đó mỗi số liên tiếp chỉ thay đổi trong 1 bit (khoảng cách hammig luôn là 1). Đối với mỗi số có chính xác một mã hóa màu xám và một mã hóa nhị phân do đó chúng tạo thành một khối. Ví dụ 7 là 0111 ở dạng nhị phân và 0100 màu xám, số 8 tiếp theo là 1000 ở dạng nhị phân và 1100 màu xám. Mã hóa màu xám về cơ bản là mã hóa cạnh của nhị phân.
Christoph

1
@LeakyNun ^là xor bitwise, không lũy ​​thừa. Dù sao nó trông kỳ diệu
Евгений Новиков

7

C, 64 byte, Điểm 64/71 = 0,901

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

Đưa đầu vào trong phạm vi [0 255].

Hãy thử trực tuyến! - trên TIO (sử dụng GCC), điều này tạo ra:

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

Lưu ý rằng trên các hệ thống khác, nó có thể tạo ra đầu ra khác nhau (nhưng vẫn hợp lệ), vì C không bắt buộc phải randthực hiện cụ thể . Trình của tôi cụ thể là phiên bản chạy trên TIO (như được liên kết).


Tôi khá thất vọng vì tôi đã không thể có được một phiên bản như bản gốc ( f(x){return rand(srand(x*229))/229%256;}) của mình để hoạt động trên TIO, vì tôi nghĩ rằng nó thanh lịch hơn nhiều. Vì nó chỉ hoạt động trên Clang chạy trên OS X, nên nó không công bằng cho cuộc thi. Điều này vẫn còn khá khó xử để đảo ngược, vì vậy tôi đoán là đủ.


Chà..Điều này thật thú vị!
Matthew Roh

Giải pháp ở đây , nhưng tôi đã có một chút khó khăn với bạn srand(), vì vậy bạn sẽ phải quyết định xem nó có được chấp nhận trong hình thức này không.
Appleshell

Tôi không thấy làm thế nào chương trình này đáp ứng yêu cầu của bijection, vì đầu ra là ngẫu nhiên không phải mọi đầu vào đều có đầu ra duy nhất.
Đăng Rock Garf Hunter

2
Vấn đề không phải là việc thực hiện. Vấn đề là nó thiếu những gì tôi nghĩ là tất cả các ý tưởng chính của thách thức này: Tìm một thuật toán ba (do đó giới hạn ở 64 byte và độc lập với ngôn ngữ) không thể đảo ngược. Nội dung gửi của bạn "cảm thấy" có kẽ hở: Độc lập ngôn ngữ, giới hạn 64 byte bằng cách thuê ngoài đối với việc triển khai nội dung không xác định (rand không phụ thuộc vào ngôn ngữ mà là stdlib cục bộ ) và quy tắc băm / mã hóa. Nó nằm trong quy tắc của PPCG nhưng chắc chắn không phải là ghosts_in_the_code dành cho quy tắc của anh ấy.
Christoph

1
@ghosts_in_the_code RNG tốt và các hàm băm đều được thiết kế để hầu như không thể đảo ngược. Do đó, tôi nghĩ rằng chúng nên được bao gồm trong quy tắc đó (ngay cả khi việc triển khai thực tế có thể không được thiết kế theo cách này). Dù sao, tôi không đề nghị và thay đổi các quy tắc ở giai đoạn này.
Christoph


2

JavaScript, 44 byte 22/3

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

Sử dụng sắp xếp từ vựng (Mặc định Javascript) để sắp xếp lại tất cả các số từ 0-255

Hãy thử trực tuyến!


1
22/3 - ngôn ngữ khác nhau có vẻ chấp nhận được, ngay cả khi hơi kỳ quặc. Tôi nghĩ rằng tôi đã có 5, nhưng 256 đã cản trở tôi :).
Jonathan Allan


1

Javascript, 11/8 byte

x=>x**5%257

Tên miền / phạm vi là 1 đến 256.


Hừm, Javascript có tệ với số mũ lớn không? Điều này hoạt động trong Ruby: repl.it/HXvZ/0
histocrat

JavaScript chỉ có các số float chính xác kép, do đó, mọi thứ có nhiều hơn ~ 53 bit không thể được biểu diễn chính xác. x**3x**5nên làm việc.
Dennis

Vâng, phục vụ tôi ngay cho giả định. Tôi sẽ thay đổi ngôn ngữ.
lịch sử

Hoặc làm theo đề nghị của Dennis, đưa ra các quy tắc ủng hộ ngôn ngữ terser. :) Cảm ơn bạn!
lịch sử

Thật không may, các quy tắc hiện đang bị phá vỡ một chút và tôi sẽ được phép đảo ngược điều này với một ngôn ngữ khác. Chính vì giới hạn chính xác, điều này sẽ khá dài dòng để đảo ngược bằng cách sử dụng JS.
Dennis


1

Javascript, 27/29 byte

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

Chỉnh sửa: Phạm vi / Tên miền là 1..256. Được tạo ra thông qua lực lượng vũ phu, nhiều hay ít.


Đáng buồn thay, đó là tính từ nhưng không nằm trong phạm vi [0,256): giá trị 130 không bao giờ xuất ra nhưng giá trị 256 là (không phù hợp với int 8 bit).
Christoph

Điểm 27/29 . Tôi thích nó !
Christoph

1
Cảm ơn! Các quy tắc cho phép tôi chỉ định một phạm vi [1,256] và đó là tính từ trong phạm vi đó.
lịch sử

1

1
Điểm: 16/6 (Lưu ý: Tôi không nghĩ nên cho phép sử dụng ngôn ngữ khác để gửi tên cướp, nhưng tại thời điểm này, nó là.)
Dennis

1
Cũng thật thú vị khi biết liệu tôi có thể cố gắng đánh bại sự phục tùng của tên cướp bằng cách tạo một cảnh sát khác hay không (một lần nữa sử dụng Jelly hoặc MATL)
flawr


1

Ruby, 23 byte

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

Phạm vi và miền là 0..255. Ghép 228 đến chính nó x lần, sau đó lấy kết quả modulo 257 (0 ánh xạ thành 0). 228 là số ma thuật đầu tiên sau 9 hoạt động cho phạm vi này (cung cấp các giá trị riêng biệt không bao gồm 256).


0

Python 3, 55 byte

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

Tên miền / Phạm vi là 0-255.



0

Toán học, 13 byte

Mod[#^7,257]&

Sử dụng phạm vi [1..256], mặc dù nó có giá trị như nhau trên phạm vi [0..255]. Để xem toàn bộ bảng, sao chép / dán một trong các dòng mã sau vào hộp cát 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)

0

Brainfuck , 37/11

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

Hãy thử trực tuyến!

Không tốt lắm nhưng tầm 0-255



@Dennis Làm tốt lắm! Tôi không nên sử dụng ngôn ngữ tạm biệt như vậy.
Christopher

3
Nhân tiện, kiểm duyệt tên ngôn ngữ không phải là một ý tưởng tốt. Vâng, ngôn ngữ cụ thể này có một tên bình thường và trẻ con, nhưng mọi người đều biết dấu hoa thị là gì và công cụ tìm kiếm không thể tìm thấy ở dạng hiện tại.
Dennis

@Dennis cuối cùng đã sửa nó
Christopher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.