El reto
Te presento otro desafío espía contra espía que enfrenta a los ofuscadores frente a los crackers. En este caso, sin embargo, el dato a proteger no es una entrada sino una salida .
Las reglas del desafío son simples. Escriba una rutina con las siguientes especificaciones:
- La rutina puede estar escrita en cualquier idioma pero no puede exceder los 320 bytes.
- La rutina debe aceptar tres enteros con signo de 32 bits como entradas. Puede tomar la forma de una función que acepta 3 argumentos, una función que acepta una sola matriz de 3 elementos o un programa completo que lee 3 enteros de cualquier entrada estándar.
- La rutina debe generar un entero de 32 bits con signo.
- Sobre todas las entradas posibles, la rutina debe generar entre 2 y 1000 valores únicos (inclusive). El número de valores únicos que puede generar una rutina se denomina clave .
Como ejemplo, el programa C
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
tiene una llave de 9, ya que (esperemos) sólo tiene salida de los nueve valores 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, y 24
.
Algunas limitaciones adicionales son las siguientes:
- La rutina debe ser totalmente determinista e invariante en el tiempo, devolviendo salidas idénticas para entradas idénticas. La rutina no debe llamar a los generadores de números pseudoaleatorios.
- Es posible que la rutina no dependa de "variables ocultas", como datos en archivos, variables del sistema o características de lenguaje esotérico. Por ejemplo, las rutinas generalmente no deberían referirse a constantes a menos que las constantes estén claramente definidas en el código mismo. Las rutinas que se basan en peculiaridades del compilador, resultados de operaciones matemáticamente indefinidas, errores aritméticos, etc., también se desaconsejan. En caso de duda, por favor pregunte.
- Usted (el codificador) debe saber con precisión cuántas salidas únicas puede producir la rutina y debe poder proporcionar al menos una secuencia de entrada que produzca cada salida. (Dado que potencialmente puede haber cientos de salidas únicas, este conjunto solo se solicitará en caso de que su clave sea impugnada).
Dado que este problema se parece mucho menos al cifrado clásico que el anterior, espero que sea accesible para un público más amplio.
Cuanto más creativo, mejor.
La puntuación
Los envíos más cortos sin descifrar por conteo de bytes se declararán ganadores.
Si hay alguna confusión, no dude en preguntar o comentar.
El contra desafío
Se alienta a todos los lectores, incluidos los que han presentado sus propias rutinas, a "descifrar" los envíos. Un envío se agrieta cuando su clave se publica en la sección de comentarios asociados. Si un envío persiste durante 72 horas sin ser modificado o agrietado, se considera "seguro" y cualquier éxito posterior en el agrietamiento será ignorado por el concurso.
Solo se permite un intento de craqueo por envío por lector. Por ejemplo, si presento al usuario X: "su clave es 20" y me equivoco, el usuario X rechazará mi suposición como incorrecta y ya no podré enviar suposiciones adicionales para ese envío.
Las presentaciones agrietadas se eliminan de la contienda (siempre que no sean "seguras"). No deben ser editados. Si un lector desea enviar una nueva rutina, debe hacerlo en una respuesta separada.
El puntaje de un cracker es el número de envíos (que cumplen o no) que descifra. Para los crackers con recuentos idénticos, la clasificación se determina por el recuento total de bytes en todas las presentaciones agrietadas (cuanto mayor, mejor).
Los cracker (s) con los puntajes más altos serán declarados ganadores junto con los desarrolladores de las rutinas ganadoras.
Por favor no descifre su propia presentación.
La mejor de las suertes. :)
Tabla de clasificación
Última actualización 2 de septiembre, 10:45 AM EST
Barreras inamovibles (presentaciones no agrietadas):
- CJam, 105 [Dennis]
Fuerzas imparables (crackers):
- Dennis [ Java, 269 ; C 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
Respuestas:
CJam, 105 bytes
Lo anterior usa notación caret y M, ya que contiene caracteres no imprimibles. Después de convertir la secuencia de bytes en un entero (
256b
), se ejecuta el siguiente código:Puede probar esta versión en línea en el intérprete de CJam .
Cómo funciona
Esta presentación utiliza la teoría de números en lugar de la ofuscación. El programa devolverá 0 para casi todas las entradas. De las pocas entradas que resultan en una salida distinta de cero, se deriva un módulo secreto que se aplica a los 10 bits menos significativos del tercer entero.
La forma más eficiente de resolver este desafío (que se me ocurre) sería factorizar el entero de 512 bits, que espero no se pueda lograr en 72 horas.
Ejecución de ejemplo
fuente
Java - 269
Gracias por la paciencia de todos, esto ahora debería solucionarse.
acortado:
No acortado:
fuente
double e,f,d=...;e=...;f=...;
adouble d=...,e=...,f=...;
1
y tu respuesta también es incorrecta;) (123 está en lo correcto ... alguien viene y toma el puntaje de craqueo ...). Y supongo que Stretch Maniac no tuvo en cuentasin == 1.0
cuando dijo que 122 es correcto.Un muestreador
No es una entrada oficial, por supuesto, y el recuento de caracteres es demasiado alto, pero imagino que si alguien quiere un desafío para aturdir la mente, pueden intentar determinar cuántas salidas únicas produce la siguiente función (dadas tres entradas como se describe en el OP) :
De hecho, estoy tan seguro de que es indescifrable que otorgaré a cualquiera que lo descifre el "Premio Supremo Imparable de la Fuerza de la Naturaleza".
Porque realmente, se lo merecen.
fuente
C, 58 bytes (agrietado)
Una simple:
fuente
-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867
).Java - 245
Craqueado por Martin Büttner
Alimente la entrada como una matriz int:
a(new int[]{1,2,3})
. No espero que dure 72 horas, pero diviértete con eso.Aquí está con saltos de línea, para que sea un poco más legible:
fuente
Mathematica, 29 bytes, clave: 715, descifrado por Dennis
Esta es solo una versión fija de mi respuesta inicial, que no funcionó para entradas no positivas.
Toma una lista de enteros como
fuente
349
resultados únicos. El rango era de3
a717
.3 ... 717
).207 caracteres, en C / C ++, aún no ofuscados:
fuente