私は問題に対する究極の解決策を持っていると主張しません(または、このリストは網羅的です)が、思い浮かぶいくつかの可能なアプローチと、それらがうまくいかない理由を概説したいと思います。また、ランダム性のソースとして現在のタイムスタンプを使用することが十分に「予測不可能」であるかどうか、確率分布の特定のプロパティを適用する方法など、接線上の問題には対処しません。ハードコーディングを使用するソリューションの回避に焦点を当てます。
解決策ではありません:明示的にハードコーディングを禁止します
これは悪い考えです。これは観察不可能な要件です(つまり、プログラムを実行するだけで満足するかどうかを判断することはできません)。これはPPCGでは強く推奨されず、他のプラットフォームでプログラムを実行する場合、提出が検証される場合はまったく不可能な場合があります自動化された方法。このような要件の問題は、「ハードコーディング」の客観的な定義を見つけることから始めなければならないということです。一般に、これを試しても、事態は悪化するだけです。
ハードコーディングを実行不可能にする
完全に禁止することはできないが、人々にそれを使用させたくない場合は、ハードコーディングが単に競争的アプローチではないようにチャレンジを設計することができます。これは、生成されるオブジェクトが十分に大きく、非圧縮性であり、コードに1つの例を入れると、ランダムに有効なソリューションを生成するアルゴリズムを記述するよりも多くのバイトが必要な場合に可能です。あなたの特定の例では、それはもちろんのことではありません。なぜなら、恒等行列は有効であり、一般に簡単に生成できるからですが、他の問題についてはそうではないかもしれません。ターゲットオブジェクトが十分に不規則な場合は、サイズを大きくする必要があります。これはおそらく、実際のアルゴリズムのバイトカウントには影響しませんが、ハードコードされた部分を爆破します。
出力をパラメーター化する
多くの場合、これらの問題には、例のマトリックスのサイズなど、1つ以上の自然なパラメーターが伴います。その場合、そのパラメーターを入力にすれば、ハードコーディングを不可能にするか、少なくとも非実用的にすることができます。場合によっては、手動または広範な検索で見つかった特定のパラメーター値に対して特定のソリューションをハードコーディングするのは簡単かもしれませんが、一般的にこれらのソリューションのインスタンスには単純な閉じた形式がないため、そうではありません任意の入力のデフォルト値を簡単に生成できます。繰り返しますが、これは恒等行列が任意のサイズで機能するため、言及した例には当てはまりませんが、この関連する問題の最適な解決策です通常は非常に不規則であるため、有効な値を積極的に検索せずにデフォルト値を設定することはできません。これを時間制限と組み合わせて、デフォルト値のブルートフォース検索を回避できます。
入れていくつかの確率分布に制限を
完全に無制限の確率分布を放棄したい場合は、それに制約を加えることができます。これにより、回答者はその分布を自由に選択できますが、ハードコーディングが困難または不可能になります。
- 頭に浮かぶ最も単純な制約は、可能な出力が特定のしきい値を下回るように、最小確率と最大確率の差を要求することです。ハードコーディングされたアプローチでは、ほとんどすべての出力に対してほぼゼロの確率があり、デフォルト値に対して1に近い確率があります。最大差が0.1未満であることが必要な場合は、アプローチをオプションにするために10(ランダムに選択された)デフォルト値が必要です。同様に、可能な出力ごとに最小の確率、たとえば1 /(2 * N *)を要求することもできます。ここで、Nは可能な出力の数です。
- または、分布に(尤度)ギャップがないことを要求して、サイズδ(ユーザーが選択)の間隔がなく、高い確率と低い確率の両方が存在するようにすることができます。これは、ハードコーディングのアプローチによって生成される可能性が高い可能性に関して、外れ値が存在しないことを意味します。
これらのアプローチの主な問題は、それらが推論するのがはるかに難しく、答えの正しさを証明することが困難であり、実験的に正しいことを検証することは大きな出力スペースでは不可能な場合があることです。それでも、それらは、ハードコーディングを不可能にする可能性のあるプログラムに主に観察可能な要件を提供します。
非デフォルト値の確率を高める1つの方法は、デフォルト値にフォールバックする前にランダムなfooを複数回見つけることを試みることになるため、これらのアプローチには時間制限も必要になる場合があります。