Sprawdzanie meta quine

10

Wyzwaniem, jeśli je zaakceptujesz, jest napisanie trzech funkcji lub programów A, B i C:

  • A jest quine, która wyprowadza wszystkie A, B i C (co jest również całą zawartością kodu w twoim zgłoszeniu).
  • B bierze parametr F i sprawdza, czy jest to taki quine (wyjście FBC), czy robi coś innego.
  • C przyjmuje parametr G i sprawdza, czy G prawdopodobnie działa jak B (sprawdzanie, czy F generuje FGC). Nie można zdecydować, czy funkcja jest narzędziem sprawdzającym quine, więc zróbmy coś prostszego:
    • Musi zwrócić prawdę, jeśli G jest ważne dla B.
    • Musi zwrócić falsey, jeśli G zwróci falsey dla wszystkich ważnych quines lub G zwróci prawdę dla wszystkich ważnych non-quines.
    • Może zwrócić cokolwiek, ulec awarii lub nie zostać zakończone itp., Jeśli jest to jeden z pozostałych przypadków.

Zauważ, że B jest możliwe. A i F nie mają żadnych danych wejściowych, więc możesz je po prostu uruchomić i sprawdzić wynik.

Zasady

  • Powinien być jakiś sposób na określenie, które części to A, B i C z wyjścia A. Na przykład: każda z nich ma jedną linię lub są rozpoznawane jako trzy funkcje interpretera.
  • Każda funkcja powinna działać tylko z definicją samego siebie, a nie pełnego kodu.
  • Możesz użyć funkcji / programu lub jego kodu źródłowego lub pary obu jako danych wejściowych B (lub G) i C.
  • Możesz ponownie zdefiniować wartość true / falsey do podzbioru tych wartości. Możesz również konsekwentnie wymagać, aby F zwrócił wybrany typ, na przykład pojedynczy ciąg.
  • Możesz wymagać A, B, F i G, jeśli są wywoływane z prawidłowymi parametrami, konsekwentnie nie mają niektórych rodzajów innych danych wejściowych lub efektów ubocznych, które wybierzesz, takich jak dostęp do zmiennych globalnych lub odczyt stdin itp.
  • Możesz również założyć F i G, jeśli są wywoływane z prawidłowymi parametrami, zawsze zakończ.
  • F powinien działać w takich samych warunkach jak A. Zatem nie może zależeć od istnienia B, C lub innej zmiennej, chyba że zmienna ta jest zdefiniowana we własnej części w wyniku.
  • Żadne funkcje ani programy nie mogą odczytać własnego kodu źródłowego.
  • Jest to kod-golf, wygrywa najkrótszy kod (który jest wynikiem A) w bajtach.
jimmy23013
źródło
B jest nadal ogólnie niemożliwe, ponieważ F może się nie kończyć, a także w praktyce w wielu językach, ponieważ wymaga kombinacji zdolności, takich jak tymczasowe przekierowanie standardowego wyjścia i funkcji na ciąg znaków lub exec. Najlepsze, na co możesz liczyć, to prawdopodobnie pół działające rozwiązanie w LISP.
Peter Taylor
Jak byś sprawdził G ze wszystkimi pinami i quinami? Obecnie pracuję nad rozwiązaniem Mathematica.
LegionMammal978 16.04.15
@PeterTaylor „Możesz również założyć F i G, jeśli są wywoływane z prawidłowymi parametrami, zawsze zakończ.” A „wynik” może oznaczać zwrot, niekoniecznie drukowanie na standardowe wyjście.
jimmy23013
@ LegionMammal978 Nie można sprawdzić wszystkich quines i non-quines. Ale zadanie C jest czymś prostszym, w którym wystarczy sprawdzić tylko jeden quine i jeden non-quine.
jimmy23013
1
@PyRulez Myślę, że jest to w duchu tego wyzwania, więc pozwolę na to. Ale funkcja nie może uzyskać dostępu do własnego kodu źródłowego.
jimmy23013 18.04.15

Odpowiedzi:

1

CJam, 254 bajty

Przykładowa odpowiedź, nie golfa.

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

3 funkcje to:

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

A i F nie przyjmują parametrów i zwracają ciąg. B, G i C przyjmują blok CJam jako parametr i zwracają 1 dla prawdy lub 0 dla falsey.

jimmy23013
źródło