Verificador de meta-quine


10

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

11
@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

Respostas:


1

CJam, 254 bytes

Um exemplo de resposta, não jogado.

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

As 3 funções são:

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}
{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}
{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

A e F não aceitam parâmetros e retornam uma string. B, G e C tomam um bloco CJam como parâmetro e retornam 1 para verdade ou 0 para falsey.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.