당신의 언어를 * 주로 * 사용할 수 없게 만드십시오! (캅스 스레드)


61

이 의견에서 영감을 얻은 ...

이 도전 과제를 게시하기 전에 사양을 확정하는 데 도움을 주신 Step Hen , Wheat-WizardDennis 사용자에게 감사 합니다!

이것이 경찰의 실입니다. 강도의 실은 여기로


이 과제 에서는 언어가 더 이상 프로그래밍 언어라는 기준을 충족시키지 못하도록 코드를 실행해야합니다. 그 도전에서, 그것은 언어가 더 이상 할 수 없도록 만드는 것을 의미합니다 ...

  • 숫자 입력 및 출력

  • 두 숫자를 더해라

  • 특정 숫자가 소수인지 테스트합니다.

이것은 두 가지 다른 목표를 가진 두 가지 도전 이있는 도전입니다 : 경찰 은 언어를 거의 사용할 수 없게 만드는 코드를 작성하려고 시도 하며 강도 는 경찰을 허용하는 숨겨진 해결 방법을 찾으려고 노력합니다 그들의 언어를 회복하기 위해.

경찰은 두 가지 코드 스 니펫을 작성해야합니다.

  1. 입력 / 출력 및 수치 연산을위한 내장 함수를 제거하여 언어를 거의 사용할 수없는 언어. 더 많은 기능을 제거할수록 좋습니다. 이 코드는 충돌하거나 종료 할 수 없습니다 . 이 스 니펫 끝에 코드를 추가 할 수 있어야하며 해당 코드 가 평가 됩니다. 과...

  2. ... 음수가 아닌 두 정수를 입력으로 취하고 함께 더한 다음 합계를 출력하는 코드 스 니펫입니다. 이 스 니펫은 첫 번째 스 니펫을 실행 한 후에도 여전히 올바르게 작동해야합니다. 두 스 니펫이 결합되면 두 개의 숫자를 추가하는 전체 프로그램을 구성하거나 두 개의 숫자를 추가하는 함수를 정의해야합니다. 이상적으로,이 스 니펫은 찾기 어려울 정도로 매우 모호한 동작에 의존해야합니다.

표준 입력 및 출력 방법을 선택할 수 있습니다 . 그러나 사용중인 형식 (입력 및 출력)을 정확하게 나타내야합니다. 강도는 당신과 같은 형식을 사용하지 않으면 답을 해독 할 수 없습니다.

이 스 니펫을 모두 작성한 후에는 두 번째 스 니펫을 공개하지 않고 첫 번째 스 니펫을 답변으로 게시해야합니다. 귀하의 답변에는 다음 정보가 모두 포함되어야합니다.

  • 번째 스 니펫 (두 번째는 아님).

  • 언어 (마이너 버전 포함, 대부분의 제출물은 이상한 대소 문자를 사용하므로)

  • 함수인지 전체 프로그램인지를 포함한 IO 형식. 강도 균열이 유효하도록 동일한 형식을 사용해야합니다.

  • 답이 작동하는 데 필요한 이상한 경우. 예를 들어, Linux에서만 실행 되거나 인터넷 연결이 필요합니다 . 분명히 이것은 약간 주관적이지만 경찰이 금이가는 것을 막는 극단적 인 가장자리 케이스가 있고 안전 후에 만 ​​드러난다면 나는이 스포츠맨 쉽을 고려합니다. 잠재적 인 강도는 답변을 해독하기 전에 필요한 모든 정보를 가지고 있어야합니다 .

답이 안전해질 때까지 바이트 수를 밝힐 필요는 없습니다.

다음은 예입니다. 첫 번째 스 니펫의 경우 다음 Python 3 프로그램을 제출할 수 있습니다.

파이썬 3

print=None

STDIN에서 입력을 받아 STDOUT으로 출력

그런 다음 두 번째 스 니펫으로 다음과 같이 작성할 수 있습니다.

import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

이것은 두 숫자를 입력으로 취하고 두 스 니펫을 함께 결합하더라도 합계를 출력하기 때문에 유효합니다.

print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

그러나 이것은 강도가 해결책을 찾기가 매우 쉽습니다. 이 방법은 매우 쉽게 해독 할 수 있으므로 다음과 같이이 특정 접근 방식을 패치하려고 시도 할 수 있습니다.

import sys
sys.stdout=None
print=None

그러나 이것조차도 매우 쉬운 해결 방법이 있습니다.

del print
a,b=int(input()),int(input())
print(a+b)

경찰의 목표는 숨겨진 해결 방법을 가능한 한 모호하게하여 강도가 찾지 못하도록하는 것입니다.

강도는 답 중 하나에서보고, 그것을 균열을 시도합니다. 그들은 스 니펫 2로 작동 할 수 있는 유효한 스 니펫을 작성 하여 언어를 해독 할 수 있습니다 (언어를 거의 사용할 수 없게 된 후 두 숫자를 더함). 원래 의도했던 것과 동일한 스니 펫일 필요 는 없습니다 . 강도가 답을 해독하면 답에 댓글을 남긴 다음 답을 해독하여 답을 표시해야합니다. 게시물에 금이 간 경우 원래 의도 한 솔루션 (스 니펫 2)을 표시하도록 답변을 편집해야합니다. 이것은 규칙 그 자체 가 아니며 게임을 재미있게 유지하기위한 친절한 제안입니다. 당신은 필요 없어.

일주일 내내 답이 깨지지 않은 경우 두 번째 스 니펫에서 수정하여 답이 안전하다고 표시 할 수 있습니다 . 일주일이 지난 후에 편집하지 않으면 다른 사용자가 편집 할 때까지 크랙 할 수 있습니다. 두 번째 스 니펫을 공개하지 않으면 답변에 대한 포인트를 청구하거나 안전하게 전화 할 수 없습니다.

경찰 스레드의 승자는 바이트로 계산 된 스 니펫을 포함 하여 가장 짧은 안전 답변 이며, 충분한 시간이 지나면 이 답변 수락합니다. 답이 안전 할 때까지 바이트 수는 점수와 관련 이 없으므로 답이 안전 할 때까지 바이트 수를 표시 할 필요 가 없습니다 . 충분한 시간이 지났는데도 답이 깨지지 않은 경우, 가장 오랜 시간 동안 답이없는 답이 승자가됩니다.

즐기세요!

규칙 설명

  • 첫 번째 스 니펫은 입력하지 않고 올바르게 실행해야합니다 . 스 니펫이 완료된 후 두 번째 스 니펫이 올바르게 실행되는 한 원하는대로 출력 할 수 있으며이 출력은 무시됩니다.

  • 귀하의 답변이 유효 하려면 두 번째 스 니펫 이 실제로 실행 되어야합니다. 이것은 다음과 같은 답변을 의미합니다

    import sys
    sys.exit()
    

    언어를 위반하지 않기 때문에 유효하지 않습니다. 단순히 종료됩니다. 마찬가지로 두 번째 스 니펫은 절대 실행되지 않으므로 무한 루프를 입력하는 것은 유효하지 않습니다.

  • 안전을 유지하면 점수는 두 스 니펫 의 바이트 수 입니다 .

  • 이것은로 되돌아 가서 일할 당신의 대답에 필요한 이상한 가장자리의 경우 공개주세요 귀하의 제출이 충분한 정보를 포함해야합니다 ... 전에 재현으로 공개 된 공개되고있다. 이것은 귀하의 답변이 안전 해지면 다음에서 편집하는 경우를 의미합니다 : 여기 내 답변입니다. 아, BTW 이것은 솔라리스에서 실행할 때만 작동합니다. 귀하의 답변이 유효하지 않으며 삭제되며 당첨 될 자격이없는 것으로 간주됩니다.

  • 두 번째 스 니펫은 합계를 출력 한 후 출력이 여전히 올바른 한 (예를 들어, STDERR로 출력하도록 선택한 후 많은 충돌 정보를 얻는 경우 유효하지 않음) 크래시가 허용됩니다.

  • 답변을 제출 한 후 코드를 편집 할 수 없습니다.

  • 암호화, 해시 함수, CSPRNG 등과 같은 암호화 기능에 의존해서는 안됩니다.

크랙되지 않은 제출물을 찾는 스 니펫 :


3
C와 같은 언어의 경우 어떻게해야합니까? 연결은 하나의 "메인 스 니펫"만 허용하며 모든 논리는 거기에 가야합니다. 예를 들어, int main(){ do_evil_stuff(); }사용자 코드를 어디로 가야합니까? 기능에서? 의 모든 진술 후에 main?
코너 오브라이언

1
두 번째 스 니펫을 첫 번째 스 니펫의 어느 곳에 나 배치 할 수 있습니까?
LegionMammal978

1
코딩에 대해서는 아무것도 모르지만이 도전은 놀랍습니다.
Pritt Balagopal

2
jimmy23013의 굉장한 발췌 문장 에서 편집했습니다 . 되돌릴 수는 있지만 어쨌든 제출물을 찾기 위해 직접 사용하고 있었고 다른 사람들에게 도움이 될 것이라고 생각했습니다.
Dom Hastings

2
@DomHastings 매우 도움이됩니다! 대단히 감사합니다 :)
DJMcMayhem

답변:


2

Gforth 0.7.3 (TIO) , 231 바이트 [SAFE]

이 코드는 쓸모없는 몇 가지 필요한 출력 방법과 함수 선언에 중요한 추가 사항을 재정의합니다. 행운을 빕니다!

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

입력은 함수 파라미터로 스택 상단에서 가져온 2 개의 부호있는 정수입니다. STDOUT으로 출력합니다.

따라서 완료된 손상을 수정하고 스택에서 상위 2 개의 값을 가져 와서 추가 출력없이 후행 공백없이 STDOUT에 정수 (float가 아닌)로 결과를 인쇄하는 함수를 정의해야합니다.

여기의 템플릿을 목표 기능의 이름은 경우 f.

해결책:

79 바이트

실제로 immediate의 재정의 끝 에서 키워드를 제거 ;했으므로 시작시 키워드 를 포함시켜야했습니다. 내가 정의한 함수는의 내부 정의와 대부분 동일 .하지만 끝에 공백을 인쇄하지 않으며 숫자를 부동 소수점 스택으로 앞뒤로 이동하여 추가를 먼저 수행합니다.

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

온라인으로 사용해보십시오


1
이것은 매우 좋은 답변입니다. 이 속도에서 유일하게 깨지지 않은 대답이 될 것 같습니다!
DJMcMayhem

:) 나는 두 가지 다른 장애물을 결합했다. 이 시점에서 점수를 높이기 위해 단 하나만 할 수 있었는지 궁금합니다. 그러나 둘 이상을 갖는 것이 아직 크랙되지 않은 이유 일 수 있습니다.
mbomb007

21

Haskell, Christian Sievers에 의해 금이

import Prelude(getLine,print)
a=a

stdin에서 두 개의 정수 (음수 포함)를 읽고 stdout에 쓰는 전체 프로그램.

방금 Prelude를 비활성화했기 때문에 거의 아무것도 범위 내에 있지 않으며 정의를 추가했습니다. 추가 가져 오기는 구문 상 유효하지 않습니다. 나는 당신을 준 getLine하고 print있지만.


원래 솔루션을 추가하도록 편집했습니다. Christian의 균열은 다르지만 동일한 기본 기능을 활용합니다 (직접 내장 된 것을 호출 할 수 없거나 관련된 유형의 이름을 지정할 수없는 경우에도 구문 설탕이있는 함수에 액세스하여 놀라운 계산을 수행 할 수 있습니다).

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))

어쨌든 슈퍼 골프는 아니지만 아마도 여기에 더 읽기 쉽습니다.

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

파이썬 2 , 금이 간

명명 된 함수로 추가 구현

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\

온라인으로 사용해보십시오!

이것은 무엇을 하는가?

조금 도와 줄 목적으로 이것이 무엇을하는지 설명하겠습니다. 이 코드는 소스 파일을 열고 나머지 코드가 다음 기준에 맞는지 확인합니다.

  • 문자열을 포함하지 않습니다 import
  • 캐릭터만으로 만들어집니다 &)(,.:[]a`cdfijmonrt~

두 기준 중 하나라도 실패하면 재귀 제한은 1작성한 코드 가 재귀 제한에 도달 한다는 의미 로 설정됩니다 .

여기에는 트릭이 없습니다.이 문자 만 사용하고 가져 오기를 사용하지 않는 솔루션을 작성했습니다.

시간을 절약하기 위해이 제한으로 할 수없는 유용한 것들에 대한 간단한 목록이 있습니다

  • + 잘,

  • eval/ exec그걸로 도망 치지 않을거야

  • 숫자, 생각보다 유용 할 수 있습니다

  • 문자열 리터럴

  • len

  • =, 할당 변수 없음

  • >, <, ==. . . 나는 당신을 비교없이 남겨두고

  • *, -, /, %, ^, |, >>, << 사용할 수있는 유일한 사업자가 ~&

  • __foo__, 멋진 이중 밑줄 방법은 허용되지 않습니다.


1
와우 이건 정말 악해 좋은!
HyperNeutrino

일을 시작하는 환상적인 답변 :)
DJMcMayhem

Hehe, 이것은 단지 채팅에서 한 번 언급하려고했던 멍청한 왕의 도전 에서 영감을 받았을 것입니다
Stephen

4
나는 이것이 유효한 균열 이라고 생각 합니다 : codegolf.stackexchange.com/a/133209/68942
HyperNeutrino

RE 첫 번째 스 니펫 : This code is not allowed to crash or exit.(토론하기 위해 채팅 참조)
Stephen

12

파이썬 2 , 금이 간

이것이이 답변의 네 번째 반복입니다. 마지막 응답은 재귀 깊이를 재설정하여 크랙되었습니다.

명명 된 함수로 추가 구현

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\

온라인으로 사용해보십시오!

이것은 무엇을 하는가?

조금 도와 줄 목적으로 이것이 무엇을하는지 설명하겠습니다. 이 코드는 소스 파일을 열고 나머지 코드가 문자로만 만들어 졌는지 확인합니다 &)(,.:[]a`cdfijmonrt~

실패하면 재귀 한계는 1작성한 코드 가 재귀 한계에 도달 한다는 의미 로 설정됩니다 .

또한 모든 모듈을 비활성화 했으므로 가져올 수 없습니다.

여기에는 트릭이 없습니다.이 문자 만 사용하고 가져 오기를 사용하지 않는 솔루션을 작성했습니다.

시간을 절약하기 위해이 제한으로 할 수없는 유용한 것들에 대한 간단한 목록이 있습니다

  • + 잘,

  • eval/ exec그걸로 도망 치지 않을거야

  • 숫자, 생각보다 유용 할 수 있습니다

  • 문자열 리터럴

  • len

  • =, 할당 변수 없음

  • >, <, ==. . . 나는 당신을 비교없이 남겨두고

  • *, -, /, %, ^, |, >>, << 사용할 수있는 유일한 사업자가 ~&

  • __foo__, 멋진 이중 밑줄 방법은 허용되지 않습니다.

내 솔루션

이제 xnor은 충분히 만족스러운 방식으로 해결책을 밝혔습니다.

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

놀랍게도 끔찍한 횡설수설 더미가 있습니다. 이 문제를 해결하기보다는 내가 어떻게 만드는 과정을 거칠 것입니다.

나는 꽤 표준적인 추가 알고리즘으로 시작

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

그럼 내가 표현하는 비트 트릭을 사용 ^하여 |, &, ~.

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

나는 또 다른 비트 트릭을 사용하여 |

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

이제 남은 것은, <<너무 어렵지 않아야합니까? 울퉁불퉁 한 주행 준비를하십시오. 비트 시프트를 대체하기 위해 문자열을 사용하여 이진 표현의 끝에 0을 추가했습니다.

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

이것은 몇 가지 문제가 있지만 기본 문제는 추가를 사용 하고 있으므로 대신 형식을 사용 하여이 문제를 해결 했습니다.

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

우리는 bin을 사용할 수 없으므로 문자열 형식을 사용하여 바이너리로 변환했습니다.

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

문자열 리터럴이 금지되어 있기 때문에 {0:b}0백 틱과 join함께 만든 부분으로 문자열 을 만들어야 합니다.

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

빈 문자열은 매우 쉽습니다. 그냥 할 수 있습니다

`r`[:0]

0은

`0`

그리고 {:}모두 사전에서 were습니다.

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

b우리의 문자 집합이 아니 얻을 꽤 어려운 것 같다, 그래서 우리가 어떻게이있는 개체를 얻을 해야하는 b그것의에를 repr? repr내장 함수를 사용하면 다음과 같은 것을 얻을 수 있습니다.

<built-in function name>

그리고 그것이 우리가 얻을 수있는 곳 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

이제 남은 것은 숫자이며, -1, 0, 1, 2 만 있으면됩니다.

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

2는 실제로 바이트보다 짧을 수 있습니다.

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

의견에 @Blender의 제안을 기반으로하지만 사실이 끝날 때까지 이것을 생각하지 않았습니다.

그래서 우리는이 숫자들을

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

그리고 그 균열입니다.


이 스 니펫은 자체적으로 오류가있는 것 같습니다.
ATaco

@ATaco 나는 이것이 채팅에서 논의되었다고 생각하고 이것이 괜찮다고 결정되었습니다.
밀 마법사

규칙은 명시 적으로 다르게 명시됩니다. "이 코드는 충돌하거나 종료 할 수 없습니다."
ATaco

@ATaco 여기 에 기회가 생겼을 때 업데이트하겠다는 메시지가 있습니다.
밀 마법사


10

C (gcc) 금이 갔다!

#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
}

온라인으로 사용해보십시오!

STDIN에서 입력하고 STDOUT으로 출력합니다.

오류없이 실행됩니다. 하 하하하 하악. 나는 TIO의 gcc에서만 테스트했습니다. 평소에, 당신은 코드를 작동시키기 위해이 스 니펫 다음에 코드를 추가해야합니다.

에 테스트했습니다 gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1). 모든 리눅스 시스템에서 작동합니다.

독창적 인 솔루션

#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 Ah yes
코너 오브라이언

2
플랫폼을 지정하십시오!
여호수아

@Joshua 몇 가지 정보를 추가했습니다
Conor O'Brien


글쎄, __asm__당신은 선택할 수있는 많은 기능을 가지고 있습니다 :) C와 C ++이 여기에 좋은 적이라고 생각하지 마십시오.
edmz

9

하스켈 , 벤에 의해 금이

main=main--

온라인으로 사용해보십시오! 이것은 stdin에서 두 숫자를 읽고 합계를 stdout으로 출력하는 전체 프로그램이어야합니다.

각각의 전체 프로그램은 main함수 를 실행하여 시작 되지만 여기서는 main자체 호출되어 무한 루프가 발생합니다. 설상가상으로, --회귀 호출 바로 뒤에서 회선 주석을 시작하여 회선 변경을 방지 main2한 다음 합산을 수행하도록 정의합니다.


의도 된 솔루션 :

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

온라인으로 사용해보십시오!

--연산자의 일부로 구문 분석 할 수 없으면 행 주석을 시작합니다 . (구문 강조 표시는이 사실을 알지 못하는 것 같습니다.) 첫 번째 인수와 일부 더미 두 번째 인수로 사용 --$되는 유효한 접두사 연산자입니다 . 그런 다음 두 인수를 모두 무시하고 대신 필요한 작업을 수행하도록 정의됩니다.main()



5
"main = ..."를 추가하면됩니다
michi7x7

Haskell의 게으른 평가 때문에 작동하는 Haskell 솔루션의 경우 +1
Jules

9

C (Linux의 GCC) (크랙)

어리석은 파일 읽기 샌드 박스 기술을 사용하는 대신 SECCOMP 화이트리스트를 사용하여 올바른 방법으로 작업합니다!

태스크 : STDIN의 입력 및 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!
}

온라인으로 사용해보십시오!

WTF는 이거 야!?

극복 할 수없는 과제를 돕기 위해이 코드의 기능을 설명하겠습니다.

__attribute__ ((constructor(0)))s기능이 먼저 실행 되도록합니다 . 이 함수는 STDIN, STDOUT 및 STDERR에 대해 열려있는 모든 파일 설명자를 닫습니다. 그런 다음 프로그램은 엄격한 SECCOMP 화이트리스트로 자체를 제한하여 시스템 호출을 다음으로 제한합니다.

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

따라서 새로운 파일을 열 수 없습니다 (또는 기본적으로 아무것도하지 마십시오). 그런 다음 main에 와서 sandbox함수에 멋지게 싸인 코드를 호출합니다 .

syscall(SYS_exit, EXIT_SUCCESS);기본 GCC에 의해 함께 종료됩니다 - 끝은 정상적으로 종료 프로그램을 확인하는 것입니다 exit_group(2)기는 seccomp 화이트리스트에 의해 허용되지 않는. 이 종료 함수는 코드가 실행 된 후에 호출 됩니다.

따라서 열린 파일 디스크립터가 없으며 새로운 것을 열 수 없습니다. 불가능 해? ;)



8

x86 16 비트 리얼 모드 어셈블리 ( 크랙 )

_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

당신이 트릭을 알고 있다면 쉽게.


1
어떻게 입력을 받고 있습니까? 스택 또는 레지스터? (또한 16 비트 어셈블리로 가정되지만 or [bp], 256유효하지 않은 경우 에는 유효하지 않습니다.or WORD PTR [bp], 256
Cody Grey

1
또한 사용 중인 프로세서를 지정해야합니다 . 많은 x86 버전과 클론이 있으며 정의되지 않은 지침이 많이 있습니다. 내가 "모호한 80186 복제"에 대한 코드를 작성하면 너무 일이 몇 인수 어쩌구 저쩌구했다 정의되지 않은 명령을 가지고 ... 우리는 또한 환경을해야 할 수도 있습니다. 예를 들어 16 비트 Windows는 다른 시스템이 그렇지 않을 수 있다는 SS == DS 보증을 제공했습니다.
오리온

1
당신은 지정해야 하는 당신이 실제로 경우 프로세서를 하는 하나 개의 특정 모델 (또는 특정 세대)에서 작동 약간의 트릭을 사용. 이 코드는 그렇지 않으므로 "x86-16"이면 충분합니다. 제 생각에는, 더 일반적 일수록 좋습니다. hlt명령어 (링 0) 의 존재 가 이것이 보호 모드가 아님을 강력하게 암시 하지만 실제 또는 보호 모드를 지정해야한다고 동의했습니다 .
코디 그레이

3
@Joshua 모든 플랫폼에서 작동하지 않으면 적어도 작동 할 플랫폼을 지정해야한다고 생각합니다. Your submission must contain enough information before being revealed to be reproducible after being revealed
Stephen

1
@StepHen : 언어를 깨뜨리는 솔루션은 x86-16 리얼 모드를 지정한 후 플랫폼에 구애받지 않지만 I / O는 플랫폼에 구애받지 않습니다. 그것을 발발 한 사람은 자신이 발발 한 OS를 지정할 수 있습니다. 나는 _main 레이블을 늦게 추가하여 누군가 이론적으로 libc와 연결하여 거의 불가지론적인 휴식을 취할 수 있도록했습니다.
여호수아

4

자바 스크립트, 금이

이 과제는 Grant Davis 's 를 기반으로하지만, 그가 염두에 둔 솔루션을 수정합니다 (iframe을 만들고 iframe을 사용합니다 window). 솔루션은 chrome의 자바 스크립트 콘솔에서 실행 about:blank page되며 두 가지를 가져 input()와서 함께 추가하고 console.log결과를 얻 습니다 . 다음에 코드를 넣으십시오.

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

먼저 클로버 promptconsole만들고 바로 가기를 설정합니다 d. 그런 다음 돌연변이 된 모든 대상을 제거하는 콜백으로 돌연변이 관찰자를 만듭니다. 우리는 돌연변이 관찰자가 문서를 관찰하고 통지 childList하고 subtree수정 하도록 설정했습니다 . 리터럴 대신에 true진실한 가치에 대한 바로 가기를 사용합니다 document( 사양 에서는 허용하지 않지만 크롬에서는 허용합니다).

이것을 게시 한 후 훨씬 더 우아한 클로버를 깨달았습니다. 내 의도 된 솔루션은 여전히 ​​작동하지만 게시 된 균열은 다음과 같지 않습니다.

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

사이트에 오신 것을 환영합니다! 해결책이 무엇인지
알고 싶습니다


4

Ilmari Karonen에 의해 금이 간 Perl 5

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

별도의 행에 입력이 수신 STDIN되고에 출력이 인쇄됩니다 STDOUT.

모든 코드는 __DATA__마커를 따릅니다. 이것은 코드가 파싱되고 사용할 수없는 문자가 제거된다는 점에서 @WheatWizard의 솔루션 과 유사한 방법을 사용합니다 .

버전 5.8, 5.10 및 5.16에서 테스트되었으며 명령 줄 플래그가 필요하지 않습니다.

온라인으로 사용해보십시오!


2
입 / 출력 방법 및 형식을 지정할 수 있습니까?
Ilmari Karonen

@IlmariKaronen 사과, STDIN별도의 줄과 문자가 STDOUT있습니다. 이것을 본체에 추가하겠습니다.
돔 헤이스팅스

금이 간 것 같아요.
Ilmari Karonen

4

zbw에 의해 깨지는 파이썬 3

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

모든 모듈이 삭제되었으므로 사용할 수있는 내장이 없으며 다른 것을 수행 할 수 없습니다. STDIN으로 출력, STDIN에서 입력. 이것은 이전 답변이 break 문을 추가하여 사소한 균열로 깨진 후이 답변의 두 번째 반복입니다.


나는 이것 이후에 작동하는 스 니펫을보고 정말로 궁금하다
NickA

글쎄, 당신은 7 일 또는 사소한 균열이 먼저 오는 중 하나를 기다려야합니다 ...
pppery


글쎄, 이와 같은 도전은
잘하기

4

APL (ngn-apl) , ngn에 의해 크랙 됨

내 동료 마샬 과 협력하여 만들었습니다 .

왼쪽 및 오른쪽 인수를 통해에 입력하십시오 +. 즉, 다음 줄 뒤에 코드를 삽입하여 마지막 줄을 읽고 STDOUT으로 ⎕←3+2출력 5하는 것이 목표입니다 .

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

온라인으로 사용해보십시오!

{}하나 또는 두 개의 인수를 사용하고 빈 숫자 목록을 반환하는 모든 유용한 함수를 설정하여 작동 합니다. 기능 만 구성하도록 설정 합니다.


갈라진 금

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

⍺⍵1/0 왼쪽 인수와 오른쪽 인수로 1을 복제하고 1

 정렬 할 지수를 구하십시오 (모든 요소가 0이기 때문에 0 1 2를 제공합니다 ... (a + b)

⌈/ 최대 값 (a + b)


ngn / apl에는 임의의 JavaScript를 실행하는 기능이 포함되어 있습니다. APL 대신 JavaScript를 비활성화하는 것과 관련하여 그러한 솔루션을 유효한 것으로 간주하지 않습니다. +순수한 APL 만 사용하고 더티 트릭을 사용하지 않고 재설정 할 수있는 올바른 방법이 있습니다.
Adám

3

파이썬 2 , 금이 간

이것은 내가 예상하지 못한 방법을 사용하여 @HyperNuetrino에 의해 한 번 깨지는 답변의 두 번째 반복입니다. 나는 이제 그것을 패치 했으므로 남아있는 유일한 솔루션은 내가 의도 한 제한을 준수해야합니다.

명명 된 함수로 추가 구현

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\

온라인으로 사용해보십시오!


가 있으면이 작업을 수행 할 수 있다고 생각하지만이 작업이 없으면 u멈췄습니다.
isaacg

@isaacg 호기심 때문에 무엇을 u하시겠습니까?
밀 마법사

.count. 원하는 출력만큼 ​​문자열을 얻을 수 있지만 길이를 취할 방법이 없습니다.
isaacg

__import__('sys').setrecursionlimit(100)... 그리고 실제로 패치 된 것은 없습니다. 그래도 강도의 스레드에 게시하고 싶지는 않지만 속임수처럼 느껴집니다. 온라인 사용해보기
Value Ink


3

자바 8, @ OlivierGrégoire에 의해 금이

여기 내 시도가 있습니다. 대부분의 아이디어는 출력에 사용할 수있는 모든 네임 스페이스를 오버로드하는 것입니다 (그리고 반영하기를 바랍니다). 출력은 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{}
}

블랙리스트는 일반적으로 화이트리스트보다 더 나쁜 접근 방식이므로 누군가 고려하지 않은 접근 방식을 생각해내는 것은 시간 문제 일 것입니다.


1
이것은 실행 가능한 클래스가 아닙니다.
Olivier Grégoire

1
@ OlivierGrégoire 죄송합니다. class String{}테스트를 마친 후에는 녹아웃 될지도 모릅니다 main(String[] ...). 이제 작동합니다
주님 Farquaad에게

1
그렇습니다, 감사합니다! :) 그것은 내가하려고하는 균열을 변경하지 않습니다 : p
Olivier Grégoire

1
깨진! 나는 이것을 정말로 즐겼습니다 :)
Olivier Grégoire

1
나는 이와 같은 것을보고 있었지만 (죄송하여 주석으로 코드를 포맷하는 것은 어렵습니다) 귀하의 솔루션이 훨씬 깨끗하다고 ​​생각합니다.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

Mayube에 의해 금이 간 cQuents

#|1,1:A

이것은 매우 쉬워야하지만 결코 알 수 없습니다.

"문제"는 C코드 가 없으면 오류가 발생한 것입니다.

Mayube의 솔루션 :

#|1,1:A+BC

시퀀스의 각 항목은 첫 번째 입력과 두 번째에 세 번째 입력 (일명 1)을 더한 값입니다.

내 솔루션 :

#1,1:A+B,C

시퀀스는 첫 번째 입력 + 두 번째 입력과 세 번째 입력 (1) 사이에서 순환합니다. 두 번째의 첫 번째 항목은 A+B입니다.

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

Mayube의 솔루션과 비슷합니다. 곱하기 대신 B*C더하기 C와 빼기 만하면 됩니다.

온라인으로 사용해보십시오!

설명

#|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

현재이 프로그램은 1사용자 입력이 없으므로 첫 번째 입력이 1기본 입력 ( #) 의 첫 번째 입력 이므로을 출력 합니다.


문서가 정말 어색하게 표현 된 것 같습니다. 제 인생의 말이 무엇을 의미하는지 알 수 없습니다.Default 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 그것은 이상하다, 나는 그것을 올바르게 말할 방법을 찾아야한다. 기본적으로 프로그램에 대한 입력 A,B,C,D,E은 코드의 변수 가 쿼리하는 가장 높은 입력과 같을 수 있습니다 . 예를 들어, D프로그램에 변수가 있는 경우 구문 분석기는 4 개의 입력이있을 것으로 예상하지만 E,이있는 경우 구문 분석기는 5 개의 입력이있을 것으로 예상합니다. 예상 금액보다 적을 수 없습니다. 그러나 항상 선택적인 마지막 입력이 있으며 n, 이는 다른 모드에서 다른 방식으로 사용됩니다.
Stephen

@Mayube 위에 게시 한 스 니펫에는가 포함되어 A있으므로 하나의 입력을 찾습니다. #기본 입력을 지정하는 두 가지가 있기 때문에 첫 번째 A값을 값으로 사용하고 두 번째 값을 로 사용합니다 n.
스티븐

따라서 2 개의 입력을 제공하고 추가 BC하면 A가 첫 번째 입력이되고 B가 두 번째가되고 C가 1이되고 n이 두 번째 1이됩니까?
Skidsdev

@Mayube 정확히, 내 엉터리 문서에 대해 죄송합니다. TMI : 시작이 #1,1(바 없음) 인 경우 A는 첫 번째 1, B는 두 번째 1, C는 첫 번째 입력, n은 두 번째 입력입니다. 또한 할 수 #1|1(A)가 제 1이고, B가 C 번째 입력되고, 첫 번째 입력이고, n은 상기 제 1 인,
스테판

3

Node.JS 버전 7.3.0 (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)})();

첫 번째 코드 뒤에 두 번째 코드 블록을 배치하십시오.

면책 조항 : 두 번째 코드 블록은 자체적으로 작동하지 않습니다 (첫 번째 코드 뒤에 배치하지 않고). 이것이 허용되지 않으면 두 번째 스 니펫을 수정할 수 있습니다.

이것은 전체 프로그램입니다. 출력은 process.stdout(STDOUT), 입력은 process.argv(명령 행 인수)

이것은 나의 첫번째 경찰과 강도이다, 희망이 좋은 도전이다 :)

온라인으로 사용해보십시오!


도전은 설명했다

n0에서 1e7까지 임의의 변수 를 생성합니다 . 올바른와 쓰기를 호출 할 경우 n, 세트하지만 아무것도 인쇄되지 않습니다 l당신은 아무것도를 인쇄 할 수 있습니다, 쓰기 기능을 "잠금 해제"0을. 문자열이 아닌 쓰기를 호출하려고하면 무한 루프로 보냅니다. n쓰기가 "잠금"상태 일 때 올바른 것 이외의 것을 사용하여 쓰기를 시도 하면 추측을 방지하기 위해 무한 루프로 보냅니다.

의도 된 솔루션

s로 시작하는 Symbol 만 사용하여 문자열을 확인하는 것처럼 보이는 유형을지나갑니다. 문자열 "f"를 Symbol에 추가 할 수 없으므로 평가 호출로 인해 함수에서 오류가 발생합니다. 오류를 포착하고 정규식을 사용 n하여 함수 이름에있는 스택 추적에서 복구 합니다. 그런 다음 n아무것도 인쇄하지 않는 쓰기 를 시도 하지만 "lock"변수 l를 0으로 설정하여 쓰기 기능을 "잠금 해제"합니다. 쓰기 기능이 잠금 해제되었으므로 합계를 인쇄합니다.

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


그것은 천재입니다. 나는 원래 올바른 길을 가고있었습니다! 두뇌 훈련에 감사드립니다!
Dom Hastings

3

RProgN2 , 에 의해 아놀드 파머

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

모든 수학 연산자를 복원 할 방법없이 덮어 씁니다. 특히 스택의 상위 2 개 항목을 제거하는 기능으로 대체합니다.

온라인으로 사용해보십시오!

독창적 인 솔루션

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

온라인으로 사용해보십시오!


나는 당신의 문서를 검토 하고 있는데 그 ²상징이 무엇인지 찾을 수없는 것 같습니다 . 깨달을 까?
Arnold Palmer

이 문서는 RProgN2와 매우 관련이 없으며이 경우이 기호는 다음 두 가지 개념 [[을 취하여 @ArnoldPalmer
ATaco


Dang, 훨씬 낫다. 나는 스택 연산자에 대해 몰랐다. 또한 «»전역 변수를 엉망으로 만드는 것과는 달리 로컬 변수를 작성하면 매우 유용합니다.
Arnold Palmer

3

하스켈 161 144 바이트, 으로 BlackCap

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

STDIN에 입력하고 STDERR에 출력합니다. 프로그램 끝에 추가하십시오.

편집 : 추가 GHC 인수없이 보통으로 컴파일되도록 의도되었습니다 ghc --make prog.hs.

바이트 수를 낮추기 위해 다시 편집했습니다.

즐기세요!


메인 함수가 호출되지 않기 때문에 이것을 할 수 없습니까? main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
BlackCap

GHC는 플래그가 제공 되지 않을 때 main함수가 모듈에 Main있을 것으로 예상하기 때문에 @BlackCap No. -main-is
zbw

이것은 작동하지 않지만 어쨌든 아이디어를 공유하고 싶습니다
BlackCap

나는 그것을 금이 부를 것이다. 여기 에 의도 한 해결책이 있습니다. 랩퍼 가 입력을 컴파일러로 보내지 않기 때문에 TIO에서는 작동 하지 않습니다.
zbw

솔루션을 게시하면 금이 간 것으로 표시됩니다.
zbw

3

마스카 르포 네 , 일 마리 카로 넨

[ 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<^$

입력은 i증분과 z0을 사용하여 stdio의 교회 숫자입니다 . 예를 들어 2 + 3은 다음과 같습니다.

iiziiiz

후행 줄 바꿈으로

출력은 stdio에서와 같은 형식으로 stdout에서 숫자 여야합니다. 예를 들어, 답변이 5 인 경우 다음을 출력해야합니다.

iiiiiz

(마스 카르 폰에는 숫자 개념이 없음)


의도 된 솔루션 :

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

@IlmariKaronen이 그의 균열에서 언급했듯이 Mascarpone의 문자열 리터럴은 실제로 일련의 문자를 밀기위한 구문 설탕입니다.

나는 고의적으로 [this]$끈을 밀고 나서 바로 터지는 것처럼 보이게하는 의견을 썼습니다 . 순진한 크래커가 [:,>!]/*문자열을 밀고 통역사와 바꾸고 해석하는 것과 같은 것을 시도했을 수 있습니다 .

또한 스택에 남은 인터프리터를와 같이 척 $하지만 $이미 NOP로 재정의되었습니다. 이 인터프리터는 스택에 남겨두고 전체 프로그램을 통해 휴대해야합니다. 모든 문자열의 각 문자를 통과합니다.


깨진. 그리고 저는이 도전 이전에 마스카 르포 네에 대해 들어 본 적이 없습니다.
Ilmari Karonen

@IlmariKaronen 새로운 좋아하는 언어는? 잘 했어!
BlackCap

2

C의 # (.NET 코어) 으로 Ilmari 카로 넨

또한 에 의해 여호수아 .

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

stdin에서 두 값을 읽고 stdout에 결과를 씁니다. Windows에서 Framework 버전 3, 4.6 및 TIO 에서 테스트되었습니다 .

내가 의도 한 전체 프로그램은 다음과 같습니다.

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 });
        }
    }
}

온라인으로 사용해보십시오!



codegolf.stackexchange.com/a/133412/14306 이것이 의도 한 해결책이 아니라고 가정합니다.
여호수아

@ 일 마리카로 넨 : +1. 이것이 의도 된 해결책이었습니다.
raznagul

@Joshua : 내가 의도했던 것과 다른 해결책을 찾은 +1.
raznagul

2

골프 스크립트 , 데니스에 의해 금이

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

온라인으로 사용해보십시오!

이것은 이다 결국, 도전, 왜 GolfScript을 시도하지?

유효한 솔루션은 스택에서 두 정수를 읽고 함께 더한 결과를 스택에 반환하는 스 니펫이어야합니다. 어쨌든 위의 코드가 거의 모든 내장 GolfScript 연산자 를 재정의 한 후에도 아무것도하지 않도록 여전히 작동해야합니다 . 적어도 나는 ;그대로 두었 으므로 여전히 스택에서 값을 팝 할 수 있습니다. ;-) 코드는 TIO에서 구현 된 것처럼 표준 GolfScript 인터프리터에서 작동해야합니다 (위 링크 참조).


내 자신 과 마찬가지로 Dennis의 솔루션 은 거의 사용하지 않는 GolfScript의 기능 을 사용 하여 큰 따옴표로 묶은 문자열로 보간 된 Ruby 코드를 허용합니다. 이 기능을 사용하여 기본 제공 +연산자 와 똑같이 작동하는 새 추가 연산자를 정의한 다음 호출합니다.

(GolfScript의 Ruby 보간 기능이 거의 사용되지 않는 한 가지 이유는, 구문 분석 중에 보간 된 Ruby 코드가 실행 되고 그 결과가 GolfScript 인터프리터에 의해 캐시되기 때문입니다. 따라서 보간 된 Ruby 코드가있는 문자열이있는 경우 루프에서 코드는 실제 프로그램이 시작되기 전에 한 번만 실행 된 다음 루프가 반복 될 때마다 항상 동일한 값을 반환합니다. 문자열 eval사용하여 구문 분석을 지연시킬 수는 있지만 이미 어색한 구문을 만들 수 있습니다. 추악하고 장황하며 어쨌든이 도전에 대해서는 eval 연산자 ~도 비활성화했지만 새로운 내장 GolfScript 연산자정의하는 것으로 나타났습니다 이 기능이 실제로 아주 훌륭하고 깔끔하게 작동하는 것 중 하나입니다.)



깨진. 마침내 내가 뭘 잘못하고 있는지 알아 냈습니다.
Dennis

@ 데니스 : 네, 이번에는 못 박았습니다. FWIW, 내 의도 된 솔루션"#{var'_','gpush a+b'.cc2}";_몇 바이트 더 짧아지는 것을 제외하고는 정확하게 작동합니다.
Ilmari Karonen

2

Dom Hastings에 의해 금이 간 Node.js v8.2.0

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) )
                 );
}

logic기능 을 구현해야 합니다. 입력은 (stdin에서) 제공된 인수이며, 출력은 함수가 반환하는 모든 것입니다 (stdout으로 인쇄 됨).


내 코드 교회는 입력에서 숫자를 인코딩 합니다. 나머지 코드는 당신을 위협하기 위해 있습니다.
엉망 함수는 포인트 프리 표기법 ( a . b == dot (a) (b)) 을 구현하기 위해 약간의 속임수를 사용합니다 . id .. 함수에
전달하기 전에 숫자에 적용된 변환 logicx+1and이며 y-1, 최대 0이되므로 모호함에 추가하는 또 다른 NOP입니다.

의도 된 해결책은 다음과 같습니다.

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


@DomHastings 의도 된 해결책은 아니지만, 프로그램이 예외없이 중단되고 출력에 추가 문자를 인쇄하지 않는 한
가능할 수 있습니다.

방금 대안을 게시했습니다! (그 답변의 역사에서 내 이전 솔루션을 볼 수 있습니다!)
Dom Hastings

오 와우, 나는 길을 떠났어 퍼즐 주셔서 감사합니다!
Dom Hastings

2

7 알리 , ppperry에 의해 금이

For reading a command: rule fails.

[Your code here.]

입력은 플레이어가 대화 형 명령으로 입력해야합니다 (예 : add 17 to 25또는) sum 17 25. 두 개의 숫자가 포함되어 있으면 입력해야하는 정확한 명령 형식을 자유롭게 선택할 수 있습니다. 42명령 에 따라 숫자의 합계 (예 :)를 인쇄해야합니다.

당면한 과제는 전체 "명령 읽기" 활동이 no-op으로 대체되는 것입니다. 이 문제를 해결하는 방법은 여러 가지가 있지만 적어도 언어에 익숙해야합니다. 내가 생각한 것은 예상치 못한 경우 실제로 매우 간단합니다.

Ubuntu Linux 의 그놈 정보 7 IDE 버전 6L38 에서 솔루션을 테스트했습니다 . 의도 된 솔루션은 Glulx 및 Z 머신 백엔드 모두에서 작동하며 다른 최신 버전의 Inform 7에서도 작동합니다. (적절한 해결 방법없이) 위의 코드는 인터프리터가 명령을 읽으려고 할 때 바쁘게 루프하게합니다. Z-machine 인터프리터는 이런 일이 발생하면 완전히 응답하지 않는 것처럼 보이며 IDE 내에서 멈출 수 없으므로 테스트에 Glulx를 사용하는 것이 좋습니다.


금이 간 , 당신이 궁금해하는 경우에, 나는이 도전 전에 정보를 들어 본 적이 없다
pppery

2

CPython 3 (다시), Sisyphus에 의해 금이 간

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

C로 구현되지 않는 한 원하는 모든 작업을 수행 할 수 있습니다. 이는 아니요 print, 아니요를 의미합니다. input모든 항목이 _(1)줄 을 치고 종료됩니다. 두 개의 개별 라인에 숫자가있는 STDIN에서 입력하여 STDOUT으로 출력 나는 이것이 얼마나 오래 지속 될지 궁금합니다 ...이 비활성화 트릭을 생각해 낸 후 두 번째 작업 스 니펫을 찾기 위해 꽤 오래 걸렸습니다. sys.setprofile의 일부 대체 구현을 기반으로 크랙되지 않도록 Cpython을 명시 적으로 지정합니다.


깨진. 이것이 작동 하는지 거의 알지 못합니다 .
Sisyphus

내가 지금 물어볼 수있을 것 같아 : 왜 functools?
Dennis

@Dennis sispyphus가 의도 한 해결책이 아니라 허점을 발견했기 때문에
pppery

@Sisyphus 당신의 균열은 파이썬에서 버그
pppery

2

자바 8 ( 크랙 )

두 번째 시도. 이번에는 2 분의 테스트에 투자했습니다.

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) {

    }

}

대부분의 것들을 다룹 니다.


1
적절한 수입품이 담긴 수업에 동봉 해 주시겠습니까? 이 작은 변화가 입장을하거나 깨뜨릴 수있는 것은 일종의 도전입니다. 나는 이것에 대한 여러 가지 해결책을 가지고 있지만 단순히 이것을 클래스 / 인터페이스에 묶으면 크게 줄어 듭니다. 또한 모든 행을 제거하는 형식은 있지만 독자에게는 선이 좋을 것입니다.
Olivier Grégoire

이, 금이 대답은 정확하게 코드를 사용하여. 잊어 버린 것 같아서 +1입니다. 죄송합니다.
Olivier Grégoire

#setAccessible (false) 호출은 아무 작업도 수행하지 않습니다.
Nevay

1

파이썬 2 금이

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

온라인으로 사용해보십시오!

나는이 답변이 저조한 답변이며 하한 답변으로 의도된다고 말함으로써 이것을 서두로 설명 할 것이다.


위저즈하이퍼 뉴트리노의 답변 에서 영감을 얻었습니다 .

스 니펫은 소스 파일을 읽고 마지막 공백으로 구분 된 코드 청크가로 sha256되지 않으면 계속하지 않습니다 e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843.

편집 : 이 의견 에 대한 답변으로 약간 수정되었습니다 . 핵심 문제는 변경되지 않으며 모든 균열 시도는 무효화되지 않습니다.


1
첫번째 발췌문을 다시 시작하십시오 :This code is not allowed to crash or exit.
Stephen

종료되어 첫 번째 스 니펫에 허용되지 않으므로 유효하지 않습니다.
DJMcMayhem


1

자바 (8) 에 의해 금이 @ OlivierGrégoire

나는 그것을 가능한 한 열심히 만들려고 노력했다! :) 그리고 지금까지 다른 Java 답변과 달리이 전체 스 니펫 뒤에 배치하여 도전의 정확한 규칙을 따라야합니다 (그래서 코드를 public static void main(String[] args)메소드 에 넣지 마십시오. 전체 수업 후. :) 행운을 빌어 요!

제한 사항을 보여주기 위해 의견을 추가했습니다.
( 이 게시물에서 영감을 얻었습니다.이 게시물은 대답에 사용할 수있는 것과 동일한 접근 방식으로 덜 제한적이고 만족 스럽습니다. )

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:

여기에서 시도하십시오. (TIO 대신 ideone.com은 작동하지 않는 것 같습니다. 테스트는 Eclipse IDE에서 수행되었지만 ideone.com을 사용하면 의도 한 솔루션이 작동합니다)



1

젤리 : 크래킹

이것은 Wheat Wizard의 멋진 Python 답변과 비교할 때 미친 듯이 쉽지만 여기에 있습니다 .P

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

첫 번째 스 니펫을 포함하여 해결 방법 솔루션의 sha256 hexdigest는 cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a입니다.

노트

문자열을 제외하고 코드에 줄 바꿈이 없을 수 있습니다. 그렇지 않으면이 코드가 실행되지 않아이 문제의 목적을 무효화합니다.

DJMcMayhem에 의해 금이

공평하게 말하면, 이것은 줄 바꿈을 사용하므로 줄 바꿈을 사용하지 않는 솔루션을보고 싶습니다.

Jonathan Allan의 솔루션

이것은 개행을 사용하지 않으므로 깨졌습니다. :피

내 해결책은 이것입니다 :

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

첫 번째 코드 조각은 단일 문자 원자 만 삭제하므로 Python eval은 여전히 ​​작동합니다.)))


두 번째 스 니펫은 항상 첫 번째 스 니펫 끝에 추가됩니다.
Stephen

@StepHen 그냥 : P를 지정하지만 메모를 추가하는 것을 잊었습니다. 정말 중요합니다.
HyperNeutrino

3
나는 당신이 그런 강도를 제한 할 수 있다고 생각하지 않습니다. 줄 바꿈으로 크랙 할 수 있다면 유효한 균열입니다. 어쨌든 줄 바꾸기가 추가되거나 첫 번째 줄이 강제로 실행되는 것을 막을 수 있습니까?
DJMcMayhem


1
나는 당신이 의도 한 균열을 좋아합니다. 매우 교활한.
Dennis

1

자바 스크립트, 깨짐

입력 : prompt()두 번

산출: console.log()

내 솔루션이 jsfiddle에서 작동하지 않습니다. Google 크롬의 JS 콘솔이있는 about : blank 페이지에서 작동합니다.

prompt=console=0

내 해결책 :

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

설명:

프롬프트와 콘솔을 0으로 설정하여 제거했습니다.

내 솔루션에서 샌드 박스를 만드는 iframe과 프롬프트 및 콘솔이 올바르게 작동하는 새 창의 창을 만듭니다.



@CRDrost 사양에 우선 순위 테스트가 있다고 생각하지 않으며 두 가지 스 니펫을 모두 표시하지 않습니다.
Stephen

미안, 네 말이 맞아, 내가 잘못 읽었 어
CR Drost

1

자바, 금이

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

이것은 깨지기 매우 쉬웠 어야합니다 .

의도 된 솔루션

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();}
  }
}

온라인으로 사용해보십시오



나는 완전히 잊어 버렸다 java.io.. 그러나 당신은 어쨌든 의도 된 해결책을 얻었습니다 ..
Roman Gräf

여기에 아무런 문제가 없습니다. 나는 실제로 두 번째 스 니펫을 작성하여 편집하는 것을 잊었습니다. TIO 에 따르면 첫 스 니펫은 아무런 경고없이 컴파일됩니다.
Roman Gräf

@ OlivierGrégoire 완료. 나는 IDE가 이것에 대해 나에게 소리를 질 것이라고 생각하지만 적어도 컴파일러는 그것을 받아 들인다 ...
Roman Gräf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.