In một quine có chứa đầu vào


15

Bài tập

Bạn sẽ được cung cấp một chuỗi trong đầu vào chỉ bao gồm các ký tự từ ađến z, tức là đầu vào sẽ khớp với biểu thức chính quy /^[a-z]*$/.

Đầu ra của bạn phải là một chương trình hoàn chỉnh trong cùng một ngôn ngữ, có mã nguồn chứa đầu vào và là một câu hỏi thích hợp.

Thí dụ

Chương trình của bạn sẽ nhận được đầu vào abcvà đầu ra:

...abc...

Trên đây phải là một chương trình hoàn chỉnh trong cùng một ngôn ngữ không có đầu vào và đầu ra:

...abc...

tức là nó tự xuất ra.

Chấm điểm

Đây là . Câu trả lời ngắn nhất trong byte thắng.

Người giới thiệu


3
Hmm .. Vì vậy, giống như một 'quat' (quine + cat)?
Matthew Roh

Câu trả lời:


7

Python 3, 57 61 byte

lambda x:"s='s=%r;print(s%%s)';print(s%s)".replace('s',x+'x')

Lấy một con trăn cơ bản 3 quine từ đây và thay thế tên biến bằng đầu vào.

Lưu ý: Như đã chỉ ra bởi Hyper Neutrino trong ý kiến, điều này không làm việc cho các từ khóa reserved như for, ifvv

Việc thêm một ký tự mà không có từ khóa dành riêng nào kết thúc bằng 'x'hoặc bất kỳ số nào sửa lỗi này. (Ørjan Johansen).


Rất sáng tạo để sử dụng tên biến.
Leaky Nun

3
Không hoạt động cho đầu vào "for"hoặc bất kỳ từ dành riêng nào khác trong Python.
HyperNeutrino

Có thể xác nhận. Nó không hoạt động cho tất cả các đầu vào có thể. Dùng thử trực tuyến
mbomb007

@HyperNeutrino, Noted, cũng không biết làm thế nào để vượt qua nó
c ..

Bạn có thể nối thêm một ký tự không ở cuối bất kỳ từ khóa nào, chẳng hạn như 'x'.
Ørjan Johansen

6

Thạch , 9 byte

Máy phát điện

;“¶Øv”ṾØv

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

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

;“¶Øv”ṾØv  Main link. Argument: s (string of letters)

;“¶Øv”     Concatenate s and the string "\nØv".
      Ṿ    Uneval; get its string representation.
           (implicit) Print the previous return value since the next link is an
           otherwise unparsable nilad.
       Øv  Set the return value to "Ṙv".

Quine

Nếu đầu vào là quine, chương trình sau được tạo ra.

“quine
Øv”Ṙv

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

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

Đây là tiêu chuẩn Jelly quine. Đầu tiên,

“quine
Øv”

đặt đối số bên trái và giá trị trả về cho chuỗi "quine\nØv".

Sau đó, in một đại diện chuỗi (mã từ khối trước) và trả về chuỗi không thay đổi.

Sau đó, vlấy đối số bên trái và chuyển nó làm đầu vào cho chương trình Jelly

quine
Øv

Trong tất cả các chương trình Jelly, chỉ có liên kết chính (được xác định trên dòng cuối cùng) được thực thi, do đó dòng đầu tiên bị bỏ qua hoàn toàn.

Cuối cùng, Øvđặt giá trị trả về thành "Ṙv", được in ngầm khi chương trình bên ngoài kết thúc.



4

Haskell , 51 byte

q lấy một chuỗi và trả về một chuỗi.

q s|t<-"main=putStr$fst`mappend`show$"=t++show(t,s)

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

Ví dụ đầu ra cho putStr$q"test":

main=putStr$fst`mappend`show$("main=putStr$fst`mappend`show$","test")

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

  • Đặt văn bản quine chính và chuỗi mong muốn trong một tuple.
  • Sử dụng fstđể trích xuất văn bản chính.
  • Sử dụng showđể biến toàn bộ tuple thành một chuỗi.
  • Sử dụng mappendđể kết hợp hai chức năng trước đó. Thuận tiện mappendtrên hai hàm cung cấp một hàm áp dụng từng hàm cho đối số của nó và kết hợp các kết quả với mappendloại kết quả (ở đây nối chuỗi).

4

Dưới tải , 14 byte

(~aSaS(:^)S):^

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

Sử dụng như (test)(~aSaS(:^)S):^- đó là một quine.

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

  • Underload là một ngôn ngữ bí truyền (dựa trên ngăn xếp). Nó không hỗ trợ đọc đầu vào, do đó, bất kỳ đối số nào được đưa vào ngăn xếp ban đầu.
  • (test)(~aSaS(:^)S)là chuỗi ký tự, do đó, đặt chúng trên ngăn xếp, với cái sau trên đầu trang.
  • :nhân đôi (~aSaS(:^)S)chuỗi trên đầu ngăn xếp, sau đó ^chạy nội dung của nó dưới dạng chương trình con.
  • ~hoán đổi hai yếu tố hàng đầu trên ngăn xếp, vì vậy bây giờ (test)là trên cùng.
  • akết thúc tốt đẹp (test)trong ngoặc đơn.
  • Slấy chuỗi ((test))trên đầu ngăn xếp và in nó mà không có dấu ngoặc đơn bên ngoài (chỉ là cú pháp bằng chữ).
  • Bây giờ aSin phần còn lại (~aSaS(:^)S)trên ngăn xếp tương tự (với dấu ngoặc đơn).
  • Cuối cùng, (:^)Sin bản cuối cùng :^.

Tôi thực sự không làm việc )(như là đầu vào.
Rɪᴋᴇʀ

@Riker Đúng, Rất tiếc, không may không hỗ trợ dấu ngoặc đơn không khớp. Nhưng câu hỏi chỉ định a- z.
Ørjan Johansen

À được rồi. Không nhận thấy điều đó.
Rɪᴋᴇʀ

4

Dưới tải , 14 byte

a(aS(:^)S)~*:^

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

Một cách tiếp cận khác với câu trả lời Underload khác; chứ không phải là một quine, điều này xây dựng một quine. Thật thú vị, nó đi ra cùng một số byte. Đây là một hàm lấy đối số của nó từ ngăn xếp và đầu ra thành đầu ra tiêu chuẩn.

Giải trình

a(aS(:^)S)~*:^
a               Generate a string literal containing the input
 (aS(:^)S)~*    Prepend "aS(:^)S"
            :^  Mockingbird: run the resulting function with itself as argument

Hàm kết quả trông như thế này:

aS(:^)S(input)
aS              Print a string literal containing the argument
  (:^)S         Print ":^"
       (input)  Push "input" onto the stack

Nói cách khác, nó in một chuỗi ký tự chứa chính nó, theo sau là :^. Đây rõ ràng là một câu hỏi (vì những gì vừa được in giống như mã chúng tôi đã thực thi để chạy nó ở vị trí đầu tiên).


Có vẻ như trong TIO, bạn có thể bỏ thông tin ban đầu a, miễn là bạn không bận tâm đến lỗi lỗi phân đoạn được in thành stderr khi đầu vào chứa a.
Ørjan Johansen

Tôi thậm chí không nghĩ đến việc chỉ thực hiện chuỗi ký tự mà người dùng đưa ra, trên cơ sở công việc của chương trình đã kết thúc tại thời điểm đó và không phải (là một ký tự xuất hiện trong đầu vào, tất cả các chương trình sẽ không làm gì hoặc bị sập. Tôi thậm chí không nghĩ rằng đó là cụ thể cho TIO; chương trình không hợp lệ, nhưng nó đã tạo ra đầu ra mong muốn tại thời điểm nó gặp sự cố.

2

V , 9 byte

ñ"qPxÉÑ~j

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

Đây là một sửa đổi của quine V tiêu chuẩn và tôi tự hào rằng đây chỉ dài hơn một byte.

Hexdump:

00000000: f122 7150 78c9 d17e 6a                   ."qPx..~j

Giải trình:

ñ           " Record the following commands into register 'q'
 "qP        " Paste register 'q' before all input
    x       " Delete the last character of what we just pasted (this will be a 'ÿ')
     ÉÑ     " Insert 'Ñ' at the beginning of this line
       ~    " Toggle the case of this character
        j   " Move down a line. During playback, this will cancel playback of the current macro,
            " So everything after here is a NOOP

Sau đó, ghi âm hoàn toàn dừng lại và được phát lại. Điều này sẽ tạo ra đầu ra sau đây:

ñ"qPxÉÑ~jHello

jsẽ phá vỡ phát lại macro, không có gì trong đó Hellosẽ được chạy.


2

Python 2, 38 byte

Mặc dù đầu vào chỉ được yêu cầu để hỗ trợ a-z, nhưng điều này sẽ hoạt động với bất kỳ đầu vào một dòng nào không chứa byte NUL.

s='s=%r;print s%%s#'+input();print s%s

Dùng thử trực tuyến

Đối với đầu vào abc, kết quả là:

s='s=%r;print s%%s#abc';print s%s#abc

Dùng thử trực tuyến


1

RProgN 2 , 15 byte

"{']C'.%q[}]C"F

Giải thích

Sử dụng định dạng

{']C'.%q[}]C}

nơi %qlà đầu vào qouted, xây dựng một Quine của hương vị

{']C'."Some Text"[}]C

đó là một quine RProgN2 tiêu chuẩn, {']C'.}]C Điều đó, trước khi kết thúc, sẽ nối thêm và phá hủy chuỗi đã nhập.

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


1

Võng mạc , 14 byte

Số lượng byte giả định mã hóa ISO 8859-1.

\(\`^
¶\(*S1`|

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

Đối với đầu vào x, đầu ra này:


\(*S1`|x
\(*S1`|x

Giải trình

Đầu ra là một sửa đổi nhỏ của quine tiêu chuẩn . Chúng tôi chỉ đơn giản sử dụng regex |xthay vì regex trống. Vì |vẫn cho phép (và ưu tiên) và kết hợp trống, nên chức năng không bị ảnh hưởng và vì xsẽ chỉ bao gồm các chữ cái, nên nó được đảm bảo là chính cú pháp regex hợp lệ.

In ấn này thực sự sử dụng một kỹ thuật tương tự như bản thân quine. Để tránh sự trùng lặp của quine, chúng tôi ¶\(*S1`|chỉ chèn một lần vào đầu chuỗi. Đó chính xác là một nửa mã nguồn. Để in hai lần mà không có nguồn cấp dữ liệu, chúng tôi sử dụng cấu hình \(\, bao bọc toàn bộ chương trình trong một nhóm và làm cho cả giai đoạn cũng như nhóm chứa nó in kết quả mà không cần nguồn cấp.


1

Japt , 14 byte

"\"iQ ²ª`"+U ²

Kiểm tra nó trực tuyến! Đối với đầu vào abc, đầu ra

"iQ ²ª`abc"iQ ²ª`abc

mà đầu ra chính nó. Kiểm tra nó trực tuyến!

Giải trình

Đây là một phần mở rộng của quine Japt có khả năng tải trọng tiêu chuẩn:

"iQ ²"iQ ²

"iQ ²"      // Take this string.  iQ ²
      iQ    // Insert a quote.    "iQ ²
         ²  // Repeat this twice. "iQ ²"iQ ²
            // Implicit: output result of last expression

Sự khác biệt duy nhất là chúng tôi nối ª`abcvào cuối, trong JavaScript về cơ bản là ||"abc". Vì kết quả của phần đầu tiên luôn là một chuỗi không trống (sự thật), nên ||không bao giờ được chạy.

Có một số phiên bản thay thế có cùng độ dài:

"iQ ²ª`abc"iQ ²ª`abc   quine||"abc"
"iQ ²ª$abc"iQ ²ª$abc   quine||abc
"iQ ²ª{abc"iQ ²ª{abc   quine||function(){ ... }
"iQ ²ªXabc"iQ ²ªXabc   quine||X.a(...) (X could be any uppercase letter or digit)
"iQ ²//abc"iQ ²//abc   quine//abc      (// is a comment in JS/Japt)
"iQ ²;[abc"iQ ²;[abc   quine;          (unmatched [ causes a parsing error)

0

CJam , 16 14 byte

"`_~"q`';++`_~

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

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

"`_~"           e# Push "`_~"
     q`         e# Push a string representation of the input (input wrapped in quotes)
       ';       e# Push a semicolon
         ++     e# Concatenate all this together
           `    e# Get the string representation of the resulting string
            _~  e# Duplicate it and eval it (pushing the original string on the stack again)

Mà đầu ra một cái gì đó như "`_~\"test\";"`_~"test";.



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.