Làm cho ngôn ngữ của bạn * chủ yếu là * không thể sử dụng! (Chủ đề của cảnh sát)


61

Lấy cảm hứng từ bình luận này ...

Cảm ơn người dùng Step Hen , Wheat-WizardDennis đã 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 , 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ã:

  1. 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à ...

  2. ... 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.

Đoạn trích để tìm các bài nộp không bị theo dõi:


3
Nên làm gì cho các ngôn ngữ như C? Ghép chỉ cho phép một "đoạn trích chính" và bất kỳ logic nào sẽ phải đi đến đó. Ví dụ, nếu tôi có 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 trong main?
Conor O'Brien

1
Đoạn mã thứ hai có thể được đặt ở bất cứ đâu trong đoạn đầu tiên không?
LegionMammal978

1
Tôi không biết gì về mã hóa, nhưng thử thách này có vẻ đáng kinh ngạc,
Pritt Balagopal

2
Tôi đã chỉnh sửa trong đoạn trích tuyệt vời của jimmy23013 . Vui lòng hoàn nguyên, nhưng dù sao tôi cũng đã sử dụng nó để tìm bài nộp và nghĩ rằng nó có thể giúp đỡ người khác.
Dom Hastings

2
@DomHastings Điều đó cực kỳ hữu ích! Cảm ơn bạn rất nhiều :)
DJMcMayhem

Câu trả lời:


2

Gforth 0.7.3 (TIO) , 231 byte [SAFE]

Mã này xác định lại là vô dụng một số phương thức đầu ra cần thiết, cũng như bổ sung và một cái gì đó rất quan trọng để khai báo các hàm. Chúc may mắn!

: . ;
: dec. ;
: u. ;
: .r ;
: u.r ;
: d. ;
: ud. ;
: d.r ;
: ud.r ;
: emit ;
: type ;
: + postpone 2drop ;
: ; + + + postpone exit reveal postpone [ ;

Đầu vào sẽ là hai số nguyên đã ký được lấy từ đỉnh ngăn xếp dưới dạng tham số hàm. Đầu ra cho STDOUT.

Vì vậy, bạn nên sửa chữa thiệt hại và xác định hàm lấy hai giá trị trên cùng từ ngăn xếp và in kết quả dưới dạng số nguyên (không phải là số float) sang STDOUT mà không cần đầu ra bổ sung (không có dấu cách).

Đây là một mẫu , nếu chức năng mục tiêu của bạn được đặt tên f.

Giải pháp:

79 byte

Tôi thực sự đã loại bỏ immediatetừ khóa từ cuối định nghĩa lại ;, vì vậy cần có câu trả lời để đưa nó vào lúc bắt đầu. Hàm tôi định nghĩa hầu hết tương đương với định nghĩa bên trong ., nhưng nó không in khoảng trống ở cuối và việc bổ sung được thực hiện trước, bằng cách di chuyển các số sang ngăn xếp dấu phẩy động và quay lại.

immediate : f s>f s>f f+ f>d swap over dabs <<# #s rot sign #> (type) #>> 0 0 ;

Dùng thử trực tuyến


1
Đây là một câu trả lời rất hay. Với tốc độ này, có vẻ như nó có thể là câu trả lời duy nhất không bị bẻ khóa!
DJMcMayhem

:) Tôi kết hợp một vài trở ngại khác nhau. Tại thời điểm này, tôi tự hỏi liệu tôi có thể thực hiện chỉ một lần duy nhất để làm cho điểm số của tôi tốt hơn không. Nhưng có thể có nhiều hơn một lý do là tại sao nó chưa bị phá hủy.
mbomb007

21

Haskell, bị bẻ khóa bởi Christian Sievers

import Prelude(getLine,print)
a=a

Chương trình đầy đủ, đọc hai số nguyên (bao gồm cả số âm) từ stdin và viết đến thiết bị xuất chuẩn.

Tôi vừa tắt Prelude để gần như không có gì trong phạm vi, và sau đó thêm một định nghĩa; nhập khẩu thêm là không hợp lệ về mặt cú pháp. Tôi đã cho bạn getLineprintmặc dù.


Chỉnh sửa để thêm giải pháp ban đầu của tôi. Vết nứt của Christian thì khác, nhưng khai thác các tính năng cơ bản giống nhau (bạn có thể nhận được một lượng tính toán đáng kinh ngạc bằng cách truy cập các hàm có đường cú pháp, ngay cả khi bạn không thể gọi bất kỳ thứ gì được xây dựng trực tiếp hoặc thậm chí đặt tên cho các loại liên quan).

import Prelude(getLine,print)
a=a
(x:l)!0=x
(x:l)!n=l!d[0..n]
d[x,y]=x
d(x:l)=d l
x^y=[x..]!y
x+y=f[0..y](x^y)(-((-x)^(-y)))
f[]x y=y
f _ x y=x
f.g= \x->f(g x)
f&0= \x->x
f&n=f.(f&d[0..n])
x*y=((+x)&y)0
x%[]=x
x%('-':s)= -(x%s)
x%(c:s)=x*10+i c%s
i c=l['1'..c]
l[]=0
l(x:s)=1+l s
main=do
 x<-getLine
 y<-getLine
 print((0%x)+(0%y))

Dù sao có lẽ không phải là siêu golf, nhưng ở đây nó dễ đọc hơn:

import Prelude(getLine,print)
a=a

-- List indexing
(x : _) !! 0 = x
(_ : xs) !! n = xs !! (sndLast [0..n])

-- sndLast [0..n] lets us decrement a positive integer
sndLast [x, _] = x
sndLast (_ : xs) = sndLast xs

-- Pseudo-addition: right-operator must be non-negative
x +~ y = [x..] !! y

-- Generalised addition by sign-flipping if y is negative
x + y = switch [0..y] (x +~ y) (-((-x) +~ (-y)))
  where switch [] _ empty = empty   -- [0..y] is null if y is negative
        switch _ nonempty _ = nonempty

f . g = \x -> f (g x)

-- compose a function with itself N times
composeN f 0 = \x -> x
composeN f n = f . (composeN f (sndLast [0..n]))

-- multiplication is chained addition
x * y = composeN (+x) y 0

strToNat acc [] = acc
strToNat acc ('-' : cs) = -(strToNat acc cs)
strToNat acc (c : cs) = strToNat (acc * 10 + charToDigit c) cs

charToDigit c = length ['1'..c]

length [] = 0
length (_ : xs) = 1 + length xs

main = do
  x <- getLine
  y <- getLine
  print (strToNat 0 x + strToNat 0 y)


17

Con trăn 2 , bị nứt

Triển khai bổ sung như là một chức năng được đặt tên

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
f=lambda\

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

Cái này làm gì

Với mục đích giúp bạn giải quyết một chút, tôi sẽ giải thích điều này. Mã này mở tệp nguồn và kiểm tra xem phần còn lại của mã có phù hợp với các tiêu chí sau không:

  • Không chứa chuỗi import
  • Chỉ được làm từ các nhân vật &)(,.:[]a`cdfijmonrt~

Nếu nó không thành tiêu chí, giới hạn đệ quy được đặt thành 1có nghĩa là bất kỳ mã nào bạn viết sẽ đạt giới hạn đệ quy.

Không có mánh khóe nào ở đây, tôi đã viết một giải pháp chỉ sử dụng các ký tự này và không nhập, tôi không làm gì để lật đổ, nhưng tôi sẽ nói rằng tôi nghĩ điều này sẽ khá khó để bẻ khóa.

Để giúp bạn tiết kiệm thời gian ở đây là một danh sách ngắn những điều hữu ích bạn không thể làm với hạn chế này

  • + cũng tốt

  • eval/ execSẽ không để bạn thoát khỏi điều đó

  • Những con số, chúng có thể hữu ích hơn bạn nghĩ

  • Chuỗi ký tự

  • len

  • =, Không gán biến

  • >, <, ==. . . Tôi đã để lại cho bạn không có so sánh

  • *, -, /, %, ^, |, >>, << Các nhà khai thác chỉ sẵn có ~&

  • __foo__, Không ai trong số các phương pháp gạch dưới đôi ưa thích được cho phép.


1
Wow điều này là khá xấu xa. Đẹp!
HyperNeutrino

Câu trả lời tuyệt vời để khởi động mọi thứ :)
DJMcMayhem

Hehe, điều này có lẽ đã được truyền cảm hứng từ thử thách vua ngu ngốc mà tôi đã cố gắng nói ra trong cuộc trò chuyện đó một lần
Stephen

4
Tôi nghĩ rằng đây là một vết nứt hợp lệ: codegolf.stackexchange.com/a/133209/68942
HyperNeutrino

RE đoạn trích đầu tiên: This code is not allowed to crash or exit.(xem trò chuyện để thảo luận về nó)
Stephen

12

Con trăn 2 , bị nứt

Đây là lần lặp thứ tư của câu trả lời này. Mỗi câu trả lời cuối cùng đã bị bẻ khóa thông qua việc thiết lập lại độ sâu đệ quy.

Triển khai bổ sung như là một chức năng được đặt tên

import sys
if set("".join(open(__file__).read().split('\n')[4:]))-set(' &)(,.:[]a`cdfijmonrt~'):sys.setrecursionlimit(1)
for m in sys.modules:sys.modules[m]=None
del sys;f=lambda\

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

Cái này làm gì

Với mục đích giúp bạn giải quyết một chút, tôi sẽ giải thích điều này. Mã này mở tệp nguồn và kiểm tra xem phần còn lại của mã chỉ được tạo từ các ký tự &)(,.:[]a`cdfijmonrt~

Nếu nó không thành công thì giới hạn đệ quy được đặt thành 1có nghĩa là bất kỳ mã nào bạn viết sẽ đạt giới hạn đệ quy.

Tôi cũng đã tắt tất cả các mô-đun, vì vậy bạn không thể nhập bất cứ thứ gì.

Không có mánh khóe nào ở đây, tôi đã viết một giải pháp chỉ sử dụng các ký tự này và không nhập, tôi không làm gì để lật đổ, nhưng tôi sẽ nói rằng tôi nghĩ điều này sẽ khá khó để bẻ khóa.

Để giúp bạn tiết kiệm thời gian ở đây là một danh sách ngắn những điều hữu ích bạn không thể làm với hạn chế này

  • + cũng tốt

  • eval/ execSẽ không để bạn thoát khỏi điều đó

  • Những con số, chúng có thể hữu ích hơn bạn nghĩ

  • Chuỗi ký tự

  • len

  • =, Không gán biến

  • >, <, ==. . . Tôi đã để lại cho bạn không có so sánh

  • *, -, /, %, ^, |, >>, << Các nhà khai thác chỉ sẵn có ~&

  • __foo__, Không ai trong số các phương pháp gạch dưới đôi ưa thích được cho phép.

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

Vì vậy, bây giờ xnor đã bẻ khóa nó theo cách tôi đủ hài lòng với tôi sẽ tiết lộ giải pháp của tôi

r,o:(o and f(~(~r&~o)&~(r&o),int(`r`[:r&~r].join([`dict()`[r&~r],`r&~r`,`dict([(r&~r,r&~r)])`[int(`~([]in[[]])`[[]in[[]]:])],`min`[[]in[[]]],`dict()`[~(r&~r)],`r&~r`]).format(r&o),int(`~([]in[[]])`[[]in[[]]:]))))or r

Ngạc nhiên, ngạc nhiên một đống tiếng vô nghĩa. Thay vì phá vỡ điều này, tôi sẽ trải qua quá trình tôi thực hiện điều này.

Tôi bắt đầu với một thuật toán bổ sung khá chuẩn

r,o:(o and f(r^o,r&o<<1))or r

Sau đó, tôi sử dụng một thủ thuật Bitwise cho đại diện ^với |, &, ~.

r,o:(o and f((r|o)&~(r&o),r&o<<1))or r

Tôi đã sử dụng một thủ thuật bitwise khác để thoát khỏi |

r,o:(o and f(~(~r&~o)&~(r&o),r&o<<1))or r

Bây giờ tất cả những gì còn lại là <<, không nên quá khó, phải không? Vâng sẵn sàng cho một chuyến đi gập ghềnh. Để thay thế bithift, tôi đã sử dụng các chuỗi để nối số 0 vào cuối biểu diễn nhị phân của nó

r,o:(o and f(~(~r&~o)&~(r&o),int(bin(r&o)[2:]+"0",2)))or r

Điều này có một vài vấn đề nhưng vấn đề chính là sử dụng bổ sung , vì vậy tôi đã khắc phục vấn đề này bằng cách sử dụng một định dạng thay thế

r,o:(o and f(~(~r&~o)&~(r&o),int("{}0".format(bin(r&o)[2:]),2)))or r

Chúng tôi không được phép sử dụng bin, vì vậy tôi đã sử dụng định dạng chuỗi để chuyển đổi thành nhị phân.

r,o:(o and f(~(~r&~o)&~(r&o),int("{0:b}0".format(r&o),2)))or r

Vì các chuỗi ký tự bị cấm, tôi phải xây dựng chuỗi {0:b}0từ các phần được tạo bằng dấu tick và joinchúng cùng nhau.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join(["{","0",":","b","}","0"]).format(r&o),2)))or r

Chuỗi rỗng khá dễ dàng, bạn chỉ cần làm

`r`[:0]

Các số không là

`0`

{:}tất cả đều được lấy từ từ điển.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join([`dict()`[0],`0`,`dict([(0,0)])`[2],"b",`dict()`[-1],`0`]).format(r&o),2)))or r

bcó vẻ khá khó để có được, nó không có trong bộ ký tự của chúng ta, vậy làm thế nào để chúng ta có được một vật thể có btrong đó repr? Vâng đây là cách thực hiện: Khi bạn sử dụng reprchức năng dựng sẵn, bạn sẽ nhận được một cái gì đó trông giống như

<built-in function name>

Và đó là nơi chúng ta sẽ nhận được b.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join([`dict()`[0],`0`,`dict([(0,0)])`[2],`min`[1],`dict()`[-1],`0`]).format(r&o),2)))or r

Bây giờ tất cả những gì còn lại là số, tôi chỉ cần -1, 0, 1 và 2 vì vậy đây là cách tôi thể hiện chúng:

-1 = ~(r&~r)
 0 = r&~r
 1 = []in[[]]
 2 = `~([]in[[]])`[[]in[[]]:]

2 thực sự có thể là một byte ngắn hơn như

```r&~r```.find(`r&~r`)

dựa trên các đề xuất của @ Blender trong các bình luận, nhưng tôi đã không nghĩ về điều này cho đến khi thực tế.

Vì vậy, chúng tôi thay thế những con số này trong

r,o:(o and f(~(~r&~o)&~(r&o),int(`r`[:r&~r].join([`dict()`[r&~r],`r&~r`,`dict([(r&~r,r&~r)])`[int(`~([]in[[]])`[[]in[[]]:])],`min`[[]in[[]]],`dict()`[~(r&~r)],`r&~r`]).format(r&o),int(`~([]in[[]])`[[]in[[]]:]))))or r

Và đó là vết nứt.


Đoạn mã này dường như tự lỗi.
ATaco

@ATaco Tôi tin rằng điều này đã được thảo luận trong trò chuyện và đã quyết định rằng điều này là ổn.
Phù thủy lúa mì

Quy định rõ ràng khác. "Mã này không được phép để sập hoặc thoát."
ATaco

@ATaco Đây là thông điệp mà anh ấy nói sẽ cập nhật khi có cơ hội.
Phù thủy lúa mì


10

C (gcc) Bị nứt!

#define D(f)void f(void);
D(printf)D(fprintf)D(putc)D(puts)D(getchar)D(putc)D(fputc)D(ferror)D(feof)D(read)D(fclose)D(fread)D(wr1te)D(fgets)D(fgetc)D(popem)D(gets)D(read)D(scanf)D(setbuf)D(execl)D(execlp)D(putchar)D(execle)D(execv)D(malloc)D(execvp)D(execvpe)D(exec)D(system)D(close)D(fwrite)D(open)D(free)
int stdin;
int main(){
//your code goes here...hehe
}

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

Nhập từ STDIN và xuất ra STDOUT.

Điều này chạy không có lỗi. Hahaha điều này là khá xấu xa. Tôi chỉ thử nghiệm nó trên gcc của TIO. Như thường lệ, bạn phải nối thêm mã của mình sau đoạn mã này để nó hoạt động :) Nhận xét là một ý nghĩa, đừng nghe nó.

Đã thử nghiệm trên gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1). Nên làm việc trên bất kỳ hệ thống linux.

Giải pháp ban đầu

#define D(f)void f(void);
D(printf)D(fprintf)D(putc)D(puts)D(getchar)D(putc)D(fputc)D(ferror)D(feof)D(read)D(fclose)D(fread)D(wr1te)D(fgets)D(fgetc)D(popem)D(gets)D(read)D(scanf)D(setbuf)D(execl)D(execlp)D(putchar)D(execle)D(execv)D(malloc)D(execvp)D(execvpe)D(exec)D(system)D(close)D(fwrite)D(open)D(free)
int stdin;
int main(){
//your code goes here...hehe
}
void __attribute__ ((destructor)) dtor() {
    int a,b,c,d;a=b=c=0;
    struct FILE* z = popen("cat", "r");
#define q(x)for(;(c=getc(z))^32&&c^-1;)x=10*x+c-48;
q(a);q(b);
    char*y=calloc(c=a+b,1);
    for(a=0;c;){y[a++]=(48+(c%10));c=c/10;}
    for(b=0;b<a/2;b++){d=y[b];y[b]=y[a-b-1];y[a-b-1]=d;}
    write(1,y,a);
}

@ LegionMammal978 À đúng rồi
Conor O'Brien

2
Chỉ định nền tảng của bạn!
Joshua

@Joshua Tôi đã thêm một số thông tin
Conor O'Brien


Chà, __asm__và bạn có rất nhiều chức năng để lựa chọn :) đừng nghĩ C và C ++ là kẻ thù tốt ở đây.
edmz

9

Haskell , bị nứt bởi Ben

main=main--

Hãy thử trực tuyến! Đây phải là một chương trình đầy đủ đọc hai số từ stdin và xuất tổng thành stdout.

Mỗi chương trình đầy đủ bắt đầu bằng cách chạy mainhàm, nhưng ở đây maintự gọi và gây ra một vòng lặp vô hạn. Để làm cho vấn đề tồi tệ hơn, một nhận xét dòng được bắt đầu bằng --trực tiếp đằng sau lệnh gọi đệ quy để ngăn thay đổi nó thành ví dụ main2và sau đó xác định rằng để thực hiện tổng kết.


Giải pháp dự định:

main=main--$()
_ --$ _ = do
     x <- readLn
     y <- readLn
     print $ x+y

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

--bắt đầu một nhận xét dòng trừ khi nó cũng có thể được phân tích cú pháp như là một phần của toán tử. (Việc tô sáng cú pháp dường như không biết về thực tế này.) --$Là một toán tử infix hợp lệ, dùng mainlàm đối số thứ nhất và một số đối số thứ hai giả (). Sau đó, nó được định nghĩa để bỏ qua cả hai đối số và để thực hiện nhiệm vụ được yêu cầu thay thế.



5
bạn chỉ có thể thêm "where main = ..."
michi7x7

+1 cho giải pháp Haskell chỉ hoạt động do đánh giá lười biếng của Haskell.
Jules

9

C (GCC trên Linux) (đã bẻ khóa)

Thay vì sử dụng các kỹ thuật hộp cát đọc tập tin ngớ ngẩn, chúng tôi thực hiện theo cách thích hợp - với danh sách trắng của SECCOMP!

Nhiệm vụ của bạn: thực hiện bổ sung với đầu vào từ STDIN và xuất ra STDOUT.

#include <stdlib.h>
#include <unistd.h>
#include <sys/prctl.h>
#include <linux/seccomp.h>
#include <syscall.h>
#include <stdio.h>
void sandbox();
__attribute__ ((constructor(0))) int s() {
    close(0);
    close(1);
    close(2);
    prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
}
int main() {
    sandbox();
    syscall(SYS_exit, EXIT_SUCCESS);
}
void sandbox() {
    // Your code here!
}

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

WTF là đây!?

Để giúp bạn trong nhiệm vụ không thể vượt qua của mình, tôi sẽ giải thích mã này làm gì.

__attribute__ ((constructor(0)))đảm bảo schức năng được chạy trước. Hàm đóng tất cả các mô tả tệp đang mở cho STDIN, STDOUT và STDERR. Sau đó, chương trình tự giới hạn bản thân với danh sách trắng SECCOMP nghiêm ngặt, điều này giới hạn các cuộc gọi hệ thống của bạn như sau:

read(2)
write(2)
_exit(2)
sigreturn(2)

Do đó, bạn không thể mở bất kỳ tệp mới nào (hoặc về cơ bản làm bất cứ điều gì). Sau đó chúng tôi đến chính và gọi mã của bạn, được gói gọn trong sandboxhàm.

Các syscall(SYS_exit, EXIT_SUCCESS);ở cuối là chỉ để đảm bảo chương trình thoát sạch - bởi GCC mặc định sẽ thoát ra với exit_group(2)mà không được phép của các danh sách trắng SECCOMP. Hàm thoát này được gọi sau khi mã của bạn được chạy.

Vì vậy, bạn không có mô tả tập tin mở và bạn không thể mở bất cứ điều gì mới. Không thể, phải không? ;)



8

Chế độ thực x86 16 bit hội ( Cracked )

_main:
    call l
    cli
    hlt
l:  pop si
    xor ax, ax
    mov bp, cs
    mov es, ax
    mov di, 12
    mov [di], si
    mov [di + 2], bp
    pushf
    mov bp, sp
    or word [bp], 256
    popf

Dễ dàng nếu bạn biết các mẹo.


1
Làm thế nào bạn lấy đầu vào? Trên ngăn xếp, hoặc trong sổ đăng ký? (Ngoài ra, có vẻ như đây được cho là lắp ráp 16 bit, nhưng nếu vậy, or [bp], 256không hợp lệ. Có phải là vậy or WORD PTR [bp], 256không?)
Cody Gray

1
Ngoài ra, bạn nên xác định xử lý bạn đang sử dụng; có rất nhiều phiên bản x86 và bản sao ngoài kia, và rất nhiều hướng dẫn không xác định. Nếu tôi đã viết mã cho một "bản sao 80186 tối nghĩa" mà tình cờ có một hướng dẫn không xác định có một vài đối số và blah blah blah ... Chúng ta cũng có thể cần môi trường. Ví dụ, Windows 16 bit đã đảm bảo SS == DS đảm bảo rằng các hệ thống khác có thể không.
Orion

1
Bạn chỉ cần xác định xử lý nếu bạn thực sự đang sử dụng một số thủ thuật mà chỉ hoạt động trên một mô hình cụ thể (hoặc một thế hệ đặc biệt). Mã này không giống như vậy, vì vậy tôi nghĩ "x86-16" là đủ. Theo tôi, càng chung chung càng tốt. Đồng ý rằng chế độ thực hoặc được bảo vệ phải được chỉ định, mặc dù sự hiện diện của hltlệnh (vòng 0) ngụ ý mạnh mẽ rằng đây không phải là chế độ được bảo vệ.
Cody Grey

3
@Joshua nếu nó không hoạt động trên mọi nền tảng, ít nhất bạn phải chỉ định một nền tảng mà nó sẽ hoạt động, tôi tin. Your submission must contain enough information before being revealed to be reproducible after being revealed
Stephen

1
@StepHen: Giải pháp để phá vỡ ngôn ngữ là bất khả tri nền tảng một khi đã chỉ định chế độ thực x86-16, nhưng I / O không phải là bất khả tri nền tảng. Anh ta phá vỡ nó có thể chỉ định HĐH mà anh ta đã phá vỡ. Tôi đã thêm nhãn _main muộn để ai đó về lý thuyết có thể phá vỡ gần như bất khả tri bằng cách liên kết với libc.
Joshua

4

Javascript, đã bẻ khóa

Thử thách này được xây dựng từ Grant Davis , nhưng sửa chữa giải pháp mà anh ta có trong đầu (tạo ra iframe và sử dụng iframe window). Giải pháp chạy trong bảng điều khiển javascript trên chrome about:blank pagevà mất hai input()giây, thêm chúng lại với nhau và console.logkết quả. Đặt mã của bạn sau:

d=prompt=console=document;new MutationObserver(s=>s.forEach(e=>{t=e.target;t.parentNode.removeChild(t)})).observe(d,{"childList":d, "subtree":d})

Trước tiên, chúng clobber promptconsolevà thiết lập các phím tắt d. Sau đó, chúng tôi tạo ra một người quan sát đột biến với một cuộc gọi lại để loại bỏ mọi mục tiêu bị đột biến. Chúng tôi đặt người quan sát đột biến đó để quan sát tài liệu, đồng thời thông báo childListsubtreesửa đổi. Thay vì theo nghĩa đen true, chúng tôi sử dụng lối tắt của chúng tôi đến giá trị trung thực document( thông số kỹ thuật không cho phép điều này, nhưng chrome thì có).

Sau khi tôi đăng bài này, tôi nhận ra một chiếc áo choàng thanh lịch hơn nhiều. Giải pháp dự định của tôi vẫn hoạt động, nhưng vết nứt được đăng không:

 h=document.querySelector("html");h.parentNode.removeChild(h);

Chào mừng đến với trang web! Tôi quan tâm để xem giải pháp sẽ là gì :)
DJMcMayhem


4

Perl 5, bị nứt bởi Ilmari Karonen

$_=<DATA>;
s/[+'{dPz|K.UD!_ iJ;o}e6tjWb7253k@%&Iq4l0AN:?\$8B`Yywn9^pfmZQTF"M#-]//g;
eval;
print@_,$!,pop,shift,<>,eval"@>",$\,@ARGV,eval"@$",$@,eval"@@",$,,eval"@,",$/
__DATA__

Đầu vào được nhận trên các dòng riêng biệt STDINvà đầu ra được in tới STDOUT.

Tất cả các mã đi sau __DATA__điểm đánh dấu. Điều này sử dụng một phương pháp tương tự như giải pháp của @ WheatWizard ở chỗ mã được phân tích cú pháp và các ký tự không sử dụng được xóa.

Điều này đã được thử nghiệm trên các phiên bản 5.8, 5.10 và 5.16 và không yêu cầu cờ dòng lệnh.

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


2
Bạn có thể vui lòng chỉ định phương thức và định dạng đầu vào / đầu ra không?
Ilmari Karonen

@IlmariKaronen Xin lỗi, đó là STDINký tự trên các dòng riêng biệt và STDOUT. Tôi sẽ thêm nó vào cơ thể chính.
Dom Hastings

Tôi nghĩ là bị nứt .
Ilmari Karonen

4

Python 3, bị bẻ khóa bởi zbw

import sys
for mod in sys.modules.values():mod.__dict__.clear()
1+1

Tất cả các bản sửa đổi đã bị xóa, điều đó có nghĩa là không có bản dựng sẵn và không có nhiều thứ khác có thể được thực hiện. Đầu ra cho STDOUT, đầu vào từ STDIN. Đây là lần lặp thứ hai của câu trả lời này sau khi câu trả lời trước bị phá vỡ bởi một vết nứt tầm thường bằng cách thêm một câu lệnh break.


Tôi thực sự tò mò muốn xem đoạn trích hoạt động sau này
NickA

Chà, bạn phải đợi bảy ngày hoặc cho một vết nứt không tầm thường, tùy theo điều kiện nào đến trước ...
pppery


Chà, tốt, những thử thách như thế này rất khó để thực hiện tốt
pppery 21/07/17

4

APL (ngn-apl) , bị bẻ khóa bởi ngn

Được hợp tác với đồng nghiệp Marshall của tôi .

Nhập thông qua các đối số trái và phải để +. Tức là mục tiêu của bạn là chèn mã sau đây, để dòng cuối cùng của bạn đọc ⎕←3+2và xuất 5thành STDOUT.

+←-←−←⍴←≢←≡←⊥←⊤←⍟←○←⍳←⌹←~←∈←∊←⍷←<←≤←=←≥←>←≠←,←⍪←⌷←⌽←⍉←⊖←{}⋄⍣←∘

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

Hoạt động bằng cách đặt tất cả các hàm hữu ích để {}nhận một hoặc hai đối số và trả về một danh sách số trống. Cũng thiết lập để chỉ soạn các chức năng.


Nứt

+←{⌈/⍋⍺⍵1/0}

⍺⍵1/0 sao chép 0 bằng đối số bên trái và đối số bên phải và 1

 lấy các chỉ số sẽ sắp xếp điều đó (vì tất cả các phần tử đều bằng 0, nó cho 0 1 22 (a + b)

⌈/ giá trị tối đa (a + b)


ngn / apl bao gồm khả năng thực thi JavaScript tùy ý. Tôi không coi giải pháp đó là hợp lệ, vì sau đó sẽ là về việc vô hiệu hóa JavaScript chứ không phải APL. Thực sự có một cách hợp lệ (mặc dù tối nghĩa) để thiết lập lại +chỉ bằng APL thuần túy và không có thủ đoạn bẩn.
Adám

3

Con trăn 2 , bị nứt

Đây là lần lặp lại thứ hai của một câu trả lời đã bị bẻ khóa một lần bởi @HyperNuetrino bằng một phương pháp mà tôi không ngờ tới. Bây giờ tôi đã vá nó vì vậy hy vọng các giải pháp duy nhất còn lại sẽ phải tuân theo các hạn chế mà tôi dự định.

Triển khai bổ sung như là một chức năng được đặt tên

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
sys.modules['sys'],sys.modules['os']=None,None;del sys;f=lambda\

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


Tôi nghĩ rằng tôi có thể làm điều này nếu tôi có một u, nhưng tôi bị mắc kẹt mà không có nó.
isaacg

@isaacg Chỉ vì tò mò, bạn sẽ làm gì với u?
Phù thủy lúa mì

.count. Tôi có thể nhận được một chuỗi miễn là đầu ra mong muốn, nhưng tôi không có cách nào để lấy chiều dài của nó.
isaacg

__import__('sys').setrecursionlimit(100)... và không có gì thực sự được vá. Tôi thực sự không cảm thấy muốn đăng nó trong chủ đề của tên cướp, cảm thấy như gian lận. Dùng thử trực tuyến
Ink Ink


3

Java 8, bị bẻ khóa bởi @ OlivierGrégoire

Đây là nỗ lực của tôi. Khá nhiều, ý tưởng là chỉ quá tải tất cả các không gian tên bạn có thể sử dụng để xuất ra (và phản ánh, tôi hy vọng). Đầu ra được dự định để sdout (System.out).

class java {
    public static void main(String[]s){
       //there is no executable code in snippet one.
       //your code here.
    }
    class Class{}
    class Method{}
    class System{}
    class FileDescriptor{}
    class Logger{}
    class Runtime{}
    class Scanner{}
}

Danh sách đen thường là một cách tiếp cận tồi tệ hơn danh sách trắng, vì vậy tôi chắc chắn rằng đó chỉ là vấn đề thời gian trước khi ai đó đưa ra một cách tiếp cận mà tôi không xem xét.


1
Đây không phải là một lớp thực thi ...
Olivier Grégoire

1
@ OlivierGrégoire Xin lỗi về điều đó, tôi đã thêm class String{}sau khi thử nghiệm mà không nhận ra nó sẽ bị loại main(String[] ...). Nó sẽ hoạt động ngay bây giờ
Lord Farquaad

1
Đúng, sẽ làm điều đó, cảm ơn bạn! :) Tuy nhiên, điều đó không làm thay đổi vết nứt mà tôi sắp làm: p
Olivier Grégoire

1
Nứt! Tôi thực sự rất thích cái này :)
Olivier Grégoire

1
Tôi đã xem xét một cái gì đó như thế này (xin lỗi thật khó để định dạng mã trong các bình luận), nhưng tôi nghĩ giải pháp của bạn sạch sẽ hơn nhiều:int sum = 0; new Exception("" + sum) { public void printStackTrace() { ClassLoader cl = ClassLoader.getSystemClassLoader(); try { printStackTrace(new PrintStream((PrintStream)cl.loadClass("java.lang.System").getDeclaredField("out").get(null))); } catch (Exception e){} } }.printStackTrace();
Lord Farquaad

3

CQuents, bị nứt bởi Mayube

#|1,1:A

Điều này khá dễ dàng, nhưng bạn không bao giờ biết.

"Vấn đề" là không có Cmã của bạn, bạn đã gặp lỗi.

Giải pháp của Mayube:

#|1,1:A+BC

Mỗi mục trong chuỗi là đầu vào đầu tiên cộng với lần thứ hai lần thứ ba (còn gọi là 1)

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

#1,1:A+B,C

Chuỗi tuần hoàn giữa đầu vào đầu tiên cộng với đầu vào thứ hai và đầu vào thứ ba (1). Mục đầu tiên trong thứ hai là A+B.

#1,1:A+B+C-C

Tương tự như giải pháp của Mayube - thay vì nhân lên B*C, chỉ cần thêm Cvà sau đó trừ nó.

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

Giải trình

#|1,1      Append 1 and 1 to the end of the user's input
     :     Set mode to : (sequence 1: if given n, output nth term in sequence; if given no n, output whole sequence)
      A    Each item in the sequence equals the first input

Hiện tại, chương trình này xuất ra 1, vì không có đầu vào của người dùng, đầu vào đầu tiên là đầu 1vào đầu vào mặc định ( #).


Các tài liệu dường như thực sự lúng túng, tôi không thể hiểu được ý nghĩa của nó khi nó nóiDefault input is combined with user input to form the total input, which must align with the expected input (which is based on the highest input requested by the Sequence Definition)
Skidsdev

@Mayube thật lạ, tôi cần tìm cách nói chính xác. Về cơ bản, đầu vào của bạn cho chương trình có thể bằng với đầu vào cao nhất được truy vấn bởi các biến A,B,C,D,Etrong mã. Ví dụ, nếu tại bất kỳ thời điểm nào bạn có biến Dtrong chương trình của mình, trình phân tích cú pháp dự kiến ​​sẽ có 4 đầu vào, nhưng nếu có một đầu vào, Etrình phân tích cú pháp dự kiến ​​sẽ có 5 đầu vào. Không thể có ít hơn số tiền dự kiến. Tuy nhiên, luôn có một đầu vào cuối cùng tùy chọn n, được sử dụng theo những cách khác nhau bởi các chế độ khác nhau.
Stephen

@Mayube đoạn trích tôi đã đăng ở trên có chứa một A, vì vậy nó tìm kiếm một đầu vào. Vì có hai, cả hai đều xuất phát từ #đó chỉ định đầu vào mặc định, nên nó sử dụng Agiá trị đầu tiên là giá trị thứ nhất và giá trị thứ hai là n.
Stephen

Vì vậy, nếu tôi đưa ra 2 đầu vào và nối thêm BC, A sẽ là đầu vào đầu tiên, B sẽ là đầu vào thứ hai, C sẽ là 1 và n sẽ là đầu vào thứ hai?
Skidsdev

@Mayube chính xác, xin lỗi cho các tài liệu nhảm nhí của tôi. TMI: nếu phần đầu trông giống như #1,1(không có thanh), thì đó sẽ là: A là 1 đầu tiên, B là 1 thứ hai, C là đầu vào thứ nhất và n là đầu vào thứ hai. Bạn cũng có thể làm #1|1, trong đó A là đầu tiên 1, B là đầu vào đầu tiên, C là đầu vào thứ hai và n là đầu vào thứ hai 1.
Stephen

3

Node.JS phiên bản 7.3.0 (Được bẻ khóa bởi Dom Hastings)

var p=process,f;(_=>{var w=p.stdout.write,n='f'+(Math.random()*1e7|0),l=1
f=p.stdout.write=a=>eval(`(function ${n}(a){while(l&&((typeof a)[0]!='s'||'f'+a!=n));a=l?l="":a;w.apply(p.stdout,arguments);})`)(a)})();

Đặt khối mã thứ hai sau khối thứ nhất.

Tuyên bố từ chối trách nhiệm: khối mã thứ hai sẽ không tự hoạt động (không được đặt sau khối thứ nhất). Nếu điều này không được phép tuy nhiên tôi có thể sửa đổi đoạn mã thứ hai.

Đây là một chương trình đầy đủ. Đầu ra là process.stdout(STDOUT), đầu vào là process.argv(đối số dòng lệnh)

Đây là cảnh sát và tên cướp đầu tiên của tôi, hy vọng đây là một thử thách tốt :)

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


Thử thách giải thích

Tạo một biến ngẫu nhiên ntừ 0 đến 1e7. Nếu bạn gọi viết đúng n, không in bất cứ thứ gì ngoài việc đặt lthành 0, "mở khóa" chức năng ghi, cho phép bạn in bất cứ thứ gì. Nếu bạn cố gắng gọi write với một chuỗi không phải chuỗi, sẽ gửi bạn vào một vòng lặp vô hạn. Nếu bạn cố gắng gọi write bằng bất cứ thứ gì khác ngoài chính xác ntrong khi write bị "khóa", hãy gửi bạn vào một vòng lặp vô hạn để tránh đoán.

Các giải pháp dự định

Lén lút qua loại hình dường như chỉ kiểm tra các chuỗi bằng cách sử dụng Biểu tượng, cũng bắt đầu bằng s. Điều này đưa ra một lỗi trong hàm do cuộc gọi eval vì bạn không thể thêm chuỗi "f" vào Biểu tượng. Chúng tôi bắt lỗi và sử dụng regex để khôi phục ntừ dấu vết ngăn xếp, trong đó có tên của hàm. Sau đó, chúng tôi cố gắng viết nmà không in bất cứ điều gì, nhưng đặt biến "khóa" lthành 0 để "mở khóa" chức năng ghi. Bây giờ chức năng ghi đã được mở khóa, chúng tôi chỉ cần in tổng.

try{f(Symbol())}catch(e){f(e.stack.match(/f(\d+)/)[1])
f(+p.argv[2]+ +p.argv[3]+"")}


Đó là thiên tài ... ban đầu tôi đã đi đúng hướng! Cảm ơn đã đào tạo não!
Dom Hastings

3

RProgN2 , Cracked bởi Arnold Palmer

"+-/*÷^"{²[[\=};

Viết trên tất cả các toán tử toán học, không có cách nào để khôi phục chúng. Cụ thể, nó thay thế chúng bằng một chức năng loại bỏ hai mục trên cùng trong ngăn xếp.

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

Giải pháp gốc

{S]‘[L}`d={0RL}`i=«x=y=x{xd`x=yi`y=x}:y»`+=

{S]‘[L}`d={0RL}`i=«x=y=x{xd`x=yi`y=x}:y»`+=
{     }`d=                                  #Define a function, "d", which returns n-1
 S                                          #Convert the input to a stack, which, as a number, makes a stack of 1 - n.
  ]‘                                        #Duplicate the stack, and pop the top value off it.
    [                                       #Discard the popped'd value.
     L                                      #Get the length of the stack, which now is n-1.
          {   }`i=                          #Define a function, "i", which returns n+1
           0R                               #Get the range of numbers between 0 and n.
             L                              #Get the length of that stack, which is n+1
                  «                    »`+= #Define a function, "+", which takes two numbers, and outputs their sum. We use «» here, because it localises references, instead of globalising them.
                   x=                       #Set the first input to the value of "x", which by default, is x.
                     y=                     #Ditto for y.
                       x{          x}:      #While x is truthy, which in this case, is non-zero.
                         xd                 #Get x - 1
                           `x=              #Set x to it.
                              yi`y=         #And set y to y + 1
                                      y     #Push y to the output. And we're done.

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


Tôi đang xem qua tài liệu của bạn và dường như tôi không thể tìm thấy ²biểu tượng đó làm gì. Quan tâm để soi sáng cho tôi?
Arnold Palmer

Tài liệu đó không liên quan nhiều đến RProgN2 và biểu tượng đó có hai khái niệm tiếp theo [[trong trường hợp này và bao bọc chúng trong một hàm @ArnoldPalmer
ATaco


Dang, tốt hơn nhiều. Tôi không biết về các toán tử ngăn xếp, điều này chắc chắn sẽ tiện dụng. Ngoài ra, việc biết «»tạo ra các biến cục bộ thay vì làm rối tung các biến toàn cầu sẽ cực kỳ hữu ích.
Arnold Palmer

3

Haskell, 161 144 byte, Cracked bởi chim bông lau

{-#OPTIONS_GHC -fth -w#-}
module M where

Nhập vào STDIN, xuất ra STDERR. Thêm vào cuối chương trình.

Chỉnh sửa: Dự định sẽ được biên dịch mà không có đối số GHC bổ sung, chỉ là bình thường ghc --make prog.hs.

Chỉnh sửa một lần nữa để giảm số byte.

Chúc vui vẻ!


Vì vậy, tôi không thể làm điều này, bởi vì chức năng chính sẽ không được gọi? main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
BlackCap

@BlackCap Không, vì GHC hy vọng mainchức năng sẽ có trong mô-đun Mainkhi không có -main-iscờ được cung cấp.
zbw

Điều này không hiệu quả, nhưng dù sao tôi cũng muốn chia sẻ ý tưởng
BlackCap

Tôi sẽ gọi nó bị nứt. Đây là giải pháp dự định của tôi, đánh golf xuống. Nó không hoạt động trên TIO, vì trình bao bọc không gửi đầu vào cho trình biên dịch.
zbw

Nếu bạn đăng giải pháp của mình, tôi sẽ đánh dấu nó bị nứt.
zbw

3

Mascarpone , bị nứt bởi Ilmari Karonen

[ Make 'i' and 'z' print 'q' ]$
v ['q.]v* 'i<^
v ['q.]v* 'z<^

[ Disable some standard commands ]$
v[]v*   '1<^
v[]v*   '$<^
v[]v*   '@<^
v[]v*   '{<^
v[]v*   '}<^
v[<:]v* '<<^
v[]v*   'v<^$

Đầu vào là số nhà thờ trên stdio, sử dụng iđể tăng và zkhông. Chẳng hạn, 2 + 3 sẽ là:

iiziiiz

Với một dòng

đầu ra mới, nên là một số trên thiết bị xuất chuẩn, có cùng định dạng như trên stdio. Ví dụ: nếu câu trả lời là năm, bạn nên xuất ra:

iiiiiz

(mascarpone không có khái niệm về số)


Giải pháp dự định:

: '[/''/'i/'./' /':/',/'>/'!/']/* 'i<^
: '[/':/',/'>/'!/']/* 'z<^
: ,>!
'z.

Nó không rõ ràng ngay lập tức từ tài liệu, nhưng như @IlmariKaronen đã nêu trong bản crack của mình, chuỗi ký tự trong Mascarpone thực sự là cú pháp đường để đẩy một chuỗi các ký tự.

Tôi cố tình viết bình luận muốn [this]$làm cho nó giống như tôi đang đẩy một chuỗi và bật nó ngay lập tức sau đó. Một cracker ngây thơ có thể đã thử một cái gì đó như [:,>!]/*đẩy một chuỗi, trao đổi nó với trình thông dịch và giải thích nó.

Tôi cũng giả vờ bật trình thông dịch mà tôi để lại trên ngăn xếp $, nhưng $đã được xác định lại thành NOP. Bạn còn lại với trình thông dịch này trên ngăn xếp và bạn phải mang theo bên mình toàn bộ chương trình; máng từng ký tự của mỗi chuỗi.


Nứt. Và không, tôi chưa bao giờ nghe nói về Mascarpone trước thử thách này.
Ilmari Karonen

@IlmariKaronen Ngôn ngữ yêu thích mới? Làm tốt lắm!
BlackCap

2

C # (.NET Core) đã bị bẻ khóa bởi Ilmari Karonen

Cũng bị nứt bởi Joshua .

namespace System
{
    class Console
    {
        static void Main()
        {
            //Your code goes here
        }
    }
}

Đọc hai giá trị từ stdin và ghi kết quả vào thiết bị xuất chuẩn. Đã thử nghiệm trên Windows với Framework Phiên bản 3, 4.6 và trên TIO .

Đây là chương trình đầy đủ tôi đã dự định.

namespace System
{
    class Console
    {
        static void Main()
        {
            var t = Reflection.Assembly.Load("mscorlib").GetType("System.Console");
            var r = t.GetMethod("ReadLine");
            int a = int.Parse((string)r.Invoke(null, null));
            int b = int.Parse((string)r.Invoke(null, null));
            var w = t.GetMethod("WriteLine", new[] { typeof(int) });
            w.Invoke(null, new object[] { a + b });
        }
    }
}

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



codegolf.stackexchange.com/a/133412/14306 Tôi cho rằng đây không phải là giải pháp dự định.
Joshua

@IlmariKaronen: +1. Đây là giải pháp dự định.
raznagul

@Joshua: +1 để tìm một giải pháp khác với dự định của tôi.
raznagul

2

GolfScript , bị bẻ khóa bởi Dennis

{}' !$%&()*+,-./<=>?@[\]^`|~'':'*~;

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

Rốt cuộc, đây một thử thách , vậy tại sao bạn không thử chơi GolfScript?

Một giải pháp hợp lệ phải là một đoạn mã đọc hai số nguyên khỏi ngăn xếp, cộng chúng lại với nhau và trả về kết quả trên ngăn xếp. Điều hấp dẫn là nó vẫn hoạt động ngay cả sau khi đoạn mã trên đã định nghĩa lại gần như tất cả các toán tử GolfScript tích hợp để không làm gì hết. Ít nhất là tôi ;không bị ảnh hưởng, vì vậy bạn vẫn có thể bật các giá trị ra khỏi ngăn xếp. ;-) Mã của bạn sẽ hoạt động trên trình thông dịch GolfScript tiêu chuẩn, như được triển khai, ví dụ như trên TIO (xem liên kết ở trên).


Giải pháp của Dennis , giống như của tôi , dựa vào tính năng hiếm khi được sử dụng của GolfScript, cho phép mã Ruby được nội suy theo chuỗi trích dẫn kép. Chúng tôi sử dụng tính năng này để xác định toán tử bổ sung mới hoạt động chính xác như +toán tử tích hợp, sau đó gọi nó.

(Một lý do tại sao tính năng nội suy Ruby trong GolfScript hiếm khi được sử dụng là vì lúng túng, mã Ruby được nội suy được thực thi trong quá trình phân tích cú pháp và đầu ra của nó được lưu trữ bởi trình thông dịch GolfScript. Do đó, nếu bạn có một chuỗi có mã Ruby được nội suy trong một vòng lặp, mã sẽ chỉ chạy một lần trước khi chương trình thực tế bắt đầu và sau đó luôn trả về cùng một giá trị trên mỗi lần lặp của vòng lặp. Bạn có thể làm việc xung quanh đó bằng cách sử dụng chuỗi eval để trì hoãn phân tích cú pháp, nhưng điều đó làm cho cú pháp khó xử hơn nữa xấu xí và dài dòng, và trong mọi trường hợp, đối với thử thách này, tôi cũng đã vô hiệu hóa toán tử eval ~. Tuy nhiên, hóa ra việc xác định các toán tử GolfScript tích hợp mới là một điều mà tính năng này thực sự làm khá độc đáo và sạch sẽ.)



Nứt. Cuối cùng đã tìm ra những gì tôi đã làm sai.
Dennis

@Dennis: Yeah, bạn đóng đinh lần này. FWIW, giải pháp dự định của tôi"#{var'_','gpush a+b'.cc2}";_, hoạt động chính xác như của bạn ngoại trừ ngắn hơn một vài byte.
Ilmari Karonen

2

Node.js v8.2.0, bị bẻ khóa bởi Dom Hastings

let mess = ctx => f => new Proxy (f, {
  has: (t, p) => p in t || p in ctx
, get: (t, p) => {
    let k = p in t? t[p]: ctx[p];

    if (k instanceof Function) return (
      function fetch (_k) {
        return mess (ctx) ( x => ( q => q instanceof Function
                                      ? fetch (q)
                                      : t (q)
                                  ) ( _k(x) )
                          )
      })(k);

    return k;
  }
});

with (mess (global) (x => x)) {
  dot   = f => a => b => f(a(b))
  ap    = f => g => x => f (x) (g (x))
  flip  = f => x => y => f (y) (x)
  Const = a => b => a
  id    = x => x
  num   = n => n (x => x + 1) (0)
  log   = console.log

  let x = flip (Const . id . id)
    , y = flip (Const . id . id . id)
  for (let i = 0; i < process.argv[2]; i++) x = ap (dot) (x)
  for (let i = 0; i < process.argv[3]; i++) y = ap (dot) (y)
  process.argv = [];

  logic = x => y => /* Your code here */;

  log . id . num ( logic (ap (dot) (x))
                         (f => z => (( y(flip (id) . id . flip (dot (id)) (f)) ) (Const (z))) (id) )
                 );
}

Bạn đang thực hiện logicchức năng. Đầu vào là các đối số được cung cấp (từ stdin), đầu ra là bất cứ điều gì hàm của bạn trả về (được in ra thiết bị xuất chuẩn).


Nhà thờ mã của tôi mã hóa các số từ đầu vào. Phần còn lại của mã chỉ ở đó để đe dọa bạn.
Hàm lộn xộn thực hiện một số mánh khóe để thực hiện ký hiệu không có điểm ( a . b == dot (a) (b)) mà tôi thường sử dụng để thêm . id .vào các vị trí ngẫu nhiên, không làm gì cả, nhưng sẽ gây nhầm lẫn cho bất kỳ ai không quen với lập trình hàm.
Phép biến đổi được áp dụng cho các số trước khi tôi chuyển chúng vào logichàm là x+1và cộng y-1với 0, vì vậy đây là một NOP khác để thêm vào phần tối nghĩa.

Giải pháp dự định là:

logic = x => y => f => z => x (f) (y (f) (z))


@DomHastings Đó không phải là giải pháp dự định, nhưng tôi sẽ nói rằng bạn có thể, miễn là chương trình tạm dừng mà không có ngoại lệ, và không in thêm ký tự cho đầu ra
BlackCap 20/07/2017

Tôi vừa đăng một bài thay thế! (Bạn có thể thấy giải pháp trước đây của tôi trong lịch sử của câu trả lời đó!)
Dom Hastings

Ôi chà, tôi là một lối thoát ... Vẫn còn tốt hơn lần thử đầu tiên rất gian lận của tôi! Cảm ơn vì câu đố!
Dom Hastings

2

Thông báo 7 , bẻ khóa bởi ppperry

For reading a command: rule fails.

[Your code here.]

Đầu vào phải được người chơi nhập vào dưới dạng lệnh tương tác, ví dụ add 17 to 25hoặc sum 17 25. Bạn có thể chọn hình thức chính xác của lệnh nên nhập, miễn là nó bao gồm hai số. Tổng số các số (ví dụ 42) nên được in để đáp ứng với lệnh.

Tất nhiên, thách thức là thực hiện điều đó trong khi toàn bộ hoạt động "đọc lệnh" được thay thế bằng lệnh cấm. Có lẽ có một số cách để giải quyết vấn đề này, nhưng ít nhất nó cần một chút quen thuộc với ngôn ngữ. Người mà tôi nghĩ ra thực sự khá đơn giản, nếu hơi bất ngờ.

Tôi đã thử nghiệm giải pháp của mình trong IDE Gnome Inform 7, phiên bản 6L38 , trên Ubuntu Linux. Giải pháp dự định hoạt động trên cả hai back-end Glulx và Z-machine, và cũng sẽ hoạt động trên các phiên bản khác của Inform 7. Lưu ý rằng (không có cách khắc phục phù hợp) đoạn mã trên sẽ khiến trình thông dịch bận vòng lặp khi nó cố đọc lệnh; trình thông dịch máy Z dường như trở nên hoàn toàn không phản hồi khi điều này xảy ra và không thể dừng lại trong IDE, vì vậy tôi khuyên bạn nên sử dụng Glulx để thử nghiệm.


bị bẻ khóa , và trong trường hợp bạn đang tự hỏi, tôi chưa bao giờ nghe thông báo trước thử thách này
pppery

2

CPython 3 (một lần nữa), bị nứt bởi Sisyphus

import sys,os,functools
def p(f,e,a,_=os._exit):
 if e == "c_call":_(1)
sys.setprofile(p)

Bạn có thể làm bất cứ điều gì bạn muốn - miễn là nó không được thực hiện trong C. Điều này có nghĩa là không print, không input- tất cả những thứ đó sẽ chạm vào _(1)dòng và chấm dứt. Nhập từ STDIN với các số trên hai dòng riêng biệt, xuất ra STDOUT. Tôi tự hỏi điều này sẽ kéo dài bao lâu ... Tôi đã mất khá nhiều thời gian để tìm đoạn trích làm việc thứ hai sau khi nghĩ ra thủ thuật vô hiệu hóa này. Rõ ràng chỉ định Cpython để tránh bị bẻ khóa dựa trên một số triển khai thay thế của sys.setprofile.


Nứt. Tôi có rất ít ý tưởng tại sao điều này làm việc.
Sisyphus

Tôi đoán tôi có thể hỏi bây giờ: tại sao functools?
Dennis

@Dennis Bởi vì sispyphus đã phát hiện ra một kẽ hở, không phải là giải pháp dự định
pppery 22/07/17

@Sisyphus Vết nứt của bạn đã được báo cáo là một lỗi trong python
pppery

2

Java 8 (đã bẻ khóa )

Lần thử thứ hai. Lần này tôi đầu tư hai phút thử nghiệm.

static {

    try {

        System.setIn(null);
        System.setOut(null);
        System.setErr(null);

        for (Method m : System.class.getMethods()) {

            m.setAccessible(false);

        }

        System.class.getMethod("getSecurityManager", new Class[0]).setAccessible(false);

        for (Method m : Class.class.getMethods()) {

            m.setAccessible(false);

        }

        SecurityManager mngr = new SecurityManager() {

            @Override
            public void checkPermission(Permission p) {

                if (p.getName().equals("createSecurityManager")) throw new SecurityException();
                if (p.getActions().startsWith("read")) throw new SecurityException();

            }

        };

        System.setSecurityManager(mngr);

        // Your code goes here.

    } catch (Throwable t) {

    }

}

Hầu hết mọi thứ shouuuld được bảo hiểm.


1
Bạn có vui lòng gửi kèm trong lớp này với hàng nhập khẩu phù hợp không? Đó là loại thách thức mà những thay đổi nhỏ này có thể thực hiện hoặc phá vỡ một mục. Tôi đã nhận được một số giải pháp cho giải pháp này, nhưng điều đó sẽ giảm đáng kể nếu bạn chỉ đơn giản đưa nó vào một lớp / giao diện. Ngoài ra, định dạng để loại bỏ tất cả những người trong khi các dòng sẽ khá tốt cho chúng tôi, độc giả.
Olivier Grégoire

Ở đó, một câu trả lời bẻ khóa bằng cách sử dụng chính xác mã của bạn. Và +1 vì dường như tôi đã quên nó. Lấy làm tiếc.
Olivier Grégoire

Các lệnh gọi #setAccessible (false) không làm gì cả.
Nevay

1

Python 2 bị nứt

import sys,hashlib
c=open(__file__).read().split()[-1]
if c!='#'and hashlib.sha256(c).hexdigest()!='e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843':sys.exit() #

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

Tôi sẽ mở đầu điều này bằng cách nói câu trả lời này là một động thái giật, được dự định là một câu trả lời giới hạn thấp hơn.


Lấy cảm hứng từ câu trả lời của Wheat WizardHyperNeutrino .

Đoạn mã đọc tệp nguồn và từ chối tiếp tục nếu đoạn mã được phân tách bằng khoảng trắng cuối cùng không sha256 vào e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843.

EDIT : Chỉnh sửa một chút để phản hồi bình luận này . Vấn đề cốt lõi không thay đổi, bất kỳ nỗ lực bẻ khóa nào đều không bị vô hiệu.


1
RE đoạn trích đầu tiên:This code is not allowed to crash or exit.
Stephen

Điều này không hợp lệ vì nó thoát, không được phép cho đoạn đầu tiên.
DJMcMayhem


1

Java 8 đã bị bẻ khóa bởi @ OlivierGrégoire

Tôi đã cố gắng để làm cho nó càng khó càng tốt! :) Và, không giống như câu trả lời Java khác cho đến nay, bạn sẽ phải tuân theo các quy tắc chính xác của thử thách, bằng cách đặt nó sau toàn bộ đoạn mã này (vì vậy không, bạn không đặt mã của mình vào public static void main(String[] args)phương thức, bạn đặt nó vào sau cả lớp. :) Chúc may mắn!

Tôi đã thêm ý kiến ​​để hiển thị những gì đang bị hạn chế.
( Lấy cảm hứng từ bài đăng này, ít hạn chế và dễ đánh bại hơn với cách tiếp cận tương tự mà tôi có thể sử dụng cho câu trả lời của mình. )

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FilePermission;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Main {

  // Put everything in a static block so it is run before the static main method 
  // and any trailing (static) initializer-blocks:
  static {
    try {
      initializing();
    } catch (final Exception e) {
    }
  }

  static void initializing() throws Exception {
    // Overwrite System.out, System.err and System.in:
    System.setOut(new PrintStream(new ByteArrayOutputStream()));
    System.setErr(new PrintStream(new ByteArrayOutputStream()));
    System.setIn(new ByteArrayInputStream(new byte[0]));

    // Enable reflection for System.out, System.err and System.in:
    final Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    final Class<?> fdClass = java.io.FileDescriptor.class;
    final Field outField = fdClass.getDeclaredField("out");
    outField.setAccessible(true);
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    final Field errField = fdClass.getDeclaredField("err");
    errField.setAccessible(true);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    final Field inField = fdClass.getDeclaredField("in");
    inField.setAccessible(true);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);

    // Replace existing System.out FileDescriptor with a new (useless) one:
    outField.set(null, new FileDescriptor());
    // Replace existing System.err FileDescriptor with a new (useless) one:
    errField.set(null, new FileDescriptor());
    // Replace existing System.in FileDescriptor with a new (useless) one:
    inField.set(null, new FileDescriptor());

    // Disable reflection for System.out, System.err, System.in again:
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);
    inField.setAccessible(false);
    errField.setAccessible(false);
    outField.setAccessible(false);
    modifiersField.setAccessible(false);

    // Overwrite the SecurityManager:
    System.setSecurityManager(new SecurityManager() {

      private boolean exitAllowed = false;

      @Override
      public void checkExec(final String cmd) {
        throw new SecurityException();
      }

      @Override
      public void checkPermission(final java.security.Permission perm) {
        final String name = perm.getName();
        // You're not allowed to read/write files:
        if (name.equals("setIO") || name.equals("writeFileDescriptor")
            || name.equals("readFileDescriptor")
            || ((perm instanceof FilePermission) && name.startsWith("/proc/self/fd/"))) {
          throw new SecurityException();
        }
        // You're not allowed to overwrite the Security settings:
        if (name.equals("setSecurityManager") || name.equals("suppressAccessChecks")) {
          throw new SecurityException();
        }
        // You're not allowed to use reflection anymore:
        if (name.equals("getModifiers") || name.equals("get") || name.equals("set")
            || name.equals("setBoolean") || name.equals("setByte")
            || name.equals("setChar") || name.equals("setShort") || name.equals("setInt")
            || name.equals("setLong") || name.equals("setFloat") || name.equals("setDouble")
            || name.equals("setFieldAccessor") || name.equals("setFieldAccessor")) {
          throw new SecurityException();
        }
        // When you try to leave the current VM it will stop the program:
        if (name.startsWith("exitVM") && !this.exitAllowed) {
          this.exitAllowed = true;
          System.exit(0);
        }

        // You know what, nothing is allowed!
        throw new SecurityException("Mhuahahahaha!");
      }
    });
  }

  public static void main(String[] args) {
    // Overwritting all given arguments:
    args = new String[0];

    // Exit the program before you can do anything!
    System.exit(0);
  }
}

// Your code goes below:

Hãy thử nó ở đây. (ideone.com thay vì TIO, vì nó dường như không hoạt động ở đó .. Thử nghiệm đã được thực hiện trong IDE Eclipse, nhưng giải pháp dự định của tôi sẽ hoạt động nếu bạn sử dụng ideone.com)



1

Thạch: CRACKED

Điều này sẽ cực kỳ dễ dàng so với câu trả lời Python tuyệt vời của Wheat Wizard, nhưng ở đây chúng tôi đi: P

“for c in code_page:
 if c in atoms:atoms[c].call=None”ŒVø<insert code snippet here>

Hexdigest sha256 của giải pháp khắc phục của tôi, bao gồm đoạn đầu tiên, là cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a.

Ghi chú

Bạn có thể không có bất kỳ dòng mới nào trong mã ngoại trừ các chuỗi nếu không mã này thậm chí sẽ không được chạy, điều này đánh bại mục đích của thách thức này.

Bị bẻ khóa bởi DJMcMayhem

Để công bằng, điều này sử dụng một dòng mới, vì vậy tôi muốn xem một giải pháp không sử dụng một dòng mới.

Cũng là một giải pháp của Jonathan Allan

Điều này không sử dụng một dòng mới, vì vậy nó đã bị bẻ khóa. : P

Giải pháp của tôi là thế này:

“for c in code_page:
 if c in atoms:atoms[c].call=None”ŒVø“print(int(input())+int(input()))”ŒV

Đoạn mã đầu tiên chỉ xóa các nguyên tử ký tự đơn, điều đó có nghĩa là Python eval vẫn hoạt động :)))


Đoạn mã thứ hai luôn được gắn vào cuối đoạn mã đầu tiên.
Stephen

@StepHen Chỉ cần xác định: P Nhưng tôi quên thêm ghi chú; Điều đó thực sự quan trọng.
HyperNeutrino

3
Tôi không nghĩ bạn có thể hạn chế những tên cướp như thế. Nếu bạn có thể bẻ khóa nó bằng Newlines, đó là một vết nứt hợp lệ. Có cách nào để ngăn dòng mới được thêm vào, hoặc buộc dòng đầu tiên được thực thi không?
DJMcMayhem


1
Tôi thích vết nứt dự định của bạn. Rất lén lút.
Dennis

1

JavaScript, bị bẻ khóa

Đầu vào: prompt()hai lần

Đầu ra: console.log()

Giải pháp của tôi không hoạt động trong jsfiddle. Hoạt động trên trang about about: trang trống với bảng điều khiển JS của Google chrome.

prompt=console=0

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

x=document.createElement("iframe")
x.src="data:text/html,<script>console.log(prompt()-0+(prompt()-0))</script>"
document.body.appendChild(x)

Giải trình:

Tôi đã xóa dấu nhắc và bàn điều khiển bằng cách đặt chúng bằng 0.

Trong giải pháp của tôi, tôi tạo một iframe, tạo một hộp cát và một phiên bản mới của cửa sổ nơi dấu nhắc và bảng điều khiển hoạt động chính xác.



@CRDrost Tôi không tin rằng có kiểm tra tính nguyên thủy trong thông số kỹ thuật và bạn không hiển thị cả hai đoạn.
Stephen

Xin lỗi, bạn nói đúng, tôi đọc sai.
CR Drost

1

Java, bị nứt

import java.lang.reflect.*;
public class Main{
  public static void main(String... args){
    System.setOut(null);
    System.setErr(null);
    /*Your code here*/
  }
}

Điều này nên rất dễ bị nứt.

Giải pháp dự định

import java.lang.reflect.*;
public class Main{
public static void main(String... args){
  System.setOut(null);
  System.setErr(null);
  try{
    Class<?> cistream = Class.forName("java.io.InputStream");
    Class<?> cfostream = Class.forName("java.io.FileOutputStream");
    Class<?> costream = Class.forName("java.io.OutputStream");
    Class<?> cfdescriptor = Class.forName("java.io.FileDescriptor");
    Object sout = cfostream.getConstructor(cfdescriptor).newInstance(cfdescriptor.getField("out").get(null));
    Class<?> csys = Class.forName("java.lang.System");
    Field mod = Field.class.getDeclaredField("modifiers");
    mod.setAccessible(true);
    Field stdout = csys.getField("out");
    mod.set(stdout,Integer.class.cast(mod.get(stdout) )&~ Modifier.FINAL);
    stdout.set(null,Class.forName("java.io.PrintStream").getConstructor(costream).newInstance(sout));
    Class<?> cscanner = Class.forName("java.util.Scanner");
    Object scanner = cscanner.getConstructor(cistream).newInstance(System.in);
    Method nextInt = cscanner.getMethod("nextInt");
    int f = Integer.class.cast(nextInt.invoke(scanner));
    int s = Integer.class.cast(nextInt.invoke(scanner));
    int sum = s + f;
    System.out.println(sum);
  }catch(Throwable t){t.printStackTrace();}
  }
}

Dùng thử trực tuyến



Tôi hoàn toàn quên mất java.io.. Nhưng dù sao bạn cũng có giải pháp dự định ..
Roman Gräf

Tôi không thấy bất kỳ vấn đề ở đây. Tôi thực sự đã viết snipet thứ hai chỉ quên chỉnh sửa nó trên. Theo TIO , snipppet đầu tiên biên dịch mà không có bất kỳ cảnh báo nào.
Roman Gräf

@ OlivierGrégoire Xong. Tôi nghĩ rằng bất kỳ IDE nào cũng sẽ mắng tôi vì điều này nhưng ít nhất thì trình biên dịch cũng chấp nhận nó ...
Roman Grä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.