7 , 31 caracteres, pontuação 30, seguro, mas possivelmente quebrado?
Um programa 7 normalmente é apenas um número, mas pode conter espaços em branco, dividindo-o em vários números. Portanto, essa submissão consiste em dois números (que são implicitamente concatenados pelo intérprete 7), e o programa também aceita dois números como entrada, via entrada padrão. (Os "31 caracteres" no cabeçalho são o comprimento total dos dois números, mais um caractere de espaço em branco que os separa; os dígitos que compõem os números são interpretados como octais quando usados como um programa, mas decimais quando usados como entrada e são os dígitos que são iguais nos dois casos, não os números reais.Tenha em atenção que é irrelevante quando tratado como um programa ou quando é tratado como uma entrada, se você os separa com um espaço ou uma nova linha; espero que não invalidar o envio.)
A saída esperada é o seguinte número (expresso aqui em decimal, pois esse é o formato de saída que o 7 intérprete usa):
238363505302130098723162537059
Observe que o 7 intérprete vinculado a partir do wiki da Esolang armazena internamente números em unário, o que significa que é improvável que você tenha memória suficiente para realmente executar o programa em si mesmo para ver o que faz. Eu verifiquei o programa elaborando seu comportamento manualmente e testando-o em pequenas entradas para verificar se ele fez o que eu esperava que ele fizesse. Uma abordagem alternativa seria escrever um intérprete que use um método mais eficiente de armazenar números.
Evitar rachaduras aqui foi um pouco doloroso, mas agora estou finalmente satisfeito que dois números diferentes dos do próprio programa são capazes de produzir 238363505302130098723162537059 como saída. ( EDIT 1 semana depois: posso estar errado, dependendo de como você interpreta a pergunta; veja abaixo. )
Solução
O programa original era:
711170237403706
111723603700633
Este programa utiliza dois números x e y e calcula o resultado da expressão 3 x y- y- 2 (ou seja, y( 3 x - 1 ) - 2 ). Se realizarmos esse cálculo em x = 711170237403706 e y= 111723603700633 , obteremos o resultado 238363505302130098723162537059 conforme necessário .
Pretendia-se que nenhuma outra entrada desse o resultado desejado porque:
A entrada deve ser escolhida de forma que y( 3 x - 1 ) - 2 = 238363505302130098723162537059 , ou seja, y( 3 x - 1 ) = 238363505302130098723162537061 (adicionando 2 aos dois lados). Esse número é um semiprime, com apenas dois fatores: 111723603700633 e 2133510712211117 . Somente um desses números, 2133510712211117 , pode ser expresso na forma 3 x - 1 (dando ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Portanto, podemos identificar exclusivamente qual número éx e qual éy , o que significa que apenas uma entrada funciona.
No entanto, dependendo de como você interpreta a pergunta, pode haver uma segunda entrada que produz a saída desejada (invalidando assim esta solução):
Infelizmente, existem duas partições multiplicativas de um semiprime em dois fatores: um é dividi-lo nos dois fatores primos, mas o outro é a partição trivial que consiste em 1 1 e no próprio número. 1 1 não pode ser escrito no formato 3 x - 1 com o número inteiro x , mas a saída desejada pode ser; portanto, um meta-crack potencial envolve fornecer a entrada como 79454501767376699574387512354 e 1 1 . No entanto, o primeiro número aqui envolve caracteres ( 8 e 9) que não estão no conjunto de caracteres para 7 programas. Portanto, se a entrada estiver restrita a estar no mesmo conjunto de caracteres que o programa, esta solução será válida; mas se a entrada contendo caracteres de fora do conjunto de caracteres do programa for permitida, esta solução será inválida.
Explicação
Veja como a solução pretendida funciona:
711170237403706 111723603700633
7 7 7 Separadores de elementos de empilhamento
111 023 403706 111723603700633 Elementos iniciais da pilha
111 Número 3, em unário
023 DSL de E / S para "insira um número"
403706 111723603700633 Programa principal
(Implícito: execute uma cópia do elemento principal do programa, preservando o original)
40 Troque {023} acima de {program}, escapando-o
3 Faça E / S usando {023}; pop {programa}
0 E / S: numérico
23 Digite um número, copiando {111} várias vezes
706 Anexe "6" ao número (diminuindo-o)
11 Empurre dois elementos da pilha vazia
17236 Empurre um elemento de pilha "23" (sem escape)
0 Escape {23}, consumindo um elemento vazio
3 Faça E / S usando {23}; pop {o elemento abaixo}
23 Copie a parte superior da entrada da pilha várias vezes
7006 Anexar "66" (ou seja, subtrair 2)
3 Saída {como um número}
3 Saia do programa (devido à pilha baixa)
Os 7 principais e os 3 finais não são necessários para a funcionalidade do programa, eles estão lá apenas para obter os principais fatores de saída. Ajuda a seguir este programa se você entender o formato numérico; os números são armazenados em uma variante em que unária 1
e 7
aumentar o valor de 1, e 0
e 6
diminuir o valor de 1 (introduzindo, assim, 66
diminui o valor de 2, repetindo os multiplica Número lo, e assim por diante). As entradas são feitas repetindo um elemento da pilha (portanto, se o elemento da pilha for 12345
e a entrada for 3 , o novo elemento da pilha será 123451234512345 ).