Meta quine denetleyicisi


10

Bu zorluk, kabul ederseniz, üç işlev veya A, B ve C programı yazmaktır:

  • A, A, B ve C'nin tümünü (aynı zamanda gönderiminizdeki kodun tüm içeriği) çıkaran bir kestir.
  • B bir parametre F alır ve böyle bir kine (FBC çıktısı) veya farklı bir şey yapıp yapmadığını kontrol eder.
  • C parametresi G'yi alır ve G'nin muhtemelen B gibi çalışıp çalışmadığını kontrol eder (F'nin FGC çıkışı olup olmadığını kontrol eder). Bir işlevin bir quine denetleyicisi olup olmadığına karar vermek imkansızdır, bu yüzden daha basit bir şey yapalım:
    • G B için geçerliyse doğrulukla dönmelidir.
    • G tüm geçerli satırlar için falsey döndürürse veya G tüm geçerli olmayan satırlar için doğrulukla dönerse falsey döndürmelidir.
    • Diğer durumlardan herhangi biri ise, herhangi bir şeyi döndürebilir, çökebilir veya sonlandırmayabilir vb.

B'nin mümkün olduğunu unutmayın. A ve F'nin herhangi bir girişi yoktur, bu nedenle bunları çalıştırabilir ve sonucu kontrol edebilirsiniz.

kurallar

  • A'nın çıkışından hangi parçaların A, B ve C olduğunu söylemenin bir yolu olmalıdır. Örneğin: her birinin bir satırı vardır veya yorumlayıcıda üç işlev olarak tanınırlar.
  • Her fonksiyon kodunuzun tamamı ile değil, sadece kendi tanımıyla çalışmalıdır.
  • Bir işlevi / programı veya kaynak kodunu veya B (veya G) ve C'nin girişi olarak ikisini birden kullanabilirsiniz.
  • Doğruluk / tahlili bu değerlerin bir alt kümesine yeniden tanımlayabilirsiniz . Ayrıca, tek bir dize gibi seçtiğiniz bir türün F döndürmesini de sürekli olarak isteyebilirsiniz.
  • Geçerli parametrelerle çağrılırlarsa, A, B, F ve G'ye gereksinim duyabilirsiniz, sürekli olarak, küresel değişkenlere erişmek veya stdin okumak gibi seçtiğiniz başka tür girişlere veya yan etkilere sahip değildir.
  • Ayrıca geçerli parametrelerle çağrılırsa, F ve G'yi daima sonlandırabilirsiniz.
  • F, A ile aynı durumda çalışmalıdır. Bu nedenle, bu değişken, çıktısında kendi kısmında tanımlanmadığı sürece, B veya C veya başka bir değişkenin varlığına bağlı olamaz.
  • Hiçbir işlev veya program kendi kaynak kodunu okuyamaz.
  • Bu kod golf, en kısa kod (A'nın çıktısıdır) bayt kazanır.

B genel olarak hala imkansızdır, çünkü F, birçok dilde ve pratikte sonlandırılmayabilir, çünkü stdout'un geçici olarak yeniden yönlendirilmesi ve işlevden dizeye veya exec gibi yetenek kombinasyonları gerektirir. Umabileceğiniz en iyi şey muhtemelen bir LISP'de yarı çalışan bir çözümdür.
Peter Taylor

G'yi tüm tırnaklarla ve tırnak olmayanlarla nasıl kontrol edersiniz? Şu anda bir Mathematica çözümü üzerinde çalışıyorum.
LegionMammal978

@PeterTaylor "Geçerli parametrelerle çağrılırsa, F ve G'yi de daima sonlandırabilirsiniz." Ve "çıktı" dönüş anlamına gelebilir, stdout'a yazdırmak gerekmez.
jimmy23013

@ LegionMammal978 Tüm tırnak ve tırnak olmayanları kontrol etmek imkansız . Ancak C'nin görevi daha basit bir şeydir, burada sadece bir quine ve bir quine olmayanı kontrol etmeniz gerekir.
jimmy23013

1
@PyRulez Bence bu meydan okuma ruhu içinde, bu yüzden izin vereceğim. Ancak işlev kendi kaynak koduna erişemez.
jimmy23013

Yanıtlar:


1

CJam, 254 bayt

Örnek bir cevap, golf değil.

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

3 işlev şunlardır:

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

A ve F parametreleri almaz ve bir dize döndürür. B, G ve C bir CJam bloğunu parametre olarak alır ve doğruluk için 1 veya falsey için 0 döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.