あなたの言語を*ほとんど*使用不可にします!(警官のスレッド)


61

このコメントに触発された...

投稿する前にこの課題の仕様を固めるのを手伝ってくれたユーザー、Step HenWheat-WizardDennisに感謝します!

これは警官のスレッドです。強盗のスレッドについては、こちらをご覧ください


ではこの課題は、あなたの言語は、もはやプログラミング言語であることの私達の基準を満たすようにそれを行うものではありませんいくつかのコードを実行する使命を帯びています。その挑戦では、それは言語がもはやできないようにすることを意味します...

  • 数値の入出力を行う

  • 2つの数字を一緒に追加します

  • 特定の数が素数かどうかをテストします。

これは課題であり、2つの異なる目的を持つ2つの異なる課題があります。警官は言語をほとんど使用できないようにするコードを記述しようとし、強盗は警官を許可する隠れた回避策を見つけようとします言語を回復します。

警官として、次の2つのコードスニペットを記述する必要があります。

  1. たとえば、入力/出力および数値演算を行うための組み込み関数を削除することにより、言語をほとんど使用できなくするもの。削除する機能が多いほど、優れています。このコードは、クラッシュまたは終了することはできません。このスニペットの最後にコードを追加することが可能であるべきであり、そのコードは評価されます。そして...

  2. ... 2つの非負の整数を入力として受け取り、それらを加算して合計を出力するコードスニペット。このスニペットは、最初のスニペットを実行した後でも正しく機能する必要があります。2つのスニペットを組み合わせる場合、2つの数字を追加する完全なプログラムを形成するか、2つの数字を追加する関数を定義する必要があります。理想的には、このスニペットは非常に不明瞭な動作に依存し、見つけにくいようにする必要があります。

入出力の標準的な方法を選択できます。ただし、使用している形式(入力および出力)を正確に明らかにする必要があります。強盗は、あなたと同じ形式を使用しない限り、答えを解読できません。

これらのスニペットを両方とも作成した後、2番目のスニペットを公開せずに、最初の1つを回答として投稿する必要があります。回答には、次の情報がすべて含まれている必要があります。

  • 最初のスニペット(明らかではない第二)。

  • 言語(マイナーバージョンを含む、ほとんどの提出物はおそらく奇妙なエッジケースに依存するため)

  • 関数か完全なプログラムかを含むIO形式。強盗、クラックを有効にするために同じ形式を使用する必要があります。

  • 答えが機能するために必要な奇妙なケース。たとえば、Linuxのみ実行される、インターネット接続が必要です。明らかに、これは少し主観的ですが、警官にひび割れを防ぐ極端なケースがあり、安全になってからこれを明らかにする場合、私はこの貧弱なスポーツマンシップを考慮します。潜在的な強盗には、解答を解読するに解答するために必要なすべての情報が必要です。

答えが安全になるまで、バイトカウントを明らかにする必要はありません。

以下に例を示します。最初のスニペットでは、次のPython 3プログラムを送信できます。

Python 3

print=None

STDINから入力を受け取り、STDOUTに出力します

次に、2番目のスニペットとして、次のように記述できます。

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

これは、入力として2つの数値を受け取り、2つのスニペットを結合した場合でも合計を出力するため、有効です。たとえば、

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つの数字を一緒に追加します)。これは、最初に意図したものと同じスニペットである必要はありませ。強盗があなたの答えをクラックした場合、彼らはあなたの答えにコメントを残します、そしてあなたはそれがクラックされたことを示すためにそれを編集する必要があります。投稿にクラックがある場合は、回答を編集して、最初に意図したソリューション(スニペット2)を表示する必要があります。これはルールそのものではなく、ゲームを楽しくするための友好的な提案です。あなたがする必要はありません。

回答が1週間ひび割れていない場合は、2番目のスニペットで編集して、回答が安全であることを示すことができます。週が過ぎた後に編集しない場合、他のユーザーはあなたが行うまでそれをクラックすることができます。2番目のスニペットを公開しない場合、回答のポイントを請求したり、安全に呼び出したりすることはできません。

警官のスレッドの勝者は、両方のスニペットを含む最短の安全な回答であり、バイト単位でカウントされ、この回答十分な時間が経過した後に受け入れられます。回答が安全になるまで、バイトカウントはスコアとは無関係であるため、回答が安全になるまで、バイトカウントを明らかにする必要ありませ。十分な時間が経過し、解答がクラックされていない場合、勝者は最長時間クラックされていない回答になります。

楽しんで!

ルールの説明

  • 最初のスニペットは、入力なしで正しく実行する必要があります。それはあなたが好きなものを出力するかもしれません、そしてこの出力は無視されます-スニペットが終わった後、2番目のスニペットは正しく動作します。

  • 回答を有効にするには、2番目のスニペットを実際に実行する必要があります。これは次のような答えを意味します

    import sys
    sys.exit()
    

    言語を壊さないので無効です。単純に終了します。同様に、2番目のスニペットは実行されないため、無限ループに入ることは無効です。

  • 安全になった後、スコアは両方のスニペットのバイト数になります

  • これは、に戻ってあなたの答えが機能するために必要な任意の奇妙なエッジケースを明らかにしてくださいあなたの提出が十分な情報を含んでいなければなりません... 前に再現性があることが明らかにされた後に明らかにされています。これは、あなたの答えが安全になり、次にあなたが編集した場合:これが私の答えです。ああ、ところで、これはSolarisで実行した場合にのみ機能します。冗談です!あなたの答えは無効であり、削除され、勝利の資格があるとはみなされません。

  • 2番目のスニペットは、合計を出力した後にクラッシュすることができます-出力がまだ正しい限り(たとえば、STDERRに出力することを選択してから、クラッシュ情報の束を取得する場合、これは無効です)。

  • 回答を送信した後、コードを編集することはできません。

  • 暗号化、ハッシュ関数、CSPRNGなどの暗号化関数に依存することはできません。

クラックされていない提出物を見つけるためのスニペット:


3
Cのような言語では何をすべきですか?連結では、1つの「メインスニペット」のみが許可され、すべてのロジックはそこに行かなければなりません。例えば、int main(){ do_evil_stuff(); }ユーザーのコードはどこに行けばいいですか?関数で?main?のすべてのステートメントの後
コナーオブライエン

1
2番目のスニペットを最初のスニペットのどこにでも配置できますか?
LegionMammal978

1
コーディングについては何も知りませんが、この課題は驚くほどに見えます。
Pritt Balagopal

2
jimmy23013のすばらしいスニペットで編集しました。気軽に元に戻せますが、とにかく自分でそれを使って投稿を見つけ、他の人に役立つかもしれないと考えました。
ドムヘイスティングス

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に出力する関数を定義する必要があります。

目標関数の名前がの場合のテンプレートを次に示しますf

解決:

79バイトの再定義の最後から

実際にimmediateキーワードを削除した;ので、答えを最初に含める必要がありました。私が定義した関数は、の内部定義とほぼ同等ですが.、最後にスペースを出力せず、最初に数値を浮動小数点スタックに移動してから戻すことによって追加が実行されます。

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

オンラインで試す


1
これはとてもいい答えです。このレートでは、それが唯一のクラックされていない答えになる可能性があります!
DJMcMayhem

:)いくつかの異なる障害物を組み合わせました。この時点で、スコアを改善するためにたった1つしかできなかったのではないかと思っています。しかし、複数あることが、まだクラックされていない理由である可能性があります。
mbomb007

21

ハスケル、クリスチャン・シーヴァーズにクラック

import Prelude(getLine,print)
a=a

完全なプログラム。stdinから2つの整数(負の整数を含む)を読み取り、stdoutに書き込みます。

Preludeを無効にしたので、ほとんど何もスコープに含まれていません。その後、定義を追加しました。それ以上のインポートは構文的に無効です。私はあなたを与えたgetLineprintいえ。


元のソリューションを追加するために編集されました。クリスチャンのクラックは異なっていましたが、同じ基本機能を利用します(組み込みの何かを直接呼び出すことも、関連する型に名前を付けることさえできない場合でも、構文糖を持つ関数にアクセスすることで驚くほどの量の計算を行うことができます)。

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

Python 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
うわー、これは非常に悪いことです。いいね!
ハイパーニュートリノ

物事をキックオフするための素晴らしい答え:)
DJMcMayhem

ふふ、これは私が一度チャットで特定しようとしたあの愚かなキングオブザヒルの挑戦に触発されたのかもしれません
スティーブン

4
私が考えるこれが有効な亀裂である:codegolf.stackexchange.com/a/133209/68942
HyperNeutrino

RE最初のスニペット:(This code is not allowed to crash or exit.それに関する議論についてはチャットを参照)
スティーブン

12

Python 2、ひび割れ

これは、この回答の4回目の反復です。最後の回答のそれぞれは、再帰の深さをリセットすることで解読されました。

名前付き関数として追加を実装します

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

さて、残っているのは、<<ハードでありすぎないはずですよね?でこぼこの乗り心地の準備をしてください。ビットシフトを置き換えるために、文字列を使用してバイナリ表現の末尾にゼロを追加しました

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`

そしてそれら{:}はすべて辞書から取得されました。

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は実際には1バイト短くなる可能性があります

```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)。どのLinuxシステムでも動作するはずです。

元のソリューション

#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ああはい
コナーオブライエン

2
プラットフォームを指定してください!
ジョシュア

@ジョシュアいくつかの情報を追加しました
コナー・オブライエン


さて、__asm__あなたはそこから選択する多くの関数を持っています:) CとC ++はここでは良い敵だとは思わないでください。
edmz

9

ハスケルベンによってクラック

main=main--

オンラインでお試しください! これは、stdinから2つの数値を読み取り、合計をstdoutに出力する完全なプログラムでなければなりません。

各プログラムは、main関数を実行することで開始されますが、ここでmainはそれ自体を呼び出して無限ループを引き起こします。さらに悪いことには--、再帰呼び出しのすぐ後ろから行コメントを開始して、たとえばmain2、呼び出しを変更して合計を行うことを定義しないようにします。


意図したソリューション:

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

オンラインでお試しください!

--演算子の一部としても解析できない限り、行コメントを開始します。(構文の強調表示は、この事実を認識していないよう--$です。)main最初の引数といくつかのダミーの2番目の引数として受け取る有効な中置演算子です()。次に、両方の引数を無視し、代わりに必要なタスクを実行するように定義されます。


2

5
「where main = ...」を追加できます
-michi7x7

Haskellの遅延評価のためにのみ機能するHaskellソリューションの+1。
ジュール

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

オンラインでお試しください!

これはいったい何なのですか!?

乗り越えられないタスクを支援するために、このコードの機能を説明します。

__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?)
コーディグレー

1
また、使用しているプロセッサを指定する必要があります。多くのx86バージョンとクローンがあり、未定義の命令がたくさんあります。「あいまいな80186クローン」のコードを書いたとき、たまたまいくつかの引数と何とか何とかをとる未定義の命令があった場合...環境も必要になるかもしれません。たとえば、16ビットWindowsでは、SS == DSにより、他のシステムでは保証されないことが保証されています。
オリオン

1
あなただけ指定する必要がどのあなたが実際にあればプロセッサされている唯一の特定のモデル(または1つの特定の世代)で動作し、いくつかのトリックを使用して。このコードはそうではないので、「x86-16」で十分だと思います。私の意見では、一般的であるほど良いと思います。hlt命令(リング0)の存在は、これが保護モードではないことを強く示唆していますが、実モードまたは保護モードを指定することに同意しました。
コーディグレー

3
@Joshuaがすべてのプラットフォームで動作しない場合、少なくとも動作するプラットフォームを指定する必要があると思います。Your submission must contain enough information before being revealed to be reproducible after being revealed
スティーブン

1
@StepHen:言語を解くための解決策は、x86-16リアルモードを指定するとプラットフォームに依存しないことですが、I / Oはプラットフォームに依存しません。それを破った人は、彼が勃発したOSを指定するかもしれません。_mainラベルを後から追加したので、誰かが理論的にはlibcにリンクすることでほぼ不可知論的な中断をすることができます。
ジョシュア

4

Javascript、クラック

この課題は、Grant Davisに基づいていますが、彼が念頭に置いていたソリューション(iframeを作成し、iframeを使用window)を修正します。ソリューションはchromeのJavaScriptコンソールで実行され、about:blank page2を取り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})

まず、clobberを実行promptconsole、ショートカットを設定しdます。次に、変異したすべてのターゲットを削除するコールバックを使用して、変異オブザーバーを作成します。その突然変異オブザーバーを設定してドキュメントを観察し、通知childListsubtree修正を行います。リテラルの代わりtrueに、真理値へのショートカットを使用しますdocument仕様ではこれを許可していませんが、クロムでは許可しています)。

これを投稿した後、私ははるかにエレガントなクラッバーを実現しました。私の意図した解決策はまだ機能しますが、投稿されたクラックは機能しません:

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

サイトへようこそ!私はソリューションがどうなるか見てみたいです:)
DJMcMayhem


4

Perl 5、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__

入力はの個別の行で受信されSTDIN、出力はに出力されSTDOUTます。

すべてのコードは__DATA__マーカーの後に配置されます。これは、@ WheatWizardのソリューションと同様の方法を使用しており、コードが解析され、使用できない文字が削除されます。

これはバージョン5.8、5.10、および5.16でテストされており、コマンドラインフラグは不要です。

オンラインでお試しください!


2
入出力方法と形式を指定してください。
イルマリカロネン

@IlmariKaronen謝罪、STDIN別の行とに文字が含まれていますSTDOUT。これを本体に追加します。
ドムヘイスティングス


4

Python 3、zbwによりクラック

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

すべてのモジュールが削除されました。つまり、使用可能なビルトインがなく、他に多くのことができません。STDOUTへの出力、STDINからの入力。これは、breakステートメントを追加することにより、前の回答が些細な亀裂によって破壊された後の、この回答の2回目の反復です。


この後に機能するスニペットを見るのは本当に興味があります
-NickA

さて、あなたは...七日またはいずれか早い方の非自明な亀裂、用を待たなければならない
pppery


まあ、まあ、これらのような課題はうまくやることが非常に難しいです
-pppery

4

APL(ngn-apl)ngnによりクラック

同僚のマーシャルと協力して作った。

の左右の引数を介して入力し+ます。つまり、次の後にコードを挿入して、最後の行を読み取り⎕←3+25STDOUTに出力することが目標です。

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

オンラインでお試しください!

{}1つまたは2つの引数を取り、空の数値リストを返すすべての便利な関数を設定することにより機能します。また、関数を構成するだけに設定します。


クラック

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

⍺⍵1/0 0を左引数と右引数で複製し、1

 それをソートするインデックスを取得します(すべての要素がゼロであるため、0 1 2…(a + b)

⌈/ 最大値(a + b)


ngn / aplには、任意のJavaScriptを実行する機能が含まれています。そのようなソリューションは、APLではなくJavaScriptを無効にすることになるため、私はそのようなソリューションが有効だとは考えません。+純粋なAPLのみを使用し、ダーティトリックを使用せずにリセットする有効な(あいまいな)方法が実際にあります。
アダム

3

Python 2、ひび割れ

これは、私が予期していなかった方法を使用して@HyperNuetrinoによって一度クラックされた回答の2回目の反復です。これでパッチを適用したので、残された唯一の解決策が、意図した制限に従う必要があることを願っています。

名前付き関数として追加を実装します

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

Java 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
これは実行可能なクラスではありません...
OlivierGrégoire17年

1
@OlivierGrégoire申し訳ありませんが、class String{}テスト後にノックアウトすることに気付かずに追加しましたmain(String[] ...)。今すぐ動作するはずです
ファークァードLord 17

1
うん、それでいい、ありがとう!P::)それは私も、やることを約よ亀裂は変更されません
オリヴィエ・グレゴワール

1
割れた!これは本当に楽しかったです:)
オリビエグレゴワール

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();
主Farquaad

3

cQuents、Mayube によりクラック

#|1,1:A

これはかなり簡単なはずですが、あなたは決して知りません。

「問題」はC、コードがなければエラーが発生することでした。

Mayubeのソリューション:

#|1,1:A+BC

シーケンスの各項目は、最初の入力に3回目の2回目(別名1)を加えたものです。

私のソリューション:

#1,1:A+B,C

シーケンスは、最初の入力と2番目の入力、および3番目の入力(1)の間を循環します。2番目の最初の項目は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、これは異なるモードで異なる方法で使用されます。
スティーブン

@Mayube上に投稿したスニペットにはが含まれているAため、1つの入力を探します。2つあり、どちらから#もデフォルトの入力が指定されているため、最初Aの値をの値として使用し、2番目の値をとして使用しnます。
スティーブン

したがって、2つの入力を追加しBC、append を指定すると、Aが最初の入力、Bが2番目、Cが1、nが2番目の入力になりますか?
Skidsdev

@Mayube正確に、私のくだらないドキュメントをごめんなさい。TMI:最初が#1,1(バーなし)のように見える場合、Aは最初の1、Bは2番目の1、Cは最初の入力、nは2番目の入力です。あなたも行うことができ#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)})();

最初のコードの後に​​2番目のコードブロックを配置します。

免責事項:2番目のコードブロックは単独では機能しません(最初のコードブロックの後に配置されることはありません)。ただし、これが許可されていない場合は、2番目のスニペットを変更できます。

これは完全なプログラムです。出力はprocess.stdout(STDOUT)、入力はprocess.argv(コマンドライン引数)

これは私の最初の警官と強盗です、うまくいけばこれは良い挑戦です:)

オンラインでお試しください!


課題の説明

n0から1e7までのランダム変数を生成します。正しいnを指定してwriteを呼び出すと、何も出力されず、l0に設定されて書き込み機能が「ロック解除」され、何でも印刷できるようになります。文字列以外でwriteを呼び出そうとすると、無限ループに入ります。nwriteが「ロック」されている間に正しいもの以外でwriteを呼び出そうとすると、推測を防ぐために無限ループに入ります。

意図したソリューション

sで始まるSymbolを使用してのみ文字列をチェックするtypeofをすり抜けます。文字列 "f"をSymbolに追加できないため、eval呼び出しの結果、関数にエラーがスローされます。エラーをキャッチし、正規表現を使用nして、関数の名前にあるスタックトレースから回復します。次にn、何も出力しない書き込みを試みますが、「ロック」変数lを0に設定して、書き込み関数を「ロック解除」します。書き込み関数のロックが解除されたので、合計を出力します。

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


それは天才です...私は元々正しい軌道に乗っていました!脳のトレーニングをありがとう!
ドムヘイスティングス

3

RProgN2Arnold Palmerによるクラック

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

すべての数学演算子を上書きしますが、それらを復元する方法はありません。特に、スタックの上位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.

オンラインでお試しください!


私はあなたのドキュメントを調べてい²ますが、シンボルが何をするのか見つけることができないようです。啓発してくれませんか?
アーノルドパーマー

資料には、RProgN2のために非常に関連していない、そしてそのシンボルは、次の二つの概念を取り[[、この場合には、関数@ArnoldPalmerでそれらをラップ
ATaco


ダン、それははるかに良いです。スタック演算子については知りませんでした。確かに便利でしょう。また、«»グローバル変数を台無しにするのではなく、ローカル変数を作成することを知ることは非常に役立ちます。
アーノルドパーマー

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-main-is
zbw

これは機能しませんが、とにかくアイデアを共有したいです
ブラックキャップ

私はそれを割れたと呼ぶでしょう。ここに私の意図した解決策がありました。ラッパーは入力をコンパイラーに送信しないため、TIOでは機能しません。
-zbw

ソリューションを投稿する場合は、クラックされたとマークします。
-zbw

3

マスカルポーネ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<^$

入力は、stdioの教会番号でi、増分とzゼロを使用します。たとえば、2 + 3は次のようになります。

iiziiiz

末尾に改行

がある場合、出力は、stdioと同じ形式で、stdoutの数値になります。たとえば、答えが5の場合、出力する必要があります。

iiiiiz

(マスカルポーンには数字の概念はありません)


意図したソリューション:

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

ドキュメンテーションからすぐにはわかりませんが、@ IlmariKaronenがクラックで述べたように、マスカルポーネの文字列リテラルは、実際には文字のシーケンスをプッシュするための構文糖です。

[this]$文字列をプッシュしてすぐにポップするように見せるために、意図的にコメントを書きました。素朴なクラッカーは[:,>!]/*、文字列をプッシュしたり、インタープリターと交換したり、解釈したりすることを試みたかもしれません。

また、スタックに残したインタープリターをでポップするふりをしますが$$すでにNOPに再定義されています。スタックにはこのインタープリターが残っているので、プログラム全体を通してそれを携帯する必要があります。すべての文字列の各文字をトラフします。


割れた。いいえ、この挑戦​​の前にマスカルポーネについて聞いたことがありませんでした。
イルマリカロネン

@IlmariKaronen新しいお気に入りの言語は?よくやった!
ブラックキャップ

2

Ilmari KaronenによるC#(.NET Core)のクラック

またジョシュアによって割れた。

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

stdinから2つの値を読み取り、結果をstdoutに書き込みます。Frameworkバージョン3、4.6の Windowsおよび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これは意図したソリューションではないと思います。
ジョシュア

@IlmariKaronen:+1。これが意図された解決策でした。
raznagul

@ジョシュア:私が意図したものとは異なる解決策を見つけるための+1。
raznagul

2

GolfScriptDennisによりクラック

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

オンラインでお試しください!

これは、ある結局、挑戦、なぜGolfScriptを試してみませんか?

有効なソリューションは、スタックから2つの整数を読み取り、それらを加算してスタックに結果を返すスニペットである必要があります。キャッチは、上記のコードがほとんどすべての組み込みのGolfScript演算子を再定義した後でも動作するはずであり、絶対に何もしないことです。少なくとも私はそのまま;にしておいたので、スタックから値をポップすることができます。;-)コードは、TIOなどに実装されている標準のGolfScriptインタープリターで動作するはずです(上記のリンクを参照)。


私自身のようなデニスのソリューションは、二重引用符で囲まれた文字列で補間されたRubyコードを許可するGolfScriptのめったに使用されない機能に依存しています。この機能を使用して、組み込み演算子とまったく同じように機能する新しい加算演算子を定義し、+呼び出します。

(GolfScriptのRuby補間機能があまり使用されない理由の1つは、厄介なことに、解析中に補間されたRubyコードが実行さ、その出力がGolfScriptインタープリターによってキャッシュされるためです。ループでは、コードは実際のプログラムが開始する前に 1回だけ実行され、その後、ループの各反復で常に同じ値を返します。文字列eval使用して解析を延期することで回避できますくて冗長で、いずれにしても、このチャレンジではeval演算子~も無効にしましたが、新しい組み込みのGolfScript演算子定義することが判明しました この機能が実際に非常にきれいに実行することの1つです。)



割れた。最後に、私が間違っていたことを理解しました。
デニス

@デニス:ええ、あなたは今回それを打ちました。FWIW、私の意図したソリューション"#{var'_','gpush a+b'.cc2}";_、数バイト短いことを除いて、あなたのものとまったく同じように動作します。
イルマリカロネン

2

Node.js v8.2.0、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) )
                 );
}

logic関数を実装する必要があります。入力は(stdinから)提供される引数であり、出力は関数が返すもの(stdoutに出力されるもの)です。


私のコード教会は、入力からの数字をエンコードします。残りのコードは、あなたを脅すためだけにあります。
mess関数は、ポイントフリー表記a . b == dot (a) (b))を実装するためにいくつかの策略を行います. id .。これは、主にランダムな場所に追加するために使用します。関数
に渡す前に数値に適用される変換logicx+1and y-1であり、合計が0になるため、不明瞭さに追加する別のNOPです。

意図したソリューションは次のとおりです。

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


限り、プログラムは例外なく停止し、出力に追加の文字を印刷しないように、あなたができることを言う意図した解決策ではないのですが、私はつもりだ@DomHastings
BlackCap

代替案を投稿しました!(しかし、その答えの歴史の中で私の以前の解決策を見ることができます!)
ドムヘイスティングス

ああすごい、私は道を進んでいた...それでもそれは私の最初の非常にずるい試みよりも優れています!パズルをありがとう!
ドムヘイスティングス

2

インフォーム7ppperryによりクラック

For reading a command: rule fails.

[Your code here.]

入力は、プレーヤーによってインタラクティブなコマンドとして入力する必要があります(例:add 17 to 25または)sum 17 25。2つの数字が含まれている限り、入力するコマンドの正確な形式を自由に選択できます。42コマンドに応答して、数字の合計(例:)を印刷する必要があります。

もちろん、課題は、「コマンドを読む」アクティビティ全体がノーオペレーションに置き換えられている間にそれを行うことです。この問題を解決する方法はおそらくいくつかありますが、少なくとも言語にある程度精通している必要があります。私が思いついたものは、少し予期しないものである場合、実際には非常に簡単です。

Ubuntu Linux上のGNOME Inform 7 IDE バージョン6L38でソリューションをテストしました。目的のソリューションは、GlulxとZ-machineの両方のバックエンドで動作し、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で実装されていない限り、必要なことは何でもできます。つまり、no print、noを意味します。inputこれらはすべて_(1)行にヒットして終了します。STDINからの入力と2つの別々の行にある番号、STDOUTへの出力。これがどれくらい続くのだろうか...この無効化のトリックを思いついた後、2番目の作業スニペットを見つけるのにかなり時間がかかった。sys.setprofileの代替実装に基づいてクラックされることを避けるために、明示的にCpythonを指定します。


割れた。これがなぜ機能するの、私にはほとんど分かりません。
シシュポス

今すぐ質問できると思います。なぜfunctoolsですか?
デニス

@Dennis sispyphusは意図した解決策ではなく抜け穴を発見したため
pppery

あなたの亀裂は次のように報告されている@Sisyphus のpythonのバグ
pppery

2

Java 8(ひび割れ

2回目の試行。今回は、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
適切なインポートを含むクラスでこれを囲みますか?これは、この小さな変更がエントリを作成または破壊する可能性のある種類の課題です。これにはいくつかの解決策がありますが、これを単純にクラス/インターフェースで囲むと劇的に減少します。また、これらすべてを削除するようにフォーマットしますが、読者にとっては行はかなりいいでしょう。
オリビエグレゴワール

そこにはまさにあなたのコードを使用したひび割れた答えがあります。そして、それを忘れたようだから+1。ごめんなさい。
オリビエグレゴワール

#setAccessible(false)呼び出しは何もしません。
ネヴァイ

1

Python 2 が割れました

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

オンラインでお試しください!

この答えはジャークムーブであり、下限の答えとして意図されていると言って、これを序文にします。


Wheat WizardHyperNeutrinoの回答に触発されました。

スニペットはソースファイルを読み取り、空白で区切られた最後のコードチャンクがに256でない場合、続行を拒否しますe6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843

編集このコメントに応じてわずかに編集されました。コアの問題は変わらず、クラックの試みは無効になりません。


1
RE最初のスニペット:This code is not allowed to crash or exit.
スティーブン

これは終了するため無効です。最初のスニペットでは許可されていません。
DJMcMayhem


1

@OlivierGrégoireによる Java 8のクラック

できる限りハードにしようとしました!:)そして、これまでの他の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では動作しないようであるため、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によるクラック

公平を期すために、これは改行を使用するため、改行を使用しないソリューションをご覧ください。

また、ジョナサン・アランによる解決策

これは改行を使用しないため、クラックされています。:P

私の解決策はこれです:

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

最初のスニペットは単一文字のアトムのみを削除します。つまり、Python evalは引き続き機能します:)))


2番目のスニペットは常に最初のスニペットの最後に追加されます。
スティーブン

@StepHenちょうど:Pを指定しますが、メモを追加するのを忘れました。それは本当に重要です。
ハイパーニュートリノ

3
そのような強盗を制限できるとは思わない。Newlinesでクラックできる場合、それは有効なクラックです。とにかく改行が追加されるのを防ぐ、または最初の行を強制的に実行する方法はありますか?
DJMcMayhem


1
私はあなたの意図した亀裂が好きです。非常に卑劣です。
デニス

1

JavaScript、クラック

入力:prompt()2回

出力: console.log()

私のソリューションはjsfiddleでは動作しません。Google Chromeの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仕様に素数テストがあるとは思わない。両方のスニペットを表示しない。
スティーブン

申し訳ありませんが、あなたは正しいです、私は誤解しています。
CR Drost

1

Java、 ひび割れ

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...しかし、あなたはとにかく意図したソリューションを持って...
ローマグラーフ

ここには問題はありません。私は実際に2番目のスニペットを作成し、それを編集するのを忘れました。TIOによると、最初のスニペットは警告なしでコンパイルされます。
ローマングラフ

@OlivierGrégoire完了。私は、任意のIDEは、このために私に叫ぶだろうと思いますが、私は、少なくともコンパイラが...それを受け入れる
ローマGRAFを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.