Inspirado por este comentario ...
¡Gracias a los usuarios Step Hen , Wheat-Wizard y Dennis por ayudarme a solidificar la especificación de este desafío antes de publicarlo!
Este es el hilo de los policías. Para el hilo de los ladrones, vaya aquí
En este desafío , tiene la tarea de ejecutar un código que haga que su lenguaje ya no satisfaga nuestros criterios de ser un lenguaje de programación. En ese desafío, eso significa hacer que el idioma ya no pueda ...
Tomar entrada y salida numérica
Suma dos números juntos
Prueba si cierto número es primo o no.
Esta es una de policías y ladrones desafío, donde hay dos retos diferentes con dos objetivos diferentes: los policías se trate de escribir un código que hace que el lenguaje sobre todo inservible, y los ladrones tratarán de encontrar la solución oculto que permite a la policía para recuperar su lenguaje.
Como policía, debes escribir dos fragmentos de código:
Uno que hace que su idioma sea prácticamente inutilizable, por ejemplo, eliminando las funciones integradas para tomar entradas / salidas y operaciones numéricas. Cuantas más funciones elimines, mejor. Este código no puede bloquearse o salir. Debería ser posible agregar código al final de este fragmento, y ese código será evaluado . Y...
... un fragmento de código que toma dos enteros no negativos como entrada, los agrega y genera su suma. Este fragmento debe funcionar correctamente incluso después de ejecutar el primer fragmento. Cuando los dos fragmentos se combinan, deben formar un programa completo que agregue dos números o definir una función que agregue dos números. Idealmente, este fragmento debe basarse en un comportamiento muy oscuro, para que sea más difícil de encontrar.
Puede elegir cualquier método estándar de entrada y salida . Sin embargo, debe revelar exactamente qué formato (entrada y salida) está utilizando. Un ladrón no puede descifrar su respuesta a menos que use el mismo formato que usted.
Después de escribir estos dos fragmentos, debe publicar el primero como respuesta, sin revelar el segundo. Su respuesta debe contener toda la siguiente información:
El primer fragmento (obviamente no el segundo).
Idioma (incluida la versión menor, ya que la mayoría de las presentaciones probablemente dependerán de casos extraños)
Formato IO, incluso si es una función o un programa completo. Los ladrones deben usar el mismo formato para que su crack sea válido.
Cualquier caso extraño requerido para que su respuesta funcione. Por ejemplo, solo se ejecuta en Linux , o requiere una conexión a Internet . Obviamente, esto es un poco subjetivo, pero si un policía tiene un caso extremo que evita que se agriete, y luego solo revela esto después de estar a salvo, considero esta mala deportividad. Un ladrón potencial debe tener toda la información necesaria para descifrar su respuesta antes de descifrarla.
No necesita revelar su recuento de bytes hasta que su respuesta esté segura.
Aquí hay un ejemplo. Para el primer fragmento, puede enviar el siguiente programa Python 3:
Python 3
print=None
Toma entrada de STDIN y salida a STDOUT
Y luego, como tu segundo fragmento, podrías escribir:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Esto es válido porque tomará dos números como entrada y generará su suma incluso si une los dos fragmentos, p. Ej.
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Sin embargo, esto será extremadamente fácil para un ladrón para encontrar una solución. Dado que esto sería muy fácil de descifrar, podría intentar parchear este enfoque particular de esta manera:
import sys
sys.stdout=None
print=None
Sin embargo, incluso esto tiene una solución muy fácil:
del print
a,b=int(input()),int(input())
print(a+b)
Como policía, su objetivo es hacer que la solución oculta sea lo más oscura posible, para evitar que los ladrones la encuentren.
Los ladrones mirarán una de sus respuestas e intentarán descifrarla. Pueden descifrarlo escribiendo cualquier fragmento válido que pueda funcionar como fragmento 2 (sumando dos números juntos después de que el idioma quede prácticamente inutilizable). Esto no tiene por qué ser el mismo fragmento que originalmente pretendía. Si un ladrón descifra su respuesta, dejará un comentario en su respuesta, y luego debe editarla para indicar que se ha descifrado. Si su publicación está descifrada, debe editar su respuesta para mostrar la solución (fragmento 2) que pretendía originalmente. Esta no es una regla per se , solo una sugerencia amigable para mantener el juego divertido. Usted no tiene que.
Si una respuesta permanece sin descifrar durante una semana completa, puede editar en su segundo fragmento e indicar que su respuesta ahora es segura . Si no lo edita después de que termine la semana, otros usuarios aún pueden descifrarlo hasta que lo haga. Si no revela su segundo fragmento, no puede reclamar puntos por su respuesta, o llamarlo seguro.
El ganador del hilo de la policía es la respuesta segura más corta que incluye ambos fragmentos , contados en bytes, y esta respuesta será aceptada después de que haya pasado el tiempo suficiente. Usted no tiene que revelar su cuenta de bytes hasta que su respuesta es seguro, ya que cuenta de bytes es irrelevante para su puntuación hasta que su respuesta es seguro. En el caso de que haya pasado suficiente tiempo y no haya respuestas sin descifrar, el ganador será la respuesta que permaneció sin descifrar durante el período de tiempo más largo.
¡Que te diviertas!
Aclaraciones de reglas
El primer fragmento debe ejecutarse correctamente sin tomar ninguna entrada . Puede generar lo que desee, y esta salida será ignorada, siempre y cuando el fragmento esté hecho, el segundo fragmento se ejecutará correctamente.
El segundo fragmento debe ejecutarse para que su respuesta sea válida. Esto significa una respuesta como
import sys sys.exit()
no es válido porque no rompe el idioma. Simplemente se cierra. Del mismo modo, ingresar un bucle infinito no es válido, ya que el segundo fragmento nunca se ejecutará.
Después de estar seguro, su puntaje es el recuento de bytes de ambos fragmentos .
Esto se remonta a Por favor, revele los casos extremos extraños necesarios para que su respuesta funcione ... Su envío debe contener suficiente información antes de ser revelado para ser reproducible después de ser revelado. Esto significa que si su respuesta se vuelve segura y luego edita en: Aquí está mi respuesta. Ah, por cierto, esto solo funciona si lo ejecutas en Solaris, ¡es una broma! su respuesta no es válida y se eliminará y no se considerará elegible para ganar.
Se permite que el segundo fragmento se bloquee después de generar la suma, siempre y cuando la salida siga siendo correcta (por ejemplo, si elige enviar a STDERR, y luego obtiene un montón de información de bloqueo, esto no es válido).
No puede editar su código después de enviar una respuesta.
No puede confiar en funciones criptográficas como cifrado, funciones hash, CSPRNG, etc.
int main(){ do_evil_stuff(); }
dónde debe ir el código de usuario? En una función? Después de todas las declaraciones enmain
?