PPCG Jeopardy:強盗


18

このサイトをどれだけ知っていますか?確認してみましょう。

これは挑戦です。 警官のスレッド

強盗として、あなたはする必要があります:

  1. 警官の提出に一致する、削除されていない、閉じられていないチャレンジを見つけます。チャレンジには、タグをことはできません。チャレンジには、有効な出力に制限が必要です。
  2. ここにチャレンジを投稿し、クラッキングしている警官にリンクします
  3. 警察官の投稿に「ひびの入った」コメントを追加し、この回答に戻るリンクを追加します

1ポイントと、提出物がクラックされずに残っていた24時間ごとに1ポイント(最大7)を受け取ります。Tiebreakerは、クラックされたサブミッションの総数です。

ノート:

  • チャレンジにの出力が必要な場合、ユーザーがX出力するXYYXY空白以外の場所にある場合、そのチャレンジに対して送信は有効ではありません。
  • 2016-11-17より新しいチャレンジは許可されていません。
  • 特定の課題が広く適用可能な場合(すべての提出の大部分に適用できる場合)、私は特定の課題を禁止する権利を留保します。
  • 説明として1つまたは2つの文を追加することを確認してください(また、提出物をコメントに変換するのに役立ちます)
  • 最初のアイデアをくれたダニエルに感謝します!


回答:


5

コイン投げの半分の頭を獲得する確率を計算します。

警官のエントリ(コナーオブライエン投稿):https : //codegolf.stackexchange.com/a/100521/8927

元の質問:コイン投げの半分の頭を獲得する確率を計算します。


投稿されたソリューションには、いくつかの難読化手法が適用され、その後に同じ難読化手法の複数の層が続きました。最初のいくつかのトリックを過ぎると、実際の機能を抽出するのは単純な(退屈な場合!)タスクになりました。

nCr(a,b) = a! / ((a-b)! * b!)
result = nCr(x, x/2) / 2^x

私が見ているものを理解するのにしばらく時間がかかりました(しばらくエントロピーに関係しているのではないかと疑っていました)が、ひとたび小枝ができたら、「コイントスの確率」を検索して問題を簡単に見つけることができました。


Conor O'Brienが彼のコードの詳細な説明に挑戦したので、ここにもっと興味深いビットの要約があります:

いくつかの組み込み関数呼び出しを難読化することから始めます。これは、関数名をbase-32エンコードしてから、それらを単一文字の新しいグローバル名前空間名に割り当てることによって実現されます。実際には「atob」のみが使用されます。他の2つは単なる赤いニシンです(evalはatobと同じ速記を取り、オーバーライドされるだけで、btoaは単に使用されません)。

_=this;
[
    490837, // eval -> U="undefined"       -> u(x) = eval(x) (but overwritten below), y = eval
    358155, // atob -> U="function (M,..." -> u(x) = atob(x)
    390922  // btoa -> U="function (M,..." -> n(x) = btoa(x), U[10] = 'M'
].map(
    y=function(M,i){
        return _[(U=y+"")[i]] = _[M.toString(2<<2<<2)]
    }
);

次に、コードを隠すためのいくつかの些細な文字列の混同があります。これらは簡単に元に戻すことができます。

u(["","GQ9ZygiYTwyPzE6YSpk","C0tYSki","SkoYSkvZChhLWIpL2QoYikg"].join("K"))
// becomes
'(d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b) '

u("KScpKWIsYShFLCliLGEoQyhEJyhnLGM9RSxiPUQsYT1D").split("").reverse().join("")
// becomes
"C=a,D=b,E=c,g('D(C(a,b),E(a,b))')"

難読化の大部分は、g新しい関数を単純に定義する関数の使用です。これは再帰的に適用され、関数は新しい関数を返すか、関数をパラメーターとして必要としますが、最終的には単純化されます。これから出てくる最も興味深い関数は次のとおりです。

function e(a,b){ // a! / ((a-b)! * b!) = nCr
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}

この行には最後のトリックもあります。

U[10]+[![]+[]][+[]][++[+[]][+[]]]+[!+[]+[]][+[]][+[]]+17..toString(2<<2<<2)
// U = "function (M,i"..., so U[10] = 'M'. The rest just evaluates to "ath", so this just reads "Math"

次のビットは「.pow(T、a)」なので、「Math」でなければならない可能性が常に高いです!

機能拡張のルートに沿って行った手順は次のとおりです。

// Minimal substitutions:
function g(s){return Function("a","b","c","return "+s)};
function e(a,b,c){return (d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b)}
function h(a,b,c){return A=a,B=b,g('A(a,B(a))')}
function j(a,b,c){return a/b}
function L(a,b,c){return Z=a,Y=b,g('Z(a,Y)')}
k=L(j,T=2);
function F(a,b,c){return C=a,D=b,E=c,g('D(C(a,b),E(a,b))')}
RESULT=F(
    h(e,k),
    j,
    function(a,b,c){return _['Math'].pow(T,a)}
);


// First pass
function e(a,b){
    d=function(a){return a<2?1:a*d(--a)}
    return d(a)/d(a-b)/d(b)
}
function h(a,b){
    A=a
    B=b
    return function(a){
        return A(a,B(a))
    }
}
function j(a,b){ // ratio function
    return a/b
}
function L(a,b){ // binding function (binds param b)
    Z=a
    Y=b
    return function(a){
        return Z(a,Y)
    }
}
T=2; // Number of states the coin can take
k=L(j,T); // function to calculate number of heads required for fairness
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    h(e,k),
    j,
    function(a){return Math.pow(T,a)}
);


// Second pass
function e(a,b){...}
function k(a){
    return a/2
}
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    function(a){
        return e(a,k(a))
    },
    function(a,b){
        return a/b
    },
    function(a){return Math.pow(2,a)}
);


// Third pass
function e(a,b) {...}
C=function(a){ // nCr(x,x/2) function
    return e(a,a/2)
}
D=function(a,b){ // ratio function
    return a/b
}
E=function(a){return Math.pow(2,a)} // 2^x function
RESULT=function(a,b,c){
    return D(C(a,b),E(a,b))
}

関数のネストの構造は、ユーティリティに基づいています。最も外側の「D」/「j」関数が比率を計算し、次に内側の「C」/「h」および「E」(インライン)関数が必要なコインフリップカウントを計算します。3番目のパスで削除された「F」関数は、これらを使用可能な全体に接続する役割を果たします。同様に、「k」関数は、観察する必要があるヘッドの数を選択する役割を果たします。パラメータバインディング関数「L」を介して比率関数「D」/「j」に委任するタスク。修正パラメータに、ここで使用bするT(コインを取ることができます状態の数であること、ここでは常に2)。

最終的に、次のようになります。

function e(a,b){ // a! / ((a-b)! * b!)
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}
RESULT=function(a){
    return e(a, a/2) / Math.pow(2,a)
}

よくやった!これは少し間違っていfます。evalはに設定されています。しかし、残りは正しいです!また、どのようRESULTに導出されるかについて少し詳しく説明する価値があるかもしれません;)
コナーオブライエン

@ ConorO'Brien確かに; それらをすべて折りたたむ前に、メモと各機能のユーティリティの説明を追加しました。
デイブ

@ ConorO'Brien賞金に感謝します!
デイブ

いつも楽しみ:)
コナーオブライエン

3

MATL、Luis Mendo2つの数字の間の大きな小数のカウント数

&:"@FYAYm7>vs

入力で遊んでそれが何をするかを理解しましたが、合計が桁数の7倍を超える範囲の整数の数を計算するためにどのような課題があるのか​​わかりませんでした。MATLのドキュメントを読んだ後、これが何をするかの大まかな説明をまとめました。

&    % Change default input format
:    % Implictly input two integers, create inclusive range
"    % For each item in this range:
  @    % Push the item
  F    % Push false
  YA   % Convert to base N digits; N is false, so this produces base-10 digits
  Ym   % Calculate arithmetic mean
  7>   % Push 1 if this is greater than 7, 0 otherwise
  v    % Concatenate result into array with previous result
  s    % Sum
     % Implicitly end loop and output

次に、「長さの7倍を超える桁数」の検索から「7を超える平均桁」に切り替えて、探していた課題を見つけました。





2

Perl、Gabriel Benamy便利な回文チェッカー

コードは明らかにある種の回文でした。y- - -構造を取り出して、音訳されているものに気づくと、それがどんな課題であるかがわかりました。


あなたは数秒で私を打ち負かしました...しかしperlをダウンロードするのにとても時間がかかりました。
ライコニ

@Laikoni正直なところ、カップルがIdeoneを試した後、コードの実行をあきらめ、代わりにそれを読んでみました。;)
DLosc

2

Pyth- https: //codegolf.stackexchange.com/a/100391/31343

プログラムが何をしたのかすぐにわかりましたが、課題を見つけるのにかなり時間がかかりました。

別の方法で進む

これは私のバッファです。



1

MATL、Luis Mendo低ハミング重量でハミング重量を計算

dP7EGn:q^1J2/h)ts_hX=Gs[BE]Wd=~>~GBz*

数字を入れてテストし、OEISでハミングウェイトの問題を見つけました

その後、PPCGを検索し、文字列を入力してみましたが、うまくいきました。


警官の挑戦でコメントしたように、これは実際に私の提出物をクラックしません。残念ながら、この答えは削除する必要があると思います
ルイスメンドー


1

Ruby、histoccratTruth-Machineの実装

このコードは、mod 7が0になるf(n) = n*(3*n-1)/2まで実行される反復関数システムを定義します。n0ます。したがって、のすぐに終了します(01回印刷した後)。入力を1与える1、印刷の無限ループにつながる1。他の入力nは、イニシャルが0、2、3、5、または6 mod 7に一致する場合は1〜3ステップで終了し、1または4 mod 7に一致する場合は永久に増加します。しかし、それは無関係です。


1

六角形、548バイト、マーティン・エンダー

これは "プログラムにないすべての文字を印刷する」チャレンジです。

プリント:

Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look

これは、この出力と非常によく似ています。ここでの手がかりは、最後.が印刷されなかったことです。また、コード自体には文字がなく、出力のフレーズにアルファベットのすべての文字が含まれていることは誰もが知っています。



0

Python 3、https://codegolf.stackexchange.com/a/100381/31343

xkcdの式を使用して、世界の人口を概算します

うるう年(4つのチェッカーによる解読可能な分割性のため)に関連する課題を検索しましたが、入力は必要ありませんでした。


うん!とのおかげで明らかである%4とわかっていましたがstrftime、コードの重要な部分を見つけるのに良い仕事です(ほとんどが
意味不明です

ダンジット、私も近づいていた。私はそれが日付と関係があることを理解していた、2005年と2016年/ 2017年を取得していました。良くやった。
ヨードル

どちらも単に出力を生成するコードを実行しただけで、それ7.3 328を検索したことに驚いています。課題はすぐに発生します。
FlipTack



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.