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