Meta quine检查器


10

如果接受的话,这个挑战就是编写三个函数或程序A,B和C:

  • A是输出所有A,B和C(这也是您提交的代码的全部内容)的方法。
  • B接受参数F并检查它是这样的奎因(输出FBC)还是做其他事情。
  • C接受参数G并检查G是否可能像B一样工作(检查F是否输出FGC)。不可能确定一个函数是否是quine检查器,所以让我们做一些简单的事情:
    • 如果G对于B有效,则必须返回true。
    • 如果G对所有有效的quines返回false,或者G对所有有效的非quines返回true,则必须返回false。
    • 如果是其他情况,它可以返回任何内容,崩溃或不终止等。

注意,B是可能的。A和F没有任何输入,因此您可以运行它们并检查结果。

规则

  • 应该有某种方法可以从A的输出中分辨出哪些部分是A,B和C。例如:每个部分只有一行,或者它们在解释器中被识别为三个功能。
  • 每个函数都应仅使用自身的定义运行,而不应使用完整的代码。
  • 您可以使用功能/程序或其源代码,或将两者都用作B(或G)和C的输入。
  • 您可以将真/假重新定义为这些值的子集。您还可以始终要求F返回您选择的某种类型,例如单个字符串。
  • 如果使用有效参数调用A,B,F和G,则始终不需要这些类型的其他输入或副作用,例如访问全局变量或读取stdin等。
  • 您也可以假设F和G(如果使用有效参数调用它们)总是终止。
  • F应该在与A相同的条件下工作。因此,它不能依赖于B或C或另一个变量的存在,除非该变量在其输出中自己定义。
  • 没有函数或程序可以读取其自己的源代码。
  • 这是代码高尔夫,以字节为单位的最短代码(它是A的输出)。

通常,B仍然是不可能的,因为F可能不会终止,在许多语言中实际上也是如此,因为它需要诸如stdout的临时重定向以及函数到字符串或exec之类的能力组合。您所希望的最好的解决方案可能是LISP中的半工作解决方案。
彼得·泰勒

您如何用所有藜和非藜检查G ?我目前正在研究Mathematica解决方案。
LegionMammal978

@PeterTaylor“您也可以假设F和G,如果使用有效参数调用它们,则始终终止。” “输出”可能意味着返回,而不必打印到标准输出。
jimmy23013 2015年

@ LegionMammal978无法检查所有奎因和非奎因。但是C的任务比较简单,您只需要检查一个quine和一个non-quine。
jimmy23013 2015年

1
@PyRulez我认为这是本挑战的精神,所以我将允许它。但是该函数无法访问自己的源代码。
jimmy23013 2015年

Answers:


1

CJam,254个字节

一个示例答案,而不是打高尔夫球。

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

这三个功能是:

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

A和F不带参数,并返回一个字符串。B,G和C将CJam块作为参数,并返回1(真)或0(假)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.