Krucha Quine

30

Krucha Quine

Krucha quine to quine, która spełnia właściwość polegającą na tym, że każdy podciąg utworzony przez usunięcie pojedynczego znaku, gdy jest oceniany, powoduje błąd.

Na przykład. Jeśli twój program asdfjest quine, to aby był delikatny, następujące programy muszą zawierać błąd:

sdf
adf
asf
asd

Twój program (i wszystkie jego podciągi) musi być w pełni deterministyczny i musi być w tym samym języku. Program wchodzący w nieskończoną pętlę (czyli nie kończący się), nawet jeśli ostatecznie nie spowoduje błędu, jest uważany za „powodujący błąd” do celów tego wyzwania.

Obowiązują standardowe luki, w tym zwykłe ograniczenia quine (np. Brak możliwości odczytu własnego kodu źródłowego).

Na przykład print("foo")nie jest kruchy. Wszystkie te podciągi muszą zawierać błąd:

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

Te, które nie zawierają błędów, to:

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

Więc to nie jest kruche.

Ważna uwaga na temat quines

W drodze konsensusu każdy możliwy quine musi spełniać następujące warunki:

Musi istnieć możliwość zidentyfikowania części programu, która koduje inną część programu. („Różne”, co oznacza, że ​​dwie części pojawiają się w różnych pozycjach.)

Ponadto quine nie może uzyskać dostępu do własnego źródła, bezpośrednio lub pośrednio.

Przykład

Ponieważ uważam, że funkcja JavaScript # toString oznacza „odczytywanie własnego kodu źródłowego”, nie pozwalam na to. Gdybym jednak tego nie blokował, oto delikatna cytat w JavaScript:

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

Próbnik

Oto program, który na podstawie kodu źródłowego twojego programu generuje wszystkie programy, które muszą zawierać błędy.

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>

Conor O'Brien
źródło
Czy wolno mi HQ9 +?
Oliver Ni
1
@OliverNi No
Conor O'Brien
3
To zakłada założenia dotyczące funkcji językowych - nie we wszystkich językach występują „błędy”.
Mego
2
Pętle @Mego Infinite są również dozwolone zamiast błędów. Każdy kompletny język Turinga ma nieskończone pętle.
feersum
1
@Mego to nie ma znaczenia. Po co w ogóle zajmować się ogólnym przypadkiem, skoro tylko problem ma ograniczony zakres?
Conor O'Brien

Odpowiedzi:

6

Burleska ,32 28 25 bajtów

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

Wypróbuj tutaj.

Tak więc większość instrukcji w Burlesce składa się z 2 znaków. O wiele łatwiej jest napisać quine po burlesku niż w Marbelous. Je!lub ^^e!oznacza _~w CJam.

jimmy23013
źródło
1
Poczekaj ... jeśli to nie jest gra w golfa (i jest tu zdecydowanie najkrótszy), to nie wyobrażam sobie, co to jest gra w golfa! +1
Daniel
@Dopapp Problem polega na tym, że Burleska ma zbyt wiele instrukcji, więc jest bardzo prawdopodobne, że coś przeoczyłem.
jimmy23013
11

Python 3, 45 bajtów

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

Przejście na Python 3, aby można było łatwo usunąć końcowy znak nowej linii.

Zacząłem od głupiej struktury, która miała 2 zmienne zamiast 1, ale przejście na 1 zmienną tylko skróciło ją o 4 bajty.

- (4 + 3) bajty Dennisa.

feersum
źródło
nie wiedziałem o asercji. Dobra robota
Destructible Lemon
2
Byłoby wspaniale, jeśli dodasz wyjaśnienie.
Sarge Barszcz
Łącząc twoją execstrukturę z moją %sztuczką, jest tam c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 bajtów.
Dennis,
1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)oszczędza jeszcze 3 bajty.
Dennis,
7

Python, 91/92 67 bajtów

To była zabawa!

Teraz wiem o asercie:

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

Jeśli znak z ciągu zostanie usunięty, sprawdź błąd. Zapewniłbym to wcześniej, gdybym wiedział o tej funkcji, twierdzę.

Zniszczalna cytryna
źródło
2
Zapomniałem o końcowym pytaniu nowego wiersza ... jeśli je policzysz, nasze odpowiedzi są nieprawidłowe, ponieważ można je bezpiecznie usunąć.
feersum
7

Python 2, 51 50 46 bajtów

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

Sprawdź to na Ideone .

Dennis
źródło
Quiny funkcyjne są rzeczywiście dozwolone.
Conor O'Brien
1
Co? Nigdy nie słyszałem o tym, że funkcje są dozwolone jako quines ... czy są na to jakieś przykłady?
feersum
@feersum Zapytanie quiz javascript daje kilka wyników.
Dennis,
@feersum standardowy quine Mathematica jest również oparty na funkcjach (przy użyciu #0).
Martin Ender
2
Właśnie miałem inny wygląd i większość quinów JS lub Mathematica faktycznie wywołuje tę funkcję. Bardziej właściwe byłoby nazywanie ich quinesami REPL. To powiedziawszy, przykład podany przez Conora w specyfikacji tego wyzwania jest tylko funkcją, więc myślę, że przynajmniej jest tutaj poprawny.
Martin Ender
4

C #, 145 bajtów

_=>{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,'"');};

Nie pisałem wcześniej w C #, ale wyższe wyniki są lepsze w golfie, prawda? :)

Nieskończona pętla, jeśli znak zostanie usunięty z łańcucha lub cyfry z magicznej stałej 79. Usunięcie dowolnego innego znaku powoduje błąd kompilacji.

Nie golfowany:

/* 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,'"');
};
mleko
źródło
3

JavaScript, 90 bajtów

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

Działa w konsoli Firefox 48 i powinien działać w każdym innym środowisku z unevali console.log. Podział błędów:

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.
ETHprodukcje
źródło
Wow, nie wiedziałem o nierównomierności. Poza tym miło cię widzieć przynajmniej trochę z powrotem! : D
Conor O'Brien
@ ConorO'Brien Miło być (przynajmniej nieco) z powrotem! I zostały zaksięgowane a para więcej Quine-y odpowiedzi przy użyciu tej techniki.
ETHprodukcje
2

Python 2, 59 bajtów

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

Powoduje to wyrzucenie a, ZeroDivisionErrorjeśli 0, 3 lub znak zostanie usunięty z łańcucha. Usunięcie innej postaci powoduje, że a NameErrorlub a SyntaxError.

Daniel
źródło
2

Grusza , 50 bajtów

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

Wypróbuj online!

Nie najkrótsza odpowiedź, ale dość wyczerpująca; każde usunięcie znaku z tego programu powoduje, że suma kontrolna nie powiedzie się, dlatego interpreter drzewa gruszy nawet nie będzie próbował go uruchomić. (Na przykład, jeśli usuniesz końcowy znak nowej linii, pojawi się błąd.) ;#f+QF>Służy do zapewnienia, że ​​program jako całość ma CRC-32 równą 0 (i f+QF>jest jednym z trzech możliwych 5-bajtowych ciągów znaków, które można umieścić w komentarz do osiągnięcia tego podczas pozostawania w ASCII; użycie ASCII jest tutaj ważne, ponieważ w przeciwnym reprrazie nie zadziałałoby poprawnie w obie strony).


źródło