Lấy cảm hứng từ bình luận này ...
Cảm ơn người dùng Step Hen , Wheat-Wizard và Dennis đã giúp tôi củng cố đặc điểm kỹ thuật của thử thách này trước khi đăng nó!
Đây là chủ đề của Cảnh sát. Đối với chủ đề của Cướp, hãy vào đây
Trong thử thách này , bạn có nhiệm vụ chạy một số mã khiến cho ngôn ngữ của bạn không còn thỏa mãn tiêu chí của chúng tôi là ngôn ngữ lập trình. Trong thử thách đó, điều đó có nghĩa là làm cho nó để ngôn ngữ không còn ...
Lấy đầu vào số và đầu ra
Cộng hai số lại với nhau
Kiểm tra nếu một số nhất định là một số nguyên tố hay không.
Đây là một thử thách cảnh sát và cướp , trong đó có hai thử thách khác nhau với hai mục tiêu khác nhau: Cảnh sát sẽ cố gắng viết một số mã khiến ngôn ngữ hầu như không sử dụng được và bọn cướp sẽ cố gắng tìm ra cách giải quyết ẩn cho phép cảnh sát để phục hồi ngôn ngữ của họ.
Là một cảnh sát, bạn phải viết hai đoạn mã:
Một trong đó làm cho ngôn ngữ của bạn chủ yếu không sử dụng được, ví dụ như bằng cách loại bỏ các hàm tích hợp để thực hiện các thao tác nhập / xuất và số. Càng loại bỏ nhiều tính năng, càng tốt. Mã này không được phép để sập hoặc thoát. Có thể thêm mã vào cuối đoạn mã này và mã đó sẽ được đánh giá . Và ...
... một đoạn mã lấy hai số nguyên không âm làm đầu vào, cộng chúng lại với nhau và xuất tổng của chúng. Đoạn mã này vẫn phải hoạt động chính xác ngay cả sau khi chạy đoạn mã đầu tiên. Khi hai đoạn mã được kết hợp với nhau, chúng phải tạo thành một chương trình đầy đủ có thêm hai số hoặc xác định hàm thêm hai số. Lý tưởng nhất, đoạn trích này nên dựa vào hành vi rất mơ hồ, để khó tìm hơn.
Bạn có thể chọn bất kỳ phương pháp tiêu chuẩn đầu vào và đầu ra . Tuy nhiên, bạn phải tiết lộ chính xác định dạng (đầu vào và đầu ra) bạn đang sử dụng. Một tên cướp không thể bẻ khóa câu trả lời của bạn trừ khi chúng sử dụng cùng định dạng với bạn.
Sau khi viết cả hai đoạn trích này, bạn phải đăng câu đầu tiên dưới dạng câu trả lời, không tiết lộ câu thứ hai. Câu trả lời của bạn nên chứa tất cả các thông tin sau:
Đoạn đầu tiên (rõ ràng không phải là đoạn thứ hai).
Ngôn ngữ (bao gồm cả phiên bản nhỏ, vì hầu hết các bài nộp có thể sẽ dựa vào các trường hợp cạnh lạ)
Định dạng IO, bao gồm cả chức năng hay chương trình đầy đủ. Những tên cướp phải sử dụng định dạng tương tự để vết nứt của chúng có hiệu lực.
Bất kỳ trường hợp cạnh lạ cần thiết cho câu trả lời của bạn để làm việc. Ví dụ: chỉ chạy trên linux hoặc yêu cầu kết nối Internet . Rõ ràng, điều này hơi chủ quan, nhưng nếu một cảnh sát có một số trường hợp cực đoan ngăn nó bị nứt, và sau đó chỉ tiết lộ điều này sau khi an toàn, tôi coi đây là môn thể thao kém. Một tên cướp tiềm năng nên có tất cả thông tin cần thiết để bẻ khóa câu trả lời của bạn trước khi nó bị bẻ khóa.
Bạn không cần tiết lộ số byte của mình cho đến khi câu trả lời của bạn an toàn.
Đây là một ví dụ. Đối với đoạn mã đầu tiên, bạn có thể gửi chương trình Python 3 sau:
Con trăn 3
print=None
Đưa đầu vào từ STDIN và đầu ra sang STDOUT
Và sau đó là đoạn trích thứ hai của bạn, bạn có thể viết:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Điều này hợp lệ vì sẽ lấy hai số làm đầu vào và xuất tổng của chúng ngay cả khi bạn nối hai đoạn mã với nhau, ví dụ:
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Tuy nhiên, điều này sẽ cực kỳ dễ dàng cho một tên cướp tìm ra giải pháp. Vì điều này sẽ rất dễ bị bẻ khóa, bạn có thể cố gắng vá phương pháp cụ thể này như sau:
import sys
sys.stdout=None
print=None
Tuy nhiên, ngay cả điều này có một cách giải quyết rất dễ dàng:
del print
a,b=int(input()),int(input())
print(a+b)
Là một cảnh sát, mục tiêu của bạn là làm cho cách giải quyết ẩn càng tối nghĩa càng tốt, để ngăn chặn những tên cướp tìm thấy nó.
Những tên cướp sẽ xem xét một trong những câu trả lời của bạn và cố gắng bẻ khóa nó. Họ có thể bẻ khóa nó bằng cách viết bất kỳ đoạn mã hợp lệ nào có thể hoạt động như đoạn 2 (cộng hai số lại với nhau sau khi ngôn ngữ được tạo ra hầu hết không sử dụng được). Đây không phải là đoạn trích giống như bạn dự định ban đầu. Nếu một tên cướp phá vỡ câu trả lời của bạn, họ sẽ để lại nhận xét về câu trả lời của bạn, và sau đó bạn nên chỉnh sửa nó để cho biết rằng nó đã bị bẻ khóa. Nếu bài đăng của bạn bị bẻ khóa, bạn nên chỉnh sửa câu trả lời của mình để hiển thị giải pháp (đoạn 2) mà bạn dự định ban đầu. Đây không phải là một quy tắc mỗi se , chỉ là một đề nghị thân thiện để giữ cho trò chơi vui vẻ. Bạn không cần phải.
Nếu một câu trả lời vẫn chưa được giải mã trong cả tuần, bạn có thể chỉnh sửa trong đoạn mã thứ hai của mình và cho biết rằng câu trả lời của bạn hiện đã an toàn . Nếu bạn không chỉnh sửa nó sau khi hết tuần, những người dùng khác vẫn có thể bẻ khóa cho đến khi bạn thực hiện. Nếu bạn không tiết lộ đoạn trích thứ hai của mình, bạn không thể yêu cầu điểm cho câu trả lời của mình hoặc gọi nó là an toàn.
Người chiến thắng trong chuỗi của cảnh sát là câu trả lời an toàn ngắn nhất bao gồm cả đoạn trích , được tính bằng byte và câu trả lời này sẽ được chấp nhận sau khi đủ thời gian trôi qua. Bạn không cần tiết lộ số byte của mình cho đến khi câu trả lời của bạn an toàn, vì số byte không liên quan đến điểm số của bạn cho đến khi câu trả lời của bạn an toàn. Trong trường hợp đủ thời gian trôi qua và không có câu trả lời nào vẫn chưa được giải mã, người chiến thắng sẽ là câu trả lời không bị bẻ khóa trong khoảng thời gian dài nhất.
Chúc vui vẻ!
Làm rõ quy tắc
Đoạn mã đầu tiên phải chạy chính xác mà không cần bất kỳ đầu vào nào . Nó có thể xuất bất cứ thứ gì bạn thích và đầu ra này sẽ bị bỏ qua - miễn là sau khi đoạn mã được thực hiện, đoạn mã thứ hai chạy chính xác.
Đoạn mã thứ hai thực sự phải được thực thi để câu trả lời của bạn có giá trị. Điều này có nghĩa là một câu trả lời như
import sys sys.exit()
không hợp lệ vì nó không phá vỡ ngôn ngữ. Nó chỉ đơn giản là thoát. Tương tự, nhập một vòng lặp vô hạn là không hợp lệ, vì đoạn mã thứ hai sẽ không bao giờ được thực thi.
Sau khi an toàn, điểm của bạn là số byte của cả hai đoạn .
Điều này quay trở lại Vui lòng tiết lộ bất kỳ trường hợp cạnh lạ nào cần thiết để câu trả lời của bạn hoạt động ... Nội dung gửi của bạn phải chứa đủ thông tin trước khi được tiết lộ để có thể sao chép lại sau khi được tiết lộ. Điều này có nghĩa là nếu câu trả lời của bạn trở nên an toàn, và sau đó bạn chỉnh sửa: Đây là câu trả lời của tôi. Oh ya, BTW này chỉ hoạt động nếu bạn chạy nó trên Solaris, đùa với bạn! câu trả lời của bạn không hợp lệ và sẽ bị xóa và không được coi là đủ điều kiện để chiến thắng.
Đoạn mã thứ hai được phép gặp sự cố sau khi xuất tổng - miễn là đầu ra vẫn đúng (ví dụ: nếu bạn chọn xuất ra STDERR, và sau đó bạn nhận được một loạt thông tin sự cố, điều này không hợp lệ).
Bạn không thể chỉnh sửa mã của mình sau khi gửi câu trả lời.
Bạn không được dựa vào các chức năng mã hóa như mã hóa, hàm băm, CSPRNG, v.v.
int main(){ do_evil_stuff(); }
mã người dùng nên đi đâu? Trong một chức năng? Sau khi tất cả các báo cáo trongmain
?