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 asdf
jest 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>
źródło
Odpowiedzi:
Burleska ,
322825 bajtówWypró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.źródło
Python 3, 45 bajtów
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.
źródło
exec
strukturę z moją%
sztuczką, jest tamc='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)
48 bajtów.c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)
oszczędza jeszcze 3 bajty.Python,
91/9267 bajtówTo była zabawa!
Teraz wiem o asercie:
Jeśli znak z ciągu zostanie usunięty, sprawdź błąd. Zapewniłbym to wcześniej, gdybym wiedział o tej funkcji, twierdzę.
źródło
Python 2,
515046 bajtówSprawdź to na Ideone .
źródło
#0
).C #, 145 bajtów
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:
źródło
JavaScript, 90 bajtów
Działa w konsoli Firefox 48 i powinien działać w każdym innym środowisku z
uneval
iconsole.log
. Podział błędów:źródło
Python 2, 59 bajtów
Powoduje to wyrzucenie a,
ZeroDivisionError
jeśli 0, 3 lub znak zostanie usunięty z łańcucha. Usunięcie innej postaci powoduje, że aNameError
lub aSyntaxError
.źródło
Grusza , 50 bajtów
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 (if+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 przeciwnymrepr
razie nie zadziałałoby poprawnie w obie strony).źródło