Esse desafio, se você o aceitar, é escrever três funções ou programas A, B e C:
- A é um quine que gera todos os A, B e C (que também é todo o conteúdo do código em sua submissão).
- B pega um parâmetro F e verifica se é um quine (emitindo FBC) ou se está fazendo algo diferente.
- C pega um parâmetro G e verifica se G possivelmente funciona como B (verificando se F gera FGC). É impossível decidir se uma função é um verificador quine, então vamos fazer algo mais simples:
- Ele deve retornar verdadeiramente se G é válido para B.
- Ele deve retornar falsey se G retornar falsey para todos os códigos válidos ou G retornar verdade para todos os códigos não válidos.
- Pode retornar qualquer coisa, travar ou não terminar, etc, se for um dos outros casos.
Observe que B é possível. A e F não possuem nenhuma entrada; portanto, você pode executá-las e verificar o resultado.
Regras
- Deve haver alguma maneira de saber quais partes são A, B e C da saída de A. Por exemplo: cada uma possui uma linha ou são reconhecidas como três funções no intérprete.
- Cada função deve ser executada apenas com a definição de si mesma, não com seu código completo.
- Você pode usar uma função / programa ou seu código-fonte ou um par de ambos como entrada de B (ou G) e C.
- Você pode redefinir truthy / falsey para um subconjunto desses valores. Você também pode exigir F constantemente retornando algum tipo que você escolher, como uma única sequência.
- Você pode solicitar A, B, F e G, se eles forem chamados com parâmetros válidos, consistentemente não terão alguns tipos de outras entradas ou efeitos colaterais que você escolher, como acessar variáveis globais ou ler stdin, etc.
- Você também pode assumir que F e G, se forem chamados com parâmetros válidos, sempre terminam.
- F deve funcionar na mesma condição que A. Portanto, não pode depender da existência de B ou C ou de outra variável, a menos que essa variável seja definida em sua própria parte em sua saída.
- Nenhuma função ou programa pode ler seu próprio código-fonte.
- Este é o código-golfe, o código mais curto (que é a saída de A) em bytes vence.
B ainda é impossível em geral porque F pode não terminar, assim como na prática em muitos idiomas, pois requer combinações de habilidades, como redirecionamento temporário de stdout e função-para-string ou exec. O melhor que você pode esperar é provavelmente uma solução de meio trabalho em um LISP.
—
Peter Taylor
Como você verificaria G com todas as propriedades e não propriedades? Atualmente, estou trabalhando em uma solução Mathematica.
—
precisa saber é o seguinte
@PeterTaylor "Você também pode assumir que F e G, se forem chamados com parâmetros válidos, sempre terminam." E "saída" pode significar retorno, não necessariamente imprimir em stdout.
—
precisa saber é o seguinte
@ LegionMammal978 É impossível verificar todos os códigos e não códigos. Mas a tarefa de C é algo mais simples, em que você só precisa verificar uma e outra não.
—
precisa saber é o seguinte
@PyRulez Acho que isso está no espírito desse desafio, então vou permitir. Mas a função não pode acessar seu próprio código-fonte.
—
precisa saber é o seguinte