Một câu chuyện mong manh
Một quine mong manh là một quine thỏa mãn tính chất của mỗi chuỗi con được tạo bằng cách loại bỏ một ký tự đơn, khi được đánh giá, tạo ra một lỗi.
Ví dụ. Nếu chương trình của bạn asdf
là một quine, thì để nó dễ vỡ, các chương trình sau phải báo lỗi:
sdf
adf
asf
asd
Chương trình của bạn (và tất cả các chuỗi con của nó) phải hoàn toàn xác định và phải ở cùng một ngôn ngữ. Một chương trình rơi vào một vòng lặp vô hạn (nghĩa là không kết thúc), ngay cả khi cuối cùng không tạo ra lỗi được coi là "tạo ra lỗi" cho mục đích của thử thách này.
Các sơ hở tiêu chuẩn được áp dụng, bao gồm các hạn chế về quine thông thường (ví dụ: không thể đọc mã nguồn riêng).
Ví dụ, print("foo")
không dễ vỡ. Tất cả các chuỗi con phải lỗi:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Những cái không có lỗi là:
print("oo")
print("fo")
print("fo")
Vì vậy, nó không phải là mong manh.
Một lưu ý quan trọng về quines
Bằng sự đồng thuận , bất kỳ quine có thể phải đáp ứng điều này:
Phải có thể xác định một phần của chương trình mã hóa một phần khác của chương trình. ("Khác nhau" có nghĩa là hai phần xuất hiện ở các vị trí khác nhau.)
Hơn nữa, một quine không được truy cập vào nguồn của chính nó, trực tiếp hoặc gián tiếp.
Thí dụ
Vì tôi coi hàm # toString của JavaScript là "đọc mã nguồn của chính nó", tôi không đồng ý. Tuy nhiên, nếu tôi không cấm nó, thì đây là một câu hỏi dễ hiểu trong JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
Người kiểm tra
Đây là một chương trình, với mã nguồn của chương trình của bạn, tạo ra tất cả các chương trình phải báo lỗi.
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>