Esse é um desafio do código-golfe, no qual você precisa criar um programa que atue como uma solução ou uma solução que se modifique para ilustrar o aprendizado de máquina.
fundo
Existe um programa básico de inteligência artificial chamado 'o jogo dos pangolins' descrito aqui . As idéias básicas são que o programa, quando executado pela primeira vez, pergunta:
OK, por favor, pense em algo
É um pangolim?
Você pode então responder:
sim
Nesse caso, diz:
Boa. Isso foi muuuuito fácil.
Ou, se não, diz:
Oh Bem, você venceu então - No que estava pensando?
Para o qual você pode dizer:
um cachorro
Para o que diria
Por favor, faça uma pergunta sobre um cachorro, para que eu possa dizer a diferença entre um cachorro e um pangolim
você pode responder
Come formigas?
Em seguida, perguntaria:
Qual é a resposta para um cachorro?
Para o qual você diria
não
E diria
obrigado
Da próxima vez que for executado, ele fará a pergunta acima e criará uma árvore binária de tais perguntas.
O desafio
Chega de plano de fundo. Esse desafio é escrever um programa de pangolins auto-modificável. As regras são as seguintes:
A saída do programa (como descrito acima) deve ser para
STDERR
. A resposta final sempre será "Bom. Isso foi muuuuito fácil". ou "obrigado". Depois disso, ele deve gerar a versão atual do programa ou uma nova versão do programa que incorpora a perguntaSTDOUT
. Nenhuma resposta escrita em um idioma que não suporte a escrita paraSTDOUT
e /STDERR
ou leituraSTDIN
será válida.Em outras palavras, no UNIX, você poderia invocar o programa assim:
exemplo:
$ mylanguage myprogram > myprogram.1
[dialog goes here]
$ mylanguage myprogram1 > myprogram.2
[dialog goes here]
- O programa precisa usar exatamente os prompts especificados (porque encurtá-los não mostra nenhuma habilidade). Os prompts são (sem as aspas e onde% s é substituído) da seguinte maneira:
Lista:
"OK, please think of something"
"Is it %s?"
"Good. That was soooo easy."
"Oh. Well you win then -- What were you thinking of?"
"Please give me a question about %s, so I can tell the difference between %s and %s"
"What is the answer for %s?"
"Thanks"
Quando esperando respostas sim / não, seu programa deve aceitar
y
ouyes
em qualquer caso, 'sim', en
ouno
em qualquer caso, para 'não'. O que você faz com entradas não conformes é com você. Por exemplo, você pode optar por receber qualquer resposta que comece comy
ouY
como 'sim' e qualquer outra coisa como não.Você pode assumir que os nomes dos itens fornecidos e as perguntas consistem apenas em letras ASCII, números, espaços, hífens, pontos de interrogação, vírgulas, pontos finais, dois pontos e ponto e vírgula, ou seja, eles correspondem ao regex seguinte
^[-?,.;: a-zA-Z]+$
. Se você pode lidar com mais do que isso (especialmente os caracteres citados no idioma escolhido), pode ser convencido, mas não ganha pontos extras.Seu programa não pode ler ou escrever qualquer arquivo (excluindo
STDIN
,STDOUT
eSTDERR
), ou a partir da rede; especificamente, ele não pode ler nem escrever seu próprio código do disco. Seu estado deve ser salvo no próprio código do programa.Quando o programa é executado e adivinha a resposta corretamente, ele deve funcionar exatamente como um quine, ou seja, deve escrever
STDOUT
exatamente no seu próprio código, inalterado.Quando o programa é executado e adivinha a resposta incorretamente, ele deve codificar a nova pergunta fornecida e responder dentro de seu próprio código e gravá-la
STDOUT
em seu próprio código, para que seja capaz de distinguir entre sua suposição original e o novo objeto fornecido, em além de distinguir entre todos os objetos fornecidos anteriormente.Você deve ser capaz de lidar com várias execuções seqüenciais do software para que ele aprenda sobre muitos objetos. Veja aqui exemplos de várias execuções.
As execuções de teste são fornecidas no link na cabeça (obviamente, cobrindo apenas as caixas de diálogo
STDIN
eSTDERR
).As brechas padrão são excluídas.