Ẩn nghịch đảo (Chủ đề của cảnh sát)


35

Đây là một câu đố chủ đề của tên cướp có thể được tìm thấy ở đây .

Nhiệm vụ của bạn sẽ là hai viết hai chương trình (hoặc hàm) sao cho chúng là đảo chữ của nhau và một chương trình thực hiện nghịch đảo bên trái của chương trình kia. Các chương trình này có thể chấp nhận và xuất ra nhiều số nguyên hoặc số phức như bạn muốn. Nếu bạn chọn lấy số làm điểm ký tự hoặc bất kỳ phương tiện hợp lý nào khác, bạn phải cho biết bạn đang làm như vậy trong câu trả lời của mình. Nếu bạn chọn hạn chế miền của chức năng, bạn cũng phải chỉ ra miền bị hạn chế trong câu trả lời của mình.

Sau đó, bạn sẽ trình bày chương trình đầu tiên dưới dạng câu trả lời với ẩn trái để cho kẻ cướp tìm thấy.

Chương trình được hiển thị phải thực hiện chức năng tiêm chích (nếu không sẽ không thể tồn tại câu trả lời ẩn).

Nếu câu trả lời của bạn chưa bị bẻ khóa trong một tuần, bạn có thể tiết lộ câu trả lời ẩn và đánh dấu nó là an toàn . Câu trả lời an toàn không thể bị bẻ khóa bởi những tên cướp và sẽ không bị bẻ khóa vô thời hạn.

Mục tiêu sẽ là tạo ra câu trả lời không bị bẻ khóa ngắn nhất tính bằng byte.

Thí dụ

Bạn có thể hiển thị chương trình python sau đây thêm một vào đầu vào

lambda x:~-x

Một giải pháp có thể là:

lambda x:-~x

Điều này trừ một từ đầu vào


Chúng ta có thể có số nguyên tưởng tượng / phức tạp?
Stewie Griffin

@stewie nếu bạn chỉ ra như vậy bạn có thể
Wheat Wizard

1
Là đảo chữ được định nghĩa là hoán vị các ký tự hay hoán vị các byte (trong các ngôn ngữ không sử dụng bộ ký tự một byte)?

1. " Sau đó, bạn sẽ trình bày một trong các chương trình " dường như gợi ý rằng chúng tôi có thể chọn trình bày, nhưng câu tiếp tục " ẩn trái ", ngụ ý rằng chúng tôi phải trình bày một chương trình cụ thể. Đó là cái gì 2. Câu hỏi nêu cụ thể " chương trình " và dường như không cho phép các chức năng, nhưng ví dụ là một chức năng chứ không phải là một chương trình. Đó là cái gì
Peter Taylor

Viết hoa có vấn đề gì không?
Kritixi Lithos

Câu trả lời:


12

Python 3, 80 byte ( Cracked )

bhmq = int(input())
print(bhmq ** 2)
(1 or [(sqrt),(specification+of*integerr)])

Tên miền: số nguyên dương. Chức năng chỉ là bình phương của một số. Nhập vào stdin, đầu ra cho thiết bị xuất chuẩn, cũng như trong hàm nghịch đảo. Lưu ý rằng Python bỏ qua dòng thứ ba ở đây, vì nó có giá trị về mặt cú pháp và 1 đã là một giá trị trung thực, do đó Python thậm chí không xem liệu phần bên phải của 'hay' được xác định rõ.

Những tên cướp nên viết một hàm sqrt sẽ hoạt động chính xác trên tất cả các ô vuông khác không, in giá trị nguyên như không có dấu phẩy động (vì vậy, đầu ra '4' phải là '2' hoặc '2 \ n', không phải '2.0' hoặc '2.0 \ n').


1
Tôi thích cái này. Rất khó để bẻ khóa
Thuật sĩ lúa mì

3
Chào mừng bạn đến với ppcg! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

1
Không bao giờ trên vết nứt đó, tôi rối tung lên. Câu hỏi vẫn còn mặc dù.
orlp

1
Tôi sẽ nói 'không', nếu tôi thực sự được phép đưa ra hạn chế này theo các quy tắc của thử thách.
Wolfram


11

Python 3, 46 byte, bị bẻ khóa

lambda x:x*(1999888577766665//844333333222200)

Nhân đôi đầu vào.


3
Làm thế nào để 'Python' hoạt động trong cảnh sát cướp? Chúng tôi có thể chọn một phiên bản tùy ý để tấn công câu trả lời của bạn không?
orlp

Ồ, đây là Python 3 cụ thể, xin lỗi. /Phân chia phao cũng vậy .
Lynn

3
Chà, bạn vừa chứng minh thử thách này không đáng với thời gian của tôi. Tiến lên.
mbomb007


11

7 , 9 byte, Cracked

Chương trình này có đầy đủ các ký tự không thể in được, vì vậy đây là một hexdump:

00000000: 2573 dc01 7e13 dcb6 1f                   %s..~....

Lưu ý: điều này sử dụng một thói quen đầu vào số không có khả năng nhập số âm, vì vậy việc gửi này chỉ bị giới hạn ở các số nguyên không âm.

Một vấn đề với thách thức của là bạn không viết các giải thích về mã (để làm cho nó khó bị bẻ khóa hơn). Mặt khác, điều này có nghĩa là tôi không phải gặp rắc rối ở đây.

Tôi đã chọn 7 làm ngôn ngữ bởi vì, đặc biệt là trong ký hiệu nén của nó, nó khá khó đọc và tôi không hiểu tại sao chỉ có tôi là người phải gặp rắc rối khi di chuyển xung quanh các chương trình 8 bit được viết trong mã hóa 3 bit. Chúc may mắn!

Giải trình

Bây giờ, chương trình đã bị bẻ khóa (không may bằng vũ lực, thật không may, đó luôn là mối nguy hiểm trong các giải pháp ngắn này), tôi cũng có thể giải thích những gì tôi đang làm. Điều này thực sự khá khả thi bằng cách đọc chương trình; Tôi có thể đã làm cho nó khó khăn hơn nhiều, nhưng cảm giác đó là một ý tưởng tồi khi các vết nứt vũ phu tồn tại.

Chúng ta sẽ bắt đầu bằng cách trình bày chương trình theo cách mã hóa tự nhiên hơn. Như thường lệ, số in đậm chỉ ra lệnh chạy ngay lập tức (không phải tất cả trong số đó là biểu diễn trong một chương trình; 67chỉ là 2để 5không), số unbolded đại diện tương đương trốn thoát của họ ( 0để 5, tất cả trong số đó là biểu diễn trong chương trình gốc; lưu ý đó 0là một người trốn thoát 61là một người trốn thoát 7):

112 7 1 7 34002 77 023 67 13303

Tập hợp các lệnh có sẵn trong nguồn 7 chương trình có nghĩa là về cơ bản nó chỉ là một chữ đại diện cho ngăn xếp ban đầu (bạn không thể làm gì khác chỉ với các lệnh đã thoát 67). Vì vậy, điều đầu tiên một chương trình sẽ làm là đẩy một loạt các thứ lên ngăn xếp. Đây là cách ngăn xếp sau khi chương trình chạy ( |tách các phần tử ngăn xếp, như thường lệ trong 7):

772 | 7 | 34662 | 023 | 73363

Phần tử ngăn xếp cuối cùng sau đó được sao chép để trở thành mã để chạy (trong khi còn lại trên ngăn xếp). Khi nó xảy ra, đây là phần duy nhất của chương trình đó là mã; mọi thứ khác chỉ là dữ liệu. Đây là những gì nó dịch là:

73363 
7       Đẩy phần tử trống lên ngăn xếp
  3      Xuất phần tử ngăn xếp trên cùng, loại bỏ phần tử bên dưới
 73      Hiệu ứng kết hợp của các phần tử này: loại bỏ phần tử ngăn xếp trên cùng
   3     Xuất phần tử ngăn xếp trên cùng, loại bỏ phần tử bên dưới
    6    Thoát phần tử ngăn xếp trên cùng, sau đó nối nó vào phần tử bên dưới
     3   Xuất phần tử ngăn xếp trên cùng, loại bỏ phần tử bên dưới

Nói cách khác, đây chủ yếu chỉ là một loạt các hướng dẫn I / O. Hãy phân tích chi tiết này:

  • 73loại bỏ cái 73363vẫn còn trên đỉnh của ngăn xếp.
  • 3xuất ra 023và loại bỏ 34662. Do đó có thể thấy rằng đó 34662là một nhận xét, được sử dụng để lưu trữ các byte cần thiết trong phiên bản khác của chương trình. Đối với những gì 023khi đầu ra, nó chọn định dạng I / O 0 (số nguyên), sau đó 23là một lệnh yêu cầu thực hiện để nhập một số nguyên (trong 7, bạn thực hiện nhập thông qua xuất ra các mã cụ thể yêu cầu đầu vào). Đầu vào được thực hiện bằng cách tạo các bản sao của phần tử ngăn xếp bên dưới, ví dụ: nếu số nguyên đầu vào là 10, phần tử ngăn xếp tiếp theo (hiện tại 7) sẽ trở thành 7777777777. Do đó, chúng tôi chấp nhận đầu vào từ người dùng ở dạng thập phân, nhưng nó được lưu trữ dưới dạng đơn nguyên.
  • 6thoát khỏi phần tử ngăn xếp trên cùng (thay đổi từng phiên bản 7thành 1; đây là cách các chuỗi bao gồm toàn bộ 7s được thoát), sau đó nối nó vào phần tử ngăn xếp trước ( 772). Vì vậy, dữ liệu của chúng tôi bây giờ là một cái gì đó như 7721111111111.
  • Cuối cùng, 3xuất ra phần tử ngăn xếp trong câu hỏi (và bật một phần tử ngăn xếp trống là một phần của ngăn xếp ban đầu mặc định). Giá trị của nó được tính bằng cách lấy số 1s và 7s, và trừ đi số 0s và 6s. (Ở 2giữa được bỏ qua trong hầu hết các trường hợp; nếu ở cuối chuỗi, nó sẽ trở thành một dòng mới thay vì bị bỏ qua, nhưng các quy tắc PPCG không quan tâm đến điều đó.) Vì vậy, đầu ra là bản gốc đầu vào cộng 2.

Tại thời điểm này, không có gì hữu ích trên ngăn xếp và không có gì trong chương trình, vì vậy chương trình thoát.

Làm thế nào để chúng ta đảo ngược điều này? Đây là một vấn đề đơn giản để thay đổi 11thành 00, để chúng tôi chuẩn bị các ký tự cho đầu vào làm cho nó thấp hơn 2, thay vì 2 cao hơn. Có 00tám chữ số bát phân được ẩn một cách thuận tiện hơn nữa trong chương trình (để các chữ số bát phân và byte thẳng hàng với nhau), vì vậy chúng ta có thể chỉ cần trao đổi nó với 11lúc bắt đầu.



Lưu ý bên lề: bạn không phải giải thích mã của mình, nhưng biết chương trình của bạn làm gì sẽ tốt.
GB

@ GB: Tôi đã đưa ra một lời giải thích đầy đủ về chương trình (bao gồm cả lời giải thích về cách thức hoạt động của crack).


6

Python 2, 83 byte, bị bẻ khóa

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Điều này tương tự với câu trả lời khác của tôi. Tuy nhiên, điều này sử dụng RSA 64 bit và có mật mã khá yếu. Nếu bạn có thể cướp câu trả lời này, về mặt lý thuyết bạn cũng có thể cướp câu trả lời khác của tôi, cho đủ thời gian.



5

Python 2, 47 byte, Cracked

lambda x:x**2or (iron() and saxifrage.extend())

Tên miền cho chức năng này là {x ∈ | x> 0}. Nó bình phương đầu vào của nó.


nmjcman101 tìm thấy giải pháp dự định:

lambda x:sorted(a**2for a in range(x)).index(x)


1
Haha, yêu các cuộc gọi chức năng đã tạo
FlipTack

1
Cracked Thật là vui, tôi đã bị kẹt trên đảo chữ được sắp xếp mà tôi đã để lại!
nmjcman101

5

JavaScript (ES6), 46 byte, Cracked

x=>Math.log(x+(+String(t=985921996597669)[5]))

Hàm này trả về ln(x+1)nơi xlà một số không âm.

Sử dụng

(x=>Math.log(x+(+String(t=985921996597669)[5])))(5)

Lưu ý: Do tính chất của số dấu phẩy động f(g(x))có thể không chính xác bằng nhau x. Thí dụ:f(g(4))=3.9999999999999996


Nứt. Điều đó thực sự thú vị :-)
Sản phẩm ETH


4

Xử lý.js, 59 byte, Cracked!

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Hàm này nhân số đầu vào bằng 204(17*-4*-3=204 ). Nó nhận trong một int như đầu vào và đầu ra một float. Như mong đợi, nghịch đảo chia đầu vào cho 204.

Một trình thông dịch trực tuyến để xử lý js có thể được tìm thấy ở đây .





4

J , 29 byte ( Cracked bởi dặm)

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Đây là một động từ lấy số nguyên dương làm đầu vào và thực hiện như sau:

  1. Chuyển đổi sang căn cứ 2 và 4.
  2. Đặt biểu diễn cơ sở-4 bằng 0 để có cùng độ dài với biểu diễn cơ sở-2.
  3. Nối hai biểu diễn (cơ sở-2 trước).
  4. Giải thích sự ghép nối dưới dạng biểu diễn cơ sở-5 và chuyển đổi thành số nguyên.

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

Giải pháp của tôi

Logic khá giống như trong crack. Kết hợp xếp hạng "có thể bị mắc kẹt ở nhiều nơi khác nhau (và tôi sử dụng nó để loại bỏ những thứ không cần thiết 03), vì nó không thực sự làm bất cứ điều gì trong giải pháp.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]

Tôi không hiểu J, nhưng các thí nghiệm của tôi cho thấy điều này thực sự lấy số nguyên ở cơ sở 2 và 4, thêm các số 0 vào cuối cơ sở 4 để làm cho chiều dài của chúng bằng nhau và chỉ sau đó ghép lại. Là những số không dự định?
Wolfram

@Wolfram Các số không được dự định, đó là những gì tôi đã cố gắng nói với "đồng thời". Nếu không, tôi không nghĩ rằng nó sẽ có thể đảo ngược.
Zgarb

@Wolfram Tôi đã thêm một mô tả rõ ràng hơn.
Zgarb


4

Đang xử lý (java), 59 byte, AN TOÀN

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Hàm này nhân số đầu vào bằng 204( 17*-4*-3=204). Nó nhận trong một int như đầu vào và đầu ra một float. Như mong đợi, nghịch đảo chia đầu vào cho204 . Lưu ý: cả hai chương trình đều lấy int làm đầu vào và đầu ra float.

Câu trả lời này hoàn toàn giống với câu trả lời khác của tôi, ngoại trừ câu trả lời khác của tôi được viết bằng Chế biến. Gặp gỡ Xử lý-java, anh em họ ít dài dòng hơn của Java. Bạn có thể tải về Xử lý tại đây tại process.org.

Vết nứt

float ap(int i){return i*pow(blue(get(0,0)),-1);}//++7*4*-3

Chương trình này chia đối số cho 204. Nhưng bằng cách nào? Chúng ta hãy đi vào bên trong chức năng.

i *                              //multiply i by
         blue( get(0, 0) )       //this (evaluates to 204)
    pow(                  , -1)  //raises to the -1 power (ie its reciprocal)

Đủ đơn giản, nhưng làm thế nào để blue( get(0, 0) )trở thành 204? Đây là trung tâm của trình này. Trước hết, get(0,0)lấy màu của pixel nằm ở (0,0)(góc trên cùng bên trái của cửa sổ, luôn mở trong bản phác thảo Xử lý). Tiếp theo, blue()nhận giá trị màu xanh của pixel đó, đó là204 !

Để đưa ra đệ trình này, tôi đã thử nghiệm bằng cách in các thuộc tính khác nhau của màu thu được bởi get(0,0) . Tôi đã phát hiện ra rằng, màu xanh lá cây, xanh dương, giá trị alpha màu đỏ là 204, 204, 204255tương ứng. Từ đó, tôi quyết định thực hiện một thao tác đơn giản với số này và kết thúc với bài đăng này.


Tôi nghĩ rằng Kotlin là anh em họ ít dài dòng hơn của Java! Tôi thừa nhận rằng họ ngôn ngữ C khá lớn ... nhưng cây gia đình thực sự trông như thế nào ...
CAD97

Tôi tin rằng bạn đã làm nó, không ai đã bẻ khóa bài viết của bạn và đó là một tuần.
dặm

3

JavaScript (ES6), 63 byte bị bẻ khóa bởi Ilmari Karonen

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Thời gian cho một số atobvô nghĩa. Hàm này trả về x*x+1nơi xlà một số không âm.

Sử dụng

(x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`))(5)

Dự định

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

Có một số lượng lớn các giải pháp tiềm năng, nhưng tôi đã hy vọng rằng các nhân vật hàng đầu sẽ loại bỏ thứ tự byte đủ để làm cho việc này khó hơn. C'est laatob



Bạn đã vô tình đăng lại mã thách thức của bạn như là giải pháp dự định? :)
Ilmari Karonen

@IlmariKaronen Cảm ơn, điều đó sẽ dạy tôi sao chép / dán ... lol vâng đúng: P
SLuck49


2

Python 2, 225 byte, bị bẻ khóa bởi Sp3000

#((()))****+,,---/000555666888;==oppppppqqqqqw~~
lambda n:pow(n,65537,9273089718324971160906816222280219512637222672577602579509954532420895497077475973192045191331307498433055746131266769952623190481881511473086869829441397)

Miền của hàm này là [0, n), trong đó n là số lượng lớn ở trên. Có, chức năng này là không thể đảo ngược trên miền này. Và trừ khi tôi làm hỏng, phá vỡ câu trả lời này cũng khó như phá vỡ RSA 512 bit.


1
Brute-cưỡng bức này dễ dàng hơn đáng kể so với RSA cưỡng bức vì bạn đã có một đảo chữ gần đúng của hằng số bạn cần. Mặt khác, nó có thể vẫn còn quá khó để quản lý trong thực tế.

4
Hãy nhớ rằng có một bài đăng meta liên quan đến ngẫu nhiên trong các thử thách CnR
Kritixi Lithos

5
@KritixiLithos Câu trả lời của tôi không chứa ngẫu nhiên, băm hoặc mã hóa tích hợp. Đó thực sự là một lũy thừa mô-đun.
orlp

2
Câu trả lời của bạn nhằm mục đích giải quyết một vấn đề khó giải quyết và do đó phù hợp với bài đăng meta (đặc biệt là vì nó đề cập trực tiếp đến RSA). Tôi nghĩ rằng ngay cả khi bạn có kẽ hở, kịch bản của bạn vẫn xứng đáng với sự thất vọng của tôi.
Christoph


0

J, 15 byte

(".&,'10.')#.#:

Có một số nguyên không âm n , chuyển đổi nó thành một danh sách các chữ số nhị phân và kết hợp các chữ số đó thành một số 10 cơ sở.

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

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.