Trích dẫn an toàn


17

Nhiệm vụ của bạn rất đơn giản: viết chương trình (hoặc hàm) không nhận đầu vào và đầu ra (hoặc trả về) mã nguồn của nó. Điều hấp dẫn là khi chương trình được gói "quotes"(ký tự Unicode 34), nó sẽ lại xuất mã nguồn (hiện được trích dẫn).

Quy tắc tiêu chuẩn cho quines áp dụng. Đây là , vì vậy chương trình ngắn nhất (tính bằng byte) sẽ thắng.


8
@ATaco suy nghĩ sáng tạo. Mã trong dấu ngoặc kép thường không được thực thi, nhưng khi toàn bộ chương trình được bao quanh với dấu ngoặc kép thì các phần đó được thực thi.
Pavel

1
Hmm, điểm tốt.
ATaco

Điều này có thể hoạt động với BF trên các triển khai hỗ trợ !...
Esolanging Fruit 27/1/2017

1
Bạn phải sử dụng "? Một số ngôn ngữ hỗ trợ hai hoặc ba ký tự trích dẫn.
Neil

1
@tkellehe Meta: Điều gì được coi là một câu hỏi thích hợp? Theo như tôi hiểu được câu hỏi 1 byte của bạn, nó vi phạm yêu cầu mã / dữ liệu được đưa ra trong bài đăng được bình chọn cao nhất.
Laikoni

Câu trả lời:


4

Noodel , 9 7 byte

Phiên bản này hoạt động giống như phiên bản kia, chỉ là tôi quên rằng Noodel có cách để chạy một khối mã một lần và tôi đã tạo ra ngôn ngữ ...

Ḷ1ḥ-Ð1ḥ@€

ḷḥ-Ðḥ@ḅ

Thử nó:)


Làm thế nào nó hoạt động

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

Trích dẫn-An toàn

Đặt "nhân vật trước và sau khi chương trình hoạt động vì Noodel có một bộ các ký tự dành riêng cho những gì tôi gọi là các bản in . Chúng ngay lập tức được phân tích cú pháp dưới dạng chuỗi ký tự khi được đặt và cho phép dễ dàng in một cái gì đó lên màn hình. Vì vậy, không giống như hầu hết các ngôn ngữ, Noodel thấy bộ ASCII bình thường được coi là bản in xứng đáng là chuỗi ký tự trực tiếp (ngoại trừ nguồn cấp dữ liệu không gian và dòng) trong đó trích dẫn mã chỉ được xem là đẩy trên chuỗi.

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"Thử nó:)"


Đoạn trích

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


Tôi không nghĩ sử dụng elà hợp lệ. Câu hỏi không yêu cầu ký tự được mã hóa thành byte 34, nhưng đối với ký tự Unicode 34. Cho dù bạn sử dụng mã hóa nào, chỉ có một:"
Dennis

@Dennis, tôi đoán những gì bạn đang nói là tham chiếu đến ký tự Unicode 34 chỉ để đảm bảo mọi người đều sử dụng giống nhau "? (Xin lỗi, chỉ cố gắng đảm bảo tôi hiểu những gì bạn đang nói) Ngoài ra, tôi có nên xóa tất cả văn bản trong câu trả lời đề cập đến việc sử dụng ekhông?
tkellehe

1
Có, có hàng ngàn bảng mã, nhưng chỉ có một bộ ký tự Unicode. Kể từ khi "hoạt động, tôi chỉ cần loại bỏ các cuộc thảo luận và chỉ cần sử dụng ".
Dennis

11

Python 2 3, 181 152 130 124 122 byte

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

Hãy thử trực tuyến! TIO đi kèm với một tiêu đề và chân trang tự động kiểm tra tính hợp lệ của quine. Bạn có thể xóa chúng để chạy quine.

Mã này hoạt động bằng cách sử dụng các chuỗi ba trích dẫn trong Python. """ """bằng ' '"""" """bằng '" '.

Mã này sử dụng exec, nhưng không phải cho cách thực thi dữ liệu "không phải là quiney" dưới dạng mã, chỉ để đặt một biến từ bên trong một biểu thức. Nó execcũng được mã hóa chính xác trong dữ liệu.

Câu lệnh đầu tiên so sánh chuỗi, có thể với một trích dẫn được đặt trước " ", và đặt biến octtương ứng. (Biến có thể là bất kỳ nội dung ngắn nào.)

Phần còn lại của mã sau đó thực hiện quine Python truyền thống bằng cách sử dụng %rđịnh dạng chuỗi, với một số mã bổ sung loại bỏ các trích dẫn bổ sung nếu octkhông thay đổi.

Một phiên bản thay thế sử dụng "cheaty" execcó đến 126 byte với mã lặp lại ít hơn:

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

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


7

StandardML , 182 176 108 byte

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

Phiên bản không trích dẫn: Hãy thử nó trên tiền mã hóa.
Phiên bản trích dẫn: Hãy thử nó trên tiền mã hóa.

Lưu ý rằng đầu ra trông giống như thế này

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

bởi vì mã được giải thích khai báo bằng cách khai báo (mỗi ;kết thúc một khai báo) và hiển thị giá trị và loại của mỗi khai báo.


Lý lịch

Trong SML có một quine có dạng <code>"<code in quotes>":

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

và một trong mẫu "<code in quotes>"<code>:

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

Cả hai đều dựa vào thực tế là <code>phần không chứa dấu ngoặc kép và do đó có thể được trích dẫn mà không cần phải thoát bất cứ điều gì, "cần thiết để đưa ra quine được đưa ra bởi str(chr 34).

Họ cũng phụ thuộc rất nhiều vào định danh ngầm itđược sử dụng khi không có định danh rõ ràng nào được đưa ra trong một tuyên bố.

Trong quine đầu tiên str(chr 34);liên kết itvới chuỗi chứa ", fn x=>bắt đầu một hàm ẩn danh lấy một đối số x, sau đó nối x^it^x^itvà in chuỗi kết quả. Hàm ẩn danh này được áp dụng trực tiếp vào một chuỗi chứa mã chương trình, do đó, kết x^it^x^itquả sẽ mang lại kết quả <code>"<code>".

Câu hỏi thứ hai bắt đầu chỉ với mã chương trình là chuỗi ";str(chr 34)^it;print(it^it)";được ràng buộc it. Sau đó str(chr 34)^it;nối một trích dẫn vào đầu chuỗi và vì một lần nữa không có định danh rõ ràng nào được đưa ra, chuỗi kết quả "<code>được ràng buộc it. Cuối cùng print(it^it)nối chuỗi với chính nó mang lại "<code>"<code>sau đó được in.


Giải trình

Chỉnh sửa: Không còn cập nhật với phiên bản 108 byte, tuy nhiên người ta cũng có thể hiểu nó sau khi đọc giải thích này.

Câu hỏi an toàn trích dẫn kết hợp cả hai cách tiếp cận trên và chính nó là hình thức "<code>"<code>. Đặt điều này một lần nữa trong các trích dẫn mang lại ""<code>"<code>", vì vậy chúng tôi nhận được một chuỗi rỗng và sau đó là một quine của hình thức khác.

Điều đó có nghĩa là chương trình được cung cấp nguồn riêng dưới dạng "<code>định danh ithoặc itlà chính xác "và chúng ta được cung cấp nguồn riêng của mình <code>dưới dạng đối số và do đó phải là một hàm xử lý một đối số như vậy.

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

Để xác định trong trường hợp này chúng tôi, chúng tôi kiểm tra xem kích thước của itlớn hơn 1. Nếu không thì it"và chúng tôi đang trong trường hợp thứ hai, do đó elselợi nhuận -part một chức năng ẩn danh fn x=>print(it^it^x^it^x^it)mà sau đó được gọi là bởi vì sau đó nó theo nguồn như chuỗi . Lưu ý hàng đầu it^it^cần thiết cho chuỗi trống khi bắt đầu chương trình.

Nếu size itlớn hơn 1, chúng ta sẽ ở trong thenphần và chỉ thực hiện print(it^it), phải không? Không hoàn toàn, vì tôi đã bỏ qua việc nói với bạn rằng SML được gõ mạnh, điều đó có nghĩa là một điều kiện if <cond> then <exp_1> else <exp_2>phải luôn có cùng loại, điều đó có nghĩa là các biểu thức <exp_1><exp_2>cần phải có cùng loại. Chúng ta đã biết loại elsephần: Một hàm ẩn danh nhận một chuỗi và sau đó các cuộc gọi printcó loại string -> <return type of print>printcó loại string -> unit( unittheo một cách nào đó tương tự như voidtrong các ngôn ngữ khác), do đó, loại kết quả là một lần nữa string -> unit.

Vì vậy, nếu thenphần chỉ print(it^it)có loại unit, chúng ta sẽ gặp lỗi không khớp loại. Vậy làm thế nào về fn _=>print(it^it)? ( _Là một ký tự đại diện cho một cuộc tranh cãi rằng không được sử dụng) chức năng ẩn danh này ngày của riêng mình đã loại 'a -> unitnơi 'atượng trưng cho một loại tùy ý, vì vậy trong bối cảnh điều kiện của chúng tôi mà thực thi một string -> unitloại hình này sẽ làm việc. (Biến loại 'ađược khởi tạo với loại string.) Tuy nhiên, trong trường hợp này, chúng tôi sẽ không in bất cứ điều gì vì hàm ẩn danh không bao giờ được gọi! Hãy nhớ rằng, khi chúng ta đi vào thenphần -part, mã tổng thể là "<code>"<code>, vì vậy <code>phần-ước tính cho một hàm nhưng, vì không có gì xuất hiện sau nó, nên nó không được gọi.

Thay vào đó chúng tôi sử dụng một sequentialisation trong đó có các hình thức (<exp_1>; ...; <exp_n>)nơi <exp_1>để <exp_n-1>có thể có các loại độc đoán và các loại <exp_n>cung cấp các loại toàn bộ sequentialisation. Từ quan điểm chức năng của xem các giá trị của <exp_1>để <exp_n-1>chỉ đơn giản là loại bỏ, tuy nhiên SML cũng hỗ trợ cấu trúc bắt buộc để các biểu thức có thể có tác dụng phụ. Nói tóm lại, chúng tôi lấy (print(it^it);print)làm then-part, do đó in trước rồi trả về hàm printcó đúng loại.


7

V , 27 , 23 byte

éPñi"éP241"qpá"lxx|xÿ

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

Vì phần này chứa một số ký tự không thể in được, đây là phiên bản có thể đọc được:

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

và đây là một hexdump:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

Vì vậy, điều đầu tiên chúng ta cần làm là xác định xem ký tự đầu tiên có phải là trích dẫn hay không. éPchèn ký tự 'P', nhưng "éPlà NOOP. Sau đó, chúng tôi chạy một sửa đổi nhỏ trên quine mở rộng tiêu chuẩn, đó là:

ñi<C-v>241<esc>"qpÿ

Chúng tôi sẽ làm điều đó một chút khác nhau mặc dù. Trước hết, chúng ta cần chèn văn bản "éP" bắt đầu. Vì vậy chúng tôi làm

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

Đây là nơi phân nhánh xảy ra. Văn bản hiện tại trong bộ đệm là

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

Trừ khi chúng tôi gói nó trong dấu ngoặc kép, trong trường hợp đó, 'P' sẽ không bao giờ được chèn và bộ đệm là:

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

Vì chúng tôi vẫn đang ghi âm, chúng tôi có thể làm bất cứ điều gì chúng tôi muốn ở đây và nó sẽ được thêm vào bộ đệm khi "qpxảy ra. Vì vậy, từ đây khá dễ dàng để xóa các trích dẫn một cách có điều kiện:

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

JavaScript (ES6), 239 237 byte

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

Hãy cẩn thận để thử từng phiên bản trong một môi trường mới (ví dụ: tab trình duyệt mới)

Phải có ít nhất một cách để đơn giản hóa điều này ...


1
Tôi cho rằng bạn có thể sử dụng một mảng cho các thay thế như vậy: [x = "thay thế"]. Mặc dù có thể phá vỡ mọi thứ, tôi không có nhiều kinh nghiệm với các câu hỏi ...
Luke
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.