Máy giá rẻ Enigma (Cướp)


8

Đối với bài của cảnh sát, máy Cheapo Enigma (Cops)

Việc đệ trình của một tên cướp bao gồm một chương trình / chức năng chấp nhận đầu ra của mã của cảnh sát và trả về đầu vào cho tất cả các đầu ra được cung cấp bởi mã của cảnh sát đó. (Nói cách khác, bạn phải viết hàm nghịch đảo)

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

Đị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ư trong, nhị phân, 1-256, 0-255 hoặc -128 đến 127), cũng phải cùng phạm vi với phạm vi được sử dụng bởi cảnh sát.

Chấm điểm

Tỷ lệ số byte của cảnh sát so với số byte của bạn. Điểm số cao nhất chiến thắng.

Bạn có thể gửi một vụ cướp đối với mã cảnh sát của riêng bạn để tham khảo. (Tất nhiên mã này không đủ điều kiện để chiến thắng)

Thông báo

Vui lòng chỉnh sửa câu trả lời của cảnh sát tương ứng để bao gồm số byte mới của bạn và tỷ lệ tương ứng.


2
Lúc đầu, tôi đã tự hỏi làm thế nào bạn sẽ biến Emigna thành một cái máy. Sau đó tôi nhận ra bạn không nói về người dùng.
Bạch tuộc ma thuật Urn

OK, xin lỗi vì đã làm phiền bạn một lần nữa, nhưng tôi muốn chắc chắn rằng tôi đã hiểu đúng vào lúc này. Nếu câu trả lời brainfuck đọc và in byte (mã điểm 0 đến 255) và câu trả lời Jelly của tôi lấy một số nguyên từ 0 đến 255 và trả về một số nguyên trong cùng phạm vi, điều đó có được chấp nhận không?
Dennis

@Dennis Không, không phải vậy. Có lẽ bạn (hoặc ai đó) có thể đề xuất một từ ngữ thay thế làm cho điều này rõ ràng hơn.
ghosts_in_the_code

@carusocomputing Emigna là một cái máy, phải không? Anh ta có mỗi chương trình 05AB1E được tải lên trong hệ thống bộ nhớ của mình, phải không?
caird coinheringaahing

Câu trả lời:


3

JavaScript của Christoph , 25/8

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

(phạm vi 0-255)

Đáng buồn thay, f=(y,x)=>y?f(y/2,x^y):xhoạt động cho tất cả các giá trị ngoại trừ 0.

Ghi chú kỹ thuật

Chúng tôi sử dụng y/2chứ không phải y>>1để lưu một byte. Điều này đang lạm dụng thực tế là bất kỳ giá trị nào ycuối cùng sẽ được làm tròn thành 0do dòng chảy số học .



2

C, bởi 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;}

Hãy thử nó ở đây !

C, phiên bản ngắn hơn, 64/89 71

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

Đây là một triển khai cụ thể hơn, nhưng hoạt động trên TIO. Cùng độ dài với giải pháp PHP, tôi không thể có được nó ngắn hơn thế này.

Hãy thử nó ở đây !


Ok tôi sẽ đưa nó lên với cảnh sát đệ trình sau đó. Cảm ơn đã thông báo cho tôi.
Ad Hoc Garf Hunter



1

Thạch , 22/3 = 7 1/3

⁹ḶDÞḊi

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

Việc gửi cảnh sát bởi fəˈnɛtɪk là trả về số thập phân được sắp xếp theo thứ tự từ điển thứ n ( 0 -exexed) bằng cách sử dụng tên miền [0,255] .

Lần đầu tiên tôi theo nghĩa đen đảo ngược các hoạt động mô tả, ⁹ḶDÞi⁸‘- mất khoảng hạ của 256 , ⁹ḶÞchỉ thị để sắp xếp nó bằng một chức năng quan trọng của chuyển đổi vào một danh sách số thập phân, D; sau đó tìm chỉ mục của ,, iđầu vào và trừ 1 , (danh sách Jelly là 1 -exexed).

Sau đó, tôi đánh gôn nó bằng cách sắp xếp danh sách đã sắp xếp với . Khi một mục không được tìm thấy itrả về 0 theo yêu cầu cho phần tử đầu tiên bị xóa ( 0 ), trong khi mọi thứ khác được tìm thấy trước đó, cho phép loại bỏ phần giảm , từ đó đưa ra iđầu vào ẩn bên phải từ bên trái (chỉ ) đầu vào liên kết đơn âm.



1

Javascript bởi lịch sử, 27/29

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

Đáng buồn thay, hai mã hóa cứng là cần thiết để phá vỡ nó. Lưu ý rằng hàm ban đầu không ánh xạ bất kỳ giá trị nào tới 130 nhưng ánh xạ giá trị thành 256 .


1
Có 256 trong phạm vi là hợp pháp theo quy tắc ("8 bit (0 hoặc 1) hoặc số nguyên cơ số 10 trong phạm vi 1-256"). Tuy nhiên, đây vẫn là một Robber hợp lệ trong phạm vi đó!
lịch sử

1

PHP, Điểm 64/71

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

May mắn thay, PHP randchỉ chuyển tiếp đến stdlib như C. Vì vậy, điều này hoạt động miễn là chúng ta sử dụng cùng một stdlib. Điều này có nghĩa là nó hoạt động trên TIO nhưng không phải trên sandbox.onlinephpfifts.com . Phiên bản hiện tại của mã Dave chỉ lặp lại theo chuỗi giả ngẫu nhiên và trả về giá trị duy nhất thứ n nên tôi đoán có thể có câu trả lời ngắn hơn nhiều nếu một ngôn ngữ chơi gôn cũng sử dụng stdlib.

Đây là một triển khai mã của Dave không phụ thuộc vào stdlib. Điều đó cũng có thể giúp đỡ.


+1 để tìm cách chuyển ngôn ngữ trên trang này! Bất cứ ý tưởng tại sao điều này không cần thiết srand(1)? Ngoài ra đây là một thử trực tuyến!
Dave

@Dave srand(x&&f(x-1))điều này chỉ dừng lại nếu x==0do đó nó được gieo hạt 0vào vòng đầu tiên. Không chắc chắn tại sao các cuộc gọi tiếp theo không thay đổi nó.
Christoph

@Dave có vẻ như srand(0)phá vỡ rand(xem ở đây ). Tôi đoán srand(0)tự động được thăng chức srand(1). Tôi đoán rằng nếu bạn có thể sử dụng một hạt giống khác nhau mỗi lần nó sẽ khó hơn rất nhiều để phá vỡ nó.
Christoph

Thật thú vị khi điều này hoạt động. Có vẻ là cụ thể đối với phiên bản stdlib được sử dụng trên TIO, hành vi trong C trên đó rõ ràng là giống nhau, trong khi trên máy cục bộ của tôi với tiếng kêu, nó yêu cầu gọi lại srand với 0 resp. 1 trên mỗi lần lặp, thay vì chỉ gọi nó một lần với 0.
Appleshell

1
@Appleshell có vẻ nghi ngờ của Christoph là chính xác: glibc có một kiểm tra đặc biệt. Xem tại đây: stackoverflow.com/a/8049852/1180785 (vì bạn đề cập đến tiếng kêu, tôi đoán địa phương của bạn là OSX, vì vậy không có glibc)
Dave





0

Thạch , 11/8

*205%257

Hãy thử trực tuyến để xem toàn bộ bảng.

Trong trường hợp đệ trình tên cướp trong một ngôn ngữ khác không được phép trong tương lai, tôi gọi dibs về giải pháp sau đây.

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


0

C (gcc) bởi bijan, 32/30

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

Có một thời gian vui vẻ chơi golf nó, cảm ơn! x=cho phép bỏ qua trả lại với gcc và tcc (bạn có thể muốn thay đổi câu trả lời của mình để đưa nó vào). g(--x)*205+51&255là nghịch đảo.


0

Thạch , 37/11

O_77×191%⁹Ọ

Sử dụng định dạng I / O giống như cảnh sát. Không chắc chắn nếu điều đó là bắt buộc.

Hãy thử trực tuyến để xem toàn bộ bảng.

Làm thế nào nó hoạt động

Đối với đầu vào n , câu trả lời của cảnh sát sẽ tính f (n): = ((((n + 5)% 256 × 2)% 256 + 2)% 256 × 9)% 256 . Vì %là toán tử tuyến tính, điều này tương đương với f (n) = (((n + 5) × 7 + 2) × 9)% 256 . Mở rộng thuật ngữ đúng, chúng tôi nhận được f (n) = (63n + 333)% 256 = (63n + 77)% 256 .

Đảo ngược điều này là khá đơn giản. Để hoàn tác bổ sung, chúng ta chỉ cần trừ 77 . Ngoài ra, vì 191 × 63% = 256% 12.033 256 = 1 , nó sau đó 19163 's modulo ngược 256 , vì vậy nhân với 191 Undoes nhân với 63 . Bằng cách này, g (n) = (n - 77) × 191% 256 xác định nghịch đảo của f .

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.