Ispirato da questo commento ...
Grazie agli utenti Step Hen , Wheat-Wizard e Dennis per avermi aiutato a consolidare le specifiche di questa sfida prima di inviarla!
Questo è il filo degli sbirri. Per il thread dei ladri, vai qui
In questa sfida , ti viene assegnato il compito di eseguire un codice che lo rende in modo che il tuo linguaggio non soddisfi più i nostri criteri di essere un linguaggio di programmazione. In quella sfida, ciò significa far sì che la lingua non possa più ...
Accetta input e output numerici
Aggiungi due numeri insieme
Verifica se un determinato numero è un numero primo o no.
Questa è una sfida di poliziotti e ladri , in cui ci sono due sfide diverse con due obiettivi diversi: i poliziotti proveranno a scrivere del codice che rende la lingua per lo più inutilizzabile, e i ladri cercheranno di trovare la soluzione nascosta che consente ai poliziotti per recuperare la loro lingua.
Come poliziotto, devi scrivere due frammenti di codice:
Uno che rende la tua lingua per lo più inutilizzabile, ad esempio rimuovendo le funzioni integrate per eseguire input / output e operazioni numeriche. Più funzionalità rimuovi, meglio è. Questo codice non può bloccarsi o uscire. Dovrebbe essere possibile aggiungere il codice alla fine di questo frammento e quel codice verrà valutato . E...
... uno snippet di codice che accetta come input due numeri interi non negativi, li somma e genera la loro somma. Questo snippet deve funzionare correttamente anche dopo aver eseguito il primo snippet. Quando i due frammenti sono combinati insieme, devono formare un programma completo che aggiunge due numeri o definire una funzione che aggiunge due numeri. Idealmente, questo frammento dovrebbe basarsi su comportamenti molto oscuri, in modo da essere più difficile da trovare.
È possibile scegliere qualsiasi metodo standard di input e output . Tuttavia, devi rivelare esattamente quale formato (input e output) stai utilizzando. Un ladro non può decifrare la tua risposta a meno che non utilizzi lo stesso formato come te.
Dopo aver scritto entrambi questi frammenti, devi pubblicare il primo come risposta, senza rivelare il secondo. La tua risposta dovrebbe contenere tutte le seguenti informazioni:
Il primo frammento (ovviamente non il secondo).
Lingua (inclusa la versione minore, poiché la maggior parte degli invii si baserà probabilmente su strani casi limite)
Formato IO, incluso se si tratta di una funzione o di un programma completo. I ladri devono usare lo stesso formato affinché il loro crack sia valido.
Eventuali strani casi limite necessari affinché la tua risposta funzioni. Ad esempio, funziona solo su Linux o richiede una connessione a Internet . Ovviamente, questo è leggermente soggettivo, ma se un poliziotto ha un caso limite estremo che gli impedisce di essere rotto, e poi lo rivela solo dopo essere stato al sicuro, considero questa scarsa sportività. Un potenziale ladro dovrebbe avere tutte le informazioni necessarie per decifrare la tua risposta prima che venga decifrata.
Non è necessario rivelare il conteggio dei byte finché la risposta non è sicura.
Ecco un esempio Per il primo frammento, è possibile inviare il seguente programma Python 3:
Python 3
print=None
Riceve input da STDIN e output su STDOUT
E poi come secondo frammento, potresti scrivere:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Questo è valido perché prenderà due numeri come input e produrrà la loro somma anche se unisci i due frammenti insieme, ad es.
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Tuttavia, sarà estremamente facile per un ladro trovare una soluzione. Poiché questo sarebbe molto facile da decifrare, potresti provare a patchare questo particolare approccio in questo modo:
import sys
sys.stdout=None
print=None
Tuttavia, anche questo ha una soluzione molto semplice:
del print
a,b=int(input()),int(input())
print(a+b)
Come poliziotto, il tuo obiettivo è rendere la soluzione nascosta il più oscura possibile, per impedire ai ladri di trovarla.
I ladri guarderanno una delle tue risposte e cercheranno di decifrarla. Possono decifrarlo scrivendo qualsiasi snippet valido che potrebbe funzionare come snippet 2 (sommando due numeri insieme dopo che la lingua è diventata per lo più inutilizzabile). Questo non deve essere lo stesso frammento che intendevi inizialmente. Se un ladro incrina la tua risposta, lascerà un commento sulla tua risposta, quindi dovresti modificarlo per indicare che è stato crackato. Se il tuo post è incrinato, dovresti modificare la tua risposta per mostrare la soluzione (snippet 2) che avevi inizialmente previsto. Questa non è una regola in sé , solo un suggerimento amichevole per mantenere il gioco divertente. Tu non devi.
Se una risposta rimane senza crack per un'intera settimana, puoi modificarla nel secondo snippet e indicare che la risposta è ora sicura . Se non lo modifichi dopo che è trascorsa la settimana, altri utenti possono comunque crackarlo fino a quando non lo fai. Se non riveli il tuo secondo frammento, non puoi richiedere punti per la tua risposta o chiamarlo sicuro.
Il vincitore del thread della polizia è la risposta sicura più breve che include entrambi i frammenti , conteggiati in byte, e questa risposta sarà accettata dopo che è trascorso un tempo sufficiente. Non è necessario rivelare il conteggio dei byte finché la risposta non è sicura, poiché il conteggio dei byte è irrilevante per il punteggio fino a quando la risposta non è sicura. Nel caso in cui sia trascorso un tempo sufficiente e nessuna risposta rimanga incrinata, il vincitore sarà la risposta rimasta indecisa per il periodo di tempo più lungo.
Divertiti!
Chiarimenti sulle regole
Il primo frammento deve essere eseguito correttamente senza accettare alcun input . Può produrre qualsiasi cosa tu voglia, e questa uscita verrà ignorata - fintanto che dopo aver fatto lo snippet, il secondo snippet verrà eseguito correttamente.
Il secondo frammento deve essere effettivamente eseguito affinché la risposta sia valida. Questo significa una risposta come
import sys sys.exit()
non è valido perché non rompe la lingua. Si chiude semplicemente. Allo stesso modo, l'immissione di un ciclo infinito non è valida, poiché il secondo frammento non verrà mai eseguito.
Dopo essere sicuro, il tuo punteggio è il conteggio dei byte di entrambi i frammenti .
Questo torna a Si prega di rivelare eventuali strani casi limite necessari affinché la vostra risposta funzioni ... La vostra presentazione deve contenere abbastanza informazioni prima di essere rivelata per essere riproducibile dopo essere stata rivelata. Questo significa che se la tua risposta diventa sicura, e poi modifichi: Ecco la mia risposta. Oh ya, a proposito questo funziona solo se lo esegui su Solaris, lo scherzo è su di te! la tua risposta non è valida e verrà eliminata e non considerata idonea alla vincita.
Il secondo frammento può arrestarsi in modo anomalo dopo aver emesso la somma, purché l'output sia ancora corretto (ad esempio, se si sceglie di eseguire l'output su STDERR e si ottengono un sacco di informazioni sull'arresto anomalo, ciò non è valido).
Non è possibile modificare il codice dopo aver inviato una risposta.
Non puoi fare affidamento su funzioni crittografiche come crittografia, funzioni hash, CSPRNG ecc.
int main(){ do_evil_stuff(); }
dove dovrebbe andare il codice degli utenti? In una funzione? Dopo tutte le dichiarazioni inmain
?