Observe: por sua natureza, as especificações para este desafio são difíceis de entender. Provavelmente requer pelo menos um curso de calouro em teoria da computabilidade ou leitura equivalente em segundo plano. Além disso, o desafio em si é bastante difícil. Para respondê-lo, será necessário escrever um intérprete inteiro para algum subconjunto do seu idioma de escolha, e não apenas isso, mas o intérprete terá que estar na forma de algo como um quine. Se sua resposta não estiver fazendo tudo isso, é quase certo que não atenda às especificações.
Você não precisa resolver o problema da parada (mesmo que parcialmente) para resolver esse desafio. No entanto, você quase certamente fazer necessidade de escrever um intérprete (do idioma que você está usando, escrito na mesma língua que interpreta), embora ele não precisa ser completo de recursos. É isso que faz deste um desafio interessante.
Prometi conceder uma recompensa de 500 pontos à primeira resposta que atenda às especificações, e isso será concedido à resposta BF de Jo King .
O desafio
Uma versão aproximada e simplificada da prova de Alan Turing da insolubilidade do problema da parada é mais ou menos assim:
Suponha que eu escrevi um programa F
que visa solucionar o programa de interrupção. Ou seja, F
usa o código fonte de outro programa como entrada e F(G)
deve retornar 1
se for G
interrompido ou 0
não.
Mas se eu lhe der meu programa F
, você poderá construir outro programa H
, que executa o meu programa H
como entrada. Se F(H)
retorna, 0
então H
retorna 0
, mas, caso contrário, deliberadamente entra em um loop infinito. Isso leva a um paradoxo, e temos que concluir que, F
afinal, não podemos resolver o problema da parada.
Sua tarefa é escrever o programa H
, mas com uma reviravolta: não vou lhe dar meu programa. Em vez disso, seu programa receberá o código-fonte do meu programa como uma entrada. Isso é:
Seu programa receberá meu programa como uma entrada, no formato de código-fonte. (Por exemplo, como um arquivo ou como entrada da linha de comando, os detalhes são com você.)
Meu programa será escrito no mesmo idioma do seu programa e também recebe entradas na forma de uma sequência de código-fonte.
Se meu programa retorna
0
quando dado o seu programa como entrada, seu programa deve parar (e regresso0
) quando dado o meu programa como entrada. (O significado exato de "returing0
" é com você.)Se meu programa não parar, ou se ele retorna outra coisa senão
0
quando dado o seu programa como entrada, seu programa deve continuar funcionando indefinidamente.
A desvantagem é que, só para tornar as coisas muito mais difíceis, você deve obedecer às seguintes regras:
Você não pode usar nenhum tipo de função interna
exec
ou deeval
tipo.Você não pode usar nenhum método de "trapaça" para obter o código-fonte do seu próprio programa. (Por exemplo, você não pode dizer "salve isso em um arquivo chamado 'programa'" e, em seguida, coloque-o
open(program)
em seu programa.)
Isso significa que seu programa deve ser algum tipo de superquino louco que não apenas pode reproduzir seu próprio código-fonte na forma de uma string, mas também é capaz de analisar e interpretar corretamente o idioma em que está escrito.
Para torná-lo um pouco menos insanamente difícil, você pode usar apenas um subconjunto (completo de Turing) do idioma escolhido. Portanto, se o seu programa for escrito em Python e só funcionará se o meu programa contiver apenas if
s e while
loops e operações básicas de string, tudo bem se o seu programa também usar essas coisas também. (Isso significa que você não precisa se preocupar em implementar toda a biblioteca padrão do idioma escolhido!) No entanto, seu programa precisa ser executado de verdade - você não pode simplesmente criar seu próprio idioma.
Este é um concurso de popularidade , então a resposta com mais votos vence. No entanto, como mencionado acima, é um sério desafio apenas atender às especificações, portanto atribuirei uma recompensa de 500 pontos à primeira resposta que fizer isso de acordo com meu julgamento.
observe: sem dúvida, existem muitas maneiras de "enganar" esse desafio, dada a redação exata que eu usei. No entanto, estou realmente esperando por respostas que entrem no espírito da pergunta. O desafio pretendido é muito difícil, mas possível, e espero realmente encontrar soluções genuínas. Não concederei a recompensa a uma resposta que pareça barata no meu julgamento.
Nota: este desafio foi originalmente publicado como concurso de popularidade , mas foi encerrado em 2016 por não ter um "critério de vitória objetivo", e eu o mudei para code-golf para reabrir. No entanto, descobri que, a partir de janeiro de 2018, os concursos de popularidade não são de fato proibidos no PPCG (com essa é a meta-discussão mais recente), portanto, fechá-lo em primeiro lugar foi contra a política do site. Entendo que os popcons não são populares atualmente, mas esse é um desafio antigo e sua natureza o torna realmente inadequado para o código-golfeSistema de pontuação. Se alguém ainda acha que isso não deveria ser permitido, vamos ter uma meta-discussão antes de começar a votação. Finalmente, com a chance de alguém passar o último ano tentando jogar com sua solução, tenha certeza de que será tão competitivo nesse desafio e tão merecedor da recompensa, como teria sido no código-golfe versão.
fonte
F
um arquivo eimport
inseri-lo? ; 3Respostas:
brainfuck ,
601348774376 bytesEditar: -1136 bytes. Mudou para uma maneira melhor de gerar os dados para o quine
Edit2: -501 bytes. Revisitei meu auto-intérprete e reduzi-o algumas centenas de bytes
Experimente online! A entrada aqui é um programa simples (
,[.,]
) que imprime o programa em si."Retorno 0" é definido finalizando o programa em uma célula com o valor 0.
Uma combinação profana de dois programas que escrevi no passado, um quine e um auto-intérprete. A primeira seção é a parte quine, que pega os dados e preenche a fita com a geração de dados seguida pelo código fonte. A seguir, é o auto-intérprete, que pega seu programa e o executa. Essa é praticamente uma cópia inalterada de um auto-intérprete normal, exceto que, em vez de receber diretamente a entrada, ela recebe entrada desde o início da seção de dados, configurando a célula para 0 se não houver mais entrada. Finalmente, termine na célula atual do seu programa e execute
[]
. Se o valor retornado for 0, meu programa terminará em zero. Se houver qualquer outra coisa, ele executará um loop infinito. Se seu programa for executado para sempre,meu programa será executado para sempre.Como funciona:
Parte 1: Geração de Dados
Esta parte compõe a seção de dados do quine e é de longe a maioria do código em 3270 bytes. O início
-
é um marcador para o início dos dados. Cada>+++
um representa um caractere do código após esta seção.Parte 2: Gere a seção de dados usando os dados
Isso usa os dados da parte um para adicionar os caracteres usados para gerar os dados na seção de código. Ele adiciona um
>
ao final da seção de código e o valor dessa célula muitas vantagens.Parte 3: Gere o restante do código usando os dados
Destrói a seção de dados e adiciona o restante do código-fonte à seção de código
Parte 4: Obter programa inserido
Obtém o programa inserido. Remove caracteres que não fazem cérebro e representam cada caractere com um número:
Representa o final do programa com
255
.Parte 5: Interpretando a entrada
Interpreta o programa. A única diferença de uma normal é que a entrada é obtida desde o início da seção de código em vez da entrada.
Parte 6: Pare se o retorno não for 0
Navegue até a célula final do seu programa e execute um loop infinito se o retorno não for 0. Se for 0, saia do loop e termine no mesmo 0.
Entradas de teste:
Sempre retorna 0 (pára e retorna 0)
Sempre retorna 1 (executa para sempre)
Retorna todas as entradas adicionadas juntas, mod 256 (retorna 211, para que funcione para sempre)
Retorna 0 se os dois últimos caracteres de um código forem um loop infinito (
[]
) ( seu programa retornará 0 quando receber meu programa , portanto, meu programa será interrompido)Curiosidade para quem ainda está lendo
Se a entrada para este programa for o código fonte desse programa, ele começará a se repetir, criando repetidamente auto-intérpretes que executam esse programa e, em seguida, oferecem o mesmo programa novamente. Isso me dá algumas idéias interessantes sobre a criação de programas recursivos reais no cérebro. Em vez de verificar o valor de retorno e iniciar um loop infinito como nesta pergunta, o valor de retorno pode ser salvo e acionado. Um exemplo simples seria um programa fatorial que vai
Obviamente, essa é uma maneira completamente insana de codificar o cérebro, já que executar auto-intérpretes recorrentes aumentará exponencialmente o tempo de execução.
fonte
.
. Embora como essa não seja mais uma questão de código-golfe, o suporte a todo o idioma pode ser mais impressionante.