Non pretendo di avere la soluzione definitiva al problema (o che questa lista è esaustiva), ma voglio delineare alcuni possibili approcci che vengono in mente e perché dovrebbero o non funzionerebbero. Inoltre, non affronterò questioni tangenziali come se l'utilizzo del timestamp corrente come fonte di casualità sia sufficientemente "imprevedibile" e come applicare determinate proprietà della distribuzione della probabilità - mi concentrerò solo sull'evitare soluzioni che utilizzano hardcoding.
Non una soluzione: non consentire esplicitamente l'hard-coding
Questa è una cattiva idea. È un requisito non osservabile (il che significa che non è possibile determinare se è soddisfatto solo eseguendo il programma), che è fortemente scoraggiato su PPCG e può essere assolutamente impossibile se si esegue il programma su qualsiasi altra piattaforma, in cui gli invii sono verificati in un modo automatizzato. Il problema con un requisito come questo è che dovresti iniziare trovando una definizione obiettiva per "hard-coding". In generale, se ci provi, peggiorerai le cose.
Rendere impossibile la codifica effettiva
Se non riesci a impedirlo completamente, ma non vuoi che le persone lo usino, puoi provare a progettare la sfida in modo tale che l'hard-coding non sia semplicemente un approccio competitivo. Ciò è possibile se gli oggetti che devono essere generati sono sufficientemente grandi e incomprimibili che inserire un esempio nel codice richiederebbe molti più byte rispetto alla scrittura di un algoritmo che genera soluzioni valide in modo casuale. Nel tuo esempio specifico, ovviamente non è così, perché le matrici di identità sono valide e generalmente facili da generare, ma per altri problemi potrebbe non essere così. Se gli oggetti target sono sufficientemente irregolari, è sufficiente che siano di grandi dimensioni, il che probabilmente non influirà sul conteggio dei byte di un algoritmo reale ma farà saltare in aria la parte codificata.
Parametrizzare l'uscita
Spesso, questi problemi hanno uno o più parametri naturali, come la dimensione della matrice nel tuo esempio. In tal caso, rendere quel parametro un input può essere sufficiente per rendere impossibile o almeno impraticabile la codifica hardware. In alcuni casi, potrebbe essere facile codificare una soluzione specifica per un determinato valore di parametro che è stato trovato manualmente o tramite una ricerca approfondita, ma forse non esiste un semplice modulo chiuso per un'istanza di queste soluzioni in generale, quindi non è possibile generare facilmente un valore predefinito per input arbitrari. Ancora una volta, questo non è il caso dell'esempio che citi, perché la matrice identità funziona a qualsiasi dimensione, ma una soluzione ottimale per questo problema correlatodi solito è altamente irregolare, quindi non è possibile avere un valore predefinito senza cercare attivamente valori validi comunque. È possibile combinare questo con un limite di tempo per evitare una ricerca della forza bruta per un valore predefinito.
Metti qualche limitazione sulla distribuzione di probabilità
Se sei disposto a rinunciare a una distribuzione di probabilità completamente illimitata, puoi mettere alcuni vincoli su di essa, che ancora danno ai rispondenti molta libertà nella scelta della loro distribuzione ma che rendono difficile o impossibile la codifica hard:
- Il vincolo più semplice che viene in mente è quello di richiedere la differenza tra la probabilità minima e massima affinché qualsiasi output possibile sia inferiore a una determinata soglia. Un approccio hard-coded avrà probabilmente probabilità quasi zero per quasi tutte le uscite e una probabilità prossima a 1 per il valore predefinito. Se si richiede che la differenza massima sia inferiore a 0,1, è necessario che ci siano 10 valori predefiniti (scelti casualmente) per rendere l'approccio un'opzione. Allo stesso modo potresti anche richiedere solo una probabilità minima per ogni possibile uscita, ad esempio 1 / (2 * N *), dove N è il numero di possibili uscite.
- In alternativa, è possibile richiedere che non vi siano lacune (verosimili) nella distribuzione, in modo che non vi siano intervalli di dimensione δ (scelti da te) in modo tale che esistano probabilità sia superiori che inferiori. Ciò significa che non ci possono essere valori anomali in termini di probabilità, che sono probabilmente generati da un approccio codificato.
Il problema principale di questi approcci è che sono molto più difficili da ragionare, è difficile dimostrare la correttezza delle risposte e verificare sperimentalmente la correttezza può essere impossibile per ampi spazi di output. Tuttavia, forniscono un requisito principalmente osservabile per il programma che può rendere impossibile l'hardcoding.
Questi approcci possono anche richiedere un limite di tempo, perché un modo per aumentare la probabilità dei valori non predefiniti sarebbe quello di tentare di trovare un foo casuale più volte prima di tornare al valore predefinito.