7 , 31 caracteres, puntaje 30, seguro pero posiblemente roto?
Un programa 7 normalmente es solo un número, pero puede contener espacios en blanco, dividiéndolo en múltiples números. Por lo tanto, esta presentación consta de dos números (que están implícitamente concatenados por el intérprete 7), y el programa también toma dos números como entrada, a través de la entrada estándar. (Los "31 caracteres" en el encabezado son la longitud total de los dos números, más un carácter de espacio en blanco de separación; los dígitos que componen los números se interpretan como octales cuando se usan como programa, pero decimales cuando se usan como entrada, y son los dígitos iguales en los dos casos, no los números reales. Tenga en cuenta que es irrelevante cuando se trata como un programa o cuando se trata como una entrada, ya sea que los separe con un espacio o una nueva línea; espero que eso no No invalidar la presentación.)
La salida esperada es el siguiente número (expresado aquí en decimal, ya que ese es el formato de salida que usa el intérprete 7):
238363505302130098723162537059
Tenga en cuenta que el intérprete 7 vinculado desde la wiki de Esolang almacena internamente números en unario, lo que significa que es poco probable que tenga suficiente memoria para ejecutar el programa en sí mismo para ver lo que hace. Verifiqué el programa calculando su comportamiento manualmente y probándolo en pequeñas entradas para verificar que hizo lo que esperaba que hiciera. Un enfoque alternativo sería escribir un intérprete que use un método más eficiente para almacenar números.
Evitar grietas aquí fue algo doloroso, pero finalmente estoy satisfecho de que no haya dos números distintos a los del programa en sí mismos que sean capaces de producir 238363505302130098723162537059 como salida. ( EDITAR 1 semana después: es posible que me haya equivocado, dependiendo de cómo interprete la pregunta; ver más abajo ) .
Solución
El programa original fue:
711170237403706
111723603700633
Este programa toma dos números X e y , y calcula el resultado de la expresión 3 x y- y- 2 (es decir, y( 3 x - 1 ) - 2 ). Si realizamos este cálculo en x = 711170237403706 e y= 111723603700633 , obtenemos un resultado de 238363505302130098723162537059 según sea necesario .
Se pretendía que ninguna otra entrada daría el resultado deseado porque:
La entrada debe elegirse de manera que y( 3 x - 1 ) - 2 = 238363505302130098723162537059 , es decir y( 3 x - 1 ) = 238363505302130098723162537061 (sumando 2 a ambos lados). Este número es un semiprime, con solo dos factores: 111723603700633 y 2133510712211117 . Solo uno de estos números, 2133510712211117 , puede expresarse en la forma 3 x - 1 (dando ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Por lo tanto, podemos identificar de forma exclusiva qué número esX cuál esy , lo que significa que solo funciona una entrada.
Sin embargo, dependiendo de cómo interprete la pregunta, puede haber una segunda entrada que produzca la salida deseada (invalidando así esta solución):
113 x - 1X79454501767376699574387512354189 9) que no están en el juego de caracteres para 7 programas. Entonces, si la entrada está restringida a estar en el mismo juego de caracteres que el programa, esta solución es válida; pero si se permite la entrada que contiene caracteres externos al conjunto de caracteres del programa, esta solución no es válida.
Explicación
Así es como funciona la solución deseada:
711170237403706 111723603700633
7 7 7 Separadores de elementos apilados
113023 403706 111723603700633 Elementos iniciales de la pila
111 Número 3, en unario
023 DSL de E / S para "ingresar un número"
403706 111723603700633 Programa principal
(Implícito: ejecutar una copia del elemento principal del programa, conservando el original)
40 Intercambie {023} sobre {programa}, escapándolo
3 Hacer E / S usando {023}; pop {programa}
0 E / S: numérico
23 Ingrese un número, copiando {111} tantas veces
706 Agregar "6" al número (decrementándolo)
11 Empuje dos elementos de pila vacíos
17236 Empuje un elemento de pila "23" (sin escape)
0 Escape {23}, consumiendo un elemento vacío
3 Hacer E / S usando {23}; pop {el elemento a continuación}
23 Copie la parte superior de la entrada de la pila muchas veces
7006 Agregar "66" (es decir, restar 2)
3 Salida {como un número}
3 Salga del programa (debido a la pila baja)
1
7
0
6
66
12345
3123451234512345