Kırılgan bir Quine


30

Kırılgan bir Quine

Kırılgan bir yüzgeç, değerlendirildiğinde, tek bir karakter çıkarılarak yapılan her alt dizgiye sahip olma özelliğini sağlayan bir yüzgeç, bir hata üretmektedir.

Örneğin. Programınız asdfbir quine ise, kırılgan olması için aşağıdaki programlar hata yapmalıdır:

sdf
adf
asf
asd

Programınız (ve alt dizgilerinin tümü) tamamen belirleyici olmalı ve aynı dilde olmalıdır. Sonunda bir hata üretmese bile, sonsuz bir döngüye düşen bir programın (sonlandırılamayan), bu zorluğun amaçları doğrultusunda "hata ürettiği" kabul edilir.

Normal boşluk kısıtlamaları dahil standart boşluklar uygulanır (örneğin, kendi kaynak kodunu okuyamaz).

Örneğin, print("foo")kırılgan değildir. Tüm bu alt diziler hata yapmalı:

rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"

Hata yapmayanlar:

print("oo")
print("fo")
print("fo")

Yani kırılgan değil.

Kısalar hakkında önemli bir not

Mutabakata göre , olası herhangi bir quine bunu sağlamalıdır:

Programın, programın farklı bir bölümünü kodlayan bir bölümünü tanımlamak mümkün olmalıdır. ("Farklı", iki parçanın farklı konumlarda göründüğü anlamına gelir.)

Ayrıca, bir yüzgeç doğrudan veya dolaylı olarak kendi kaynağına erişmemelidir.

Örnek

JavaScript'in # toString işlevinin "kendi kaynak kodunu okuduğunu" düşündüğüm için, buna izin vermiyorum. Ancak, eğer engellememem gerekiyorsa, işte JavaScript'te kırılgan bir kıskaç:

f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q

test cihazı

İşte, programınızın kaynak kodu verildiğinde, hata yapması gereken tüm programları üreten bir program.

let f = (s) =>
  [...Array(s.length).keys()].map(i =>
    s.slice(0, i) + s.slice(i + 1)).join("\n");

let update = () => {
  output.innerHTML = "";
  output.appendChild(document.createTextNode(f(input.value)));
};

input.addEventListener("change", update);

update();
#output {
  white-space: pre;
}

#input, #output {
  font-family: Consolas, monospace;
}
<input id="input" value="print('foo')">
<div id="output"></div>


HQ9 + 'a izin veriliyor mu?
Oliver Ni

1
@OliverNi No
Conor O'Brien

3
Bu, dil özellikleri hakkında varsayımlarda bulunur - tüm dillerin "hataları" yoktur.
Mego

2
@Mego Sonsuz döngüler de hata yerine izin verilir. Her Turing tamamlanmış dilde sonsuz döngüler vardır.
feersum

1
@Mego bu konu dışı. Sorun başına yalnızca sonlu bir alt küme uygulanırsa neden genel vakayı gündeme getirmeye bile zahmet ettin?
Conor O'Brien,

Yanıtlar:


6

Burlesque ,32 28 25 bayt

{3SHWD{Je!}.+{Sh}\msh}Je!

Burada dene.

Yani Burlesque'deki talimatların çoğu 2 karakterdir. Burlesque'de yazı yazmak Marbelous'tan çok daha kolaydır. Je!ya da ^^e!aracı _~CJam içinde.


1
Bekle ... eğer bu golf oynamayan değilse (ve buradaki en kısa sürede), o zaman golfün ne olduğunu hayal bile edemiyorum! +1
Daniel

@Dopapp Sorun şu ki Burlesque'in çok fazla talimatı var, bu yüzden bir şeyleri kaçırdım.
jimmy23013

11

Python 3, 45 bayt

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

Python 3'e geçiş yaparak takip eden yeni satır kolayca kaldırılabilir.

1 yerine 2 değişken olan aptal bir yapıyla başladım, ancak 1 değişkeni değiştirmek sadece 4 byte kısalttı.

- Dennis (4 + 3) bayt.


assert hakkında bilmiyordum. İyi iş
Yıkılabilir Limon

2
Bir açıklama eklerseniz çok iyi olur.
Sarge Borsch

Senin birleştiren execbenim ile yapı %hile, orada c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 byte için.
Dennis,

1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)3 bayt daha kaydeder.
Dennis,

7

Python, 91/92 67 bayt

Bu komikti!

Şimdi ben assert hakkında biliyorum:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

Dizeden bir char kaldırılırsa, hata onayla. Bunu daha önce biliyordum, bu özelliği biliyor olsaydım, assert.


2
Sondaki yeni soru sorusunu unuttum ... eğer sayarsanız, cevaplarımız geçersiz olduğundan güvenle kaldırılabiliyor.
feersum

7

Python 2, 51 50 46 bayt

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

İdeone üzerinde doğrulayın .


İşlev sorgularına gerçekten izin verilir.
Conor O'Brien,

1
Ha? Hiç işlev olarak sicim olarak izin verildiğini duymadım ... bunun için herhangi bir örnek var mı?
feersum

@feersum javascript quine sorgusu birkaç sonuç verir.
Dennis,

@ feersum standart Mathematica quine ayrıca fonksiyona dayalıdır (kullanarak #0).
Martin Ender

2
Daha yeni baktım ve çoğu JS veya Mathematica sınavı aslında fonksiyonu da çağırıyor. Bu yüzden onlara REPL sınavlarını aramak daha doğru olur. Bununla birlikte, Conor tarafından bu zorluğun niteliğinde verilen örnek sadece bir işlevdir, bu yüzden en azından burada geçerli olduğunu düşünüyorum.
Martin Ender

4

C #, 145 bayt

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

Daha önce C # ile bir yazı yazmamıştım, ancak daha yüksek skorlar golf için daha iyi, değil mi? :)

Bir karakter dizgeden çıkarılırsa sonsuz döngü veya sihirli const 79'dan bir basamak çıkar. Diğer karakterlerin kaldırılması derleme hatasıyla sonuçlanır.

Ungolfed:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};

3

JavaScript, 90 bayt

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Firefox 48 konsolunda çalışır unevalve ve ile başka bir ortamda çalışmalıdır console.log. Hataların dağılımı:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.

Vay, uneval hakkında bilmiyordum. Ayrıca, sizi en azından biraz geriye görmek güzel! : D
Conor O'Brien

@ ConorO'Brien (en azından biraz) geri olmak güzel! Ben gönderdiniz çift daha quine-y cevapları bu teknik kullanılarak.
ETHproductions

2

Python 2, 59 bayt

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

Bu ZeroDivisionError, bir 0, 3 veya bir karakter dizeden çıkarılırsa atar . Farklı bir karakterin kaldırılması a NameErrorveya a ile sonuçlanır SyntaxError.


2

Bir Armut Ağacı , 50 bayt

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

Çevrimiçi deneyin!

En kısa cevap değil, oldukça kapsamlı bir cevap; Bu programdan herhangi bir karakter silinmesi sağlama toplamının başarısız olmasına neden olur, böylece A Armut Ağacı tercümanı çalıştırmayı denemez. (Örneğin, izleyen yeni satırı silerseniz bir hata alırsınız.) ;#f+QF>Programın bir bütün olarak CRC-32/0 olmasını sağlamak için kullanılır (ve f+QF>yerleştirilebilecek üç olası 5 bayt dizisinden biridir. Bunu ASCII’de kalırken elde etmek için yorum yapma, ASCII’yi kullanmak burada önemlidir çünkü repraksi halde doğru bir şekilde dolamayız.

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.