Một câu chuyện mong manh


30

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 asdflà 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>


Tôi có được phép HQ9 + không?
Oliver Ni

1
@OliverNi Không
Conor O'Brien

3
Đây là giả định về các tính năng ngôn ngữ - không phải tất cả các ngôn ngữ đều có "lỗi".
Mego

2
@Mego Vòng lặp vô hạn cũng được phép thay vì lỗi. Mỗi ngôn ngữ Turing-Complete có các vòng lặp vô hạn.
frageum

1
@Mego đó là không liên quan. Tại sao thậm chí bận tâm đưa ra trường hợp chung nếu chỉ áp dụng một tập hợp con hữu hạn cho mỗi vấn đề?
Conor O'Brien

Câu trả lời:


6

Burlesque ,32 28 25 byte

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

Hãy thử nó ở đây.

Vì vậy, hầu hết các hướng dẫn trong Burlesque là 2 ký tự. Và nó dễ dàng hơn nhiều để viết một câu chuyện trong Burlesque hơn là trong Marbelous. Je!hoặc ^^e!có nghĩa là _~trong CJam.


1
Đợi đã ... nếu đây không phải là golf (và là ngắn nhất ở đây), thì tôi không thể tưởng tượng được golf là gì! +1
Daniel

@Dopapp Vấn đề là Burlesque có quá nhiều hướng dẫn, vì vậy rất có khả năng tôi đã bỏ lỡ điều gì đó.
jimmy23013

11

Python 3, 45 byte

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

Chuyển sang Python 3 để có thể dễ dàng xóa dòng mới.

Tôi bắt đầu với một cấu trúc ngu ngốc có 2 biến thay vì 1, nhưng chuyển sang 1 biến chỉ làm cho nó ngắn hơn 4 byte.

- (4 + 3) byte bởi Dennis.


không biết về khẳng định. Công việc tốt
Lemon phá hủy

2
Sẽ là tuyệt vời nếu bạn thêm một lời giải thích.
Sange Borsch

Kết hợp execcấu trúc của bạn với %thủ thuật của tôi , có c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 byte.
Dennis

1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)tiết kiệm thêm 3 byte.
Dennis

7

Con trăn, 91/92 67 byte

Điều này thật thú vị!

Bây giờ tôi biết về khẳng định:

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

Nếu một char từ chuỗi bị loại bỏ, xác nhận lỗi. Tôi đã làm điều này sớm hơn nếu tôi biết về tính năng này, khẳng định.


2
Tôi quên mất câu hỏi về dòng mới ... nếu bạn đếm nó, thì câu trả lời của chúng tôi không hợp lệ vì nó có thể được gỡ bỏ một cách an toàn.
frageum

7

Python 2, 51 50 46 byte

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

Xác nhận nó trên Ideone .


Chức năng thực sự được cho phép.
Conor O'Brien

1
Huh? Tôi chưa bao giờ nghe nói về các chức năng được phép là hạn chế ... có ví dụ nào cho việc này không?
frageum

@feersum Truy vấn javascript truy vấn mang lại một vài kết quả.
Dennis

@feersum quine Mathicala tiêu chuẩn cũng dựa trên chức năng (sử dụng #0).
Martin Ender

2
Tôi chỉ có một cái nhìn khác và hầu hết các câu lệnh JS hoặc Mathicala thực sự cũng gọi hàm này. Vì vậy, sẽ đúng hơn nếu gọi chúng là quines REPL. Điều đó nói rằng, ví dụ được cung cấp bởi Conor trong thông số kỹ thuật của thử thách này chỉ là một chức năng, vì vậy tôi đoán ít nhất nó có giá trị ở đây.
Martin Ender

4

C #, 145 byte

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

Tôi chưa từng viết một câu hỏi trong C # trước đây, nhưng điểm số cao hơn sẽ tốt hơn trong golf, phải không? :)

Vòng lặp vô hạn nếu một char bị xóa khỏi chuỗi hoặc một chữ số từ ma thuật const 79. Loại bỏ bất kỳ kết quả char nào khác trong lỗi biên dịch.

Ung dung:

/* 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 byte

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

Hoạt động trong bảng điều khiển của Firefox 48 và sẽ hoạt động trong mọi môi trường khác với unevalconsole.log. Phân tích lỗi:

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.

Wow, không biết về uneval. Ngoài ra, rất vui được gặp bạn ít nhất là phần nào trở lại! : D
Conor O'Brien

@ ConorO'Brien Rất vui được trở lại (ít nhất là phần nào)! Tôi đã đăng tải một vài hơn Quine-y câu trả lời sử dụng kỹ thuật này.
Sản xuất ETH

2

Python 2, 59 byte

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

Điều này sẽ ném ZeroDivisionErrornếu 0, 3 hoặc ký tự được xóa khỏi chuỗi. Loại bỏ một ký tự khác nhau dẫn đến a NameErrorhoặc a SyntaxError.


2

Cây lê , 50 byte

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

Hãy thử trực tuyến!

Không phải là câu trả lời ngắn nhất, nhưng là một câu trả lời khá toàn diện; bất kỳ việc xóa ký tự nào khỏi chương trình này đều khiến chương trình không thể kiểm tra, do đó trình thông dịch A Pear Tree thậm chí sẽ không chạy nó. (Ví dụ: bạn gặp lỗi nếu xóa dòng mới theo dõi.) ;#f+QF>Được sử dụng để đảm bảo rằng toàn bộ chương trình có CRC-32 bằng 0 (và f+QF>là một trong ba chuỗi 5 byte có thể được đặt trong nhận xét để đạt được điều đó trong khi ở lại ASCII, sử dụng ASCII rất quan trọng ở đây vì reprsẽ không thực hiện được một cách chính xác nếu không).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.