Quine tăng


23

Nhiệm vụ của bạn là viết một chương trình hoặc hàm xuất ký tự đầu tiên của mã nguồn của nó, sau đó là thứ hai, sau đó là thứ ba ... mỗi lần nó được chạy.

Ví dụ: nếu chương trình của bạn có foongôn ngữ bartrong tệp baz.bar, thì bạn sẽ nhận được đầu ra tương tự như sau:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Chương trình của bạn có thể làm bất cứ điều gì một khi nó hoàn thành việc in mã nguồn theo kiểu này. Bạn có thể thay đổi mã nguồn cho các tập tin, nhưng hãy nhớ rằng mã nguồn được in là gốc mã nguồn.

Đây là một môn đánh gôn, vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.


1
Nếu chúng ta có thể sửa đổi mã nguồn cho tệp, điều đó có nghĩa là chúng ta cũng có thể đọc nó?
FlipTack

1
@ Flp.Tkc Câu hỏi hay. Tôi thành thật không có ý kiến. Tôi không muốn bạn xây dựng quine bằng cách đọc nguồn, nhưng tôi không sao nếu bạn chỉ đọc nguồn để sửa đổi tệp.
Conor O'Brien

Câu trả lời:


6

Thạch , 12 byte

“;⁾vṾ®ȯ©Ḣ”vṾ

Đây là một liên kết niladic. Hãy thử trực tuyến! (Bao gồm mã để gọi liên kết mười hai lần.)

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

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Là một phần thưởng bổ sung, vì thanh ghi sẽ giữ một chuỗi trống sau cuộc gọi twelveth, một lần nữa nó bị sai lệch và liên kết đã sẵn sàng để bắt đầu lại. Gọi liên kết 24 lần sẽ xuất mã nguồn hai lần, gọi ba lần ba lần, v.v.


Tôi không biết Jelly, vậy chân trang làm gì chính xác? Tại sao ^ 17?
Conor O'Brien

Gọi liên kết ở trên ( ¢), hàm nhận dạng ( ¹, không thực sự cần thiết sau cuộc gọi đầu tiên), đặt giá trị trả về thành linefeed ( , in ngầm giá trị trả về trước đó), lặp lại. ¹đều là siêu ký tự, nhưng chúng không liên quan. Tôi đã thay thế chúng bằng cách ít gây nhầm lẫn hơn ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(gọi, nối, lặp lại).
Dennis

12

Javascript - 26 byte

Xác định f()trả về ký tự mã nguồn theo ký tự.

n=0;f=x=>("n=0;f="+f)[n++]

Trả về không xác định sau khi nó hết ký tự.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


Nếu tôi không nhầm, bạn phải bao gồm lệnh gọi hàm như một phần của mã.
Mama Fun Roll

@MamaFunRoll liên kết đến bài đăng meta có liên quan?
Hạ cấp

Tôi không biết gì về P: Tuy nhiên, tôi đã luôn nghĩ rằng chính hàm gọi đó là một phần của câu hỏi; có lẽ tôi đang thiếu thứ gì đó?
Mama Fun Roll

@MamaFunRoll Thông số kỹ thuật đặc biệt cho phép các chức năng, do đó không cần một cuộc gọi. Dù sao nó cũng không có ý nghĩa gì cho thử thách particylar này.
Dennis

Được rồi, chỉ cần chắc chắn.
Mama Fun Roll

2

xếp chồng , không biên dịch, 34 byte

[tostr ':!' + execCounter # out]:!

Một biến thể trên quine tiêu chuẩn. Đây là một chương trình đầy đủ. Điều này sử dụng execCounterđể có được bao nhiêu lần chương trình này được chạy cụ thể. Lỗi sau khi xuất tất cả mọi thứ.

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


2

Pip , 31 byte

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Một chức năng ẩn danh. Kiểm tra nó trên TIO!

Giải trình

Bắt đầu với tiêu chuẩn Pip này:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Bọc cái này trong dấu ngoặc nhọn để làm cho nó một chức năng. Bây giờ, thay vì trả lại toàn bộ nguồn, chúng ta cần lập chỉ mục vào nó. Sử dụng một biến toàn cục cho chỉ mục và tăng nó mỗi lần sẽ đáp ứng yêu cầu "ký tự tiếp theo mỗi lần nó được gọi là". vlà ứng cử viên tốt nhất bởi vì nó được ưu tiên hóa trước -1. Tăng nó lần đầu tiên đưa ra một chỉ số 0, lần sau 1, v.v.

Pip có lập chỉ mục theo chu kỳ, vì vậy một khi chức năng in ký tự cuối cùng của nó, nó sẽ bắt đầu lại từ đầu.


1

Python, 90 byte

Một phần mở rộng trên quine Python tiêu chuẩn (mẹo chơi gôn được chào đón):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Đây là một hàm tạo python , có nghĩa là bạn lặp lại nó và mỗi lần lặp cung cấp ký tự tiếp theo trong mã nguồn. Khi tất cả các nhân vật đã được trả lại, điều này gặp sự cố IndexError.

Để thử nghiệm, chỉ cần nối đoạn script này vào cuối chương trình:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

Hoặc thử trực tuyến!


1

*> <> , 13 21 byte

" r:2+a1Fi1+:1F1+[ro;

Tạo một tệp có tên \nđể theo dõi chỉ mục.

Điều này có thể được đánh gôn nhiều hơn, nhưng không có gì ngay lập tức nhảy ra khỏi tôi ...

Đầu ra

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

Giải trình

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Gian lận gia tăng Quine

a1Fi1+:0go1F;

Giải trình

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

haha, tôi không biết bạn có thể đặt tên cho một tập tin "\ n". Mặc dù về mặt kỹ thuật này đọc mã nguồn, theo ghướng dẫn.
Conor O'Brien

@ ConorO'Brien, ah đủ công bằng. hmm ...
redstarcoder

*> <> Có một số loại lập chỉ mục ngăn xếp? Hoặc lệnh lặp lại? Sau đó, bạn có thể sử dụng khung quine tiêu chuẩn "your code goes here;cho> <>, sau đó truy cập thành viên thứ n trên ngăn xếp
Conor O'Brien

@ ConorO'Brien yeah Teal Pelican đã chỉ cho tôi biến thể quine này trong câu trả lời câu đố gian lận khác của tôi :).
redstarcoder

1
@redstarcoder Tôi đã làm việc nhiều hơn về các quines (YAY!) và tôi đã tìm ra một mẹo hay, nếu bạn thay r cho # bạn có thể: 1- the # like; #; hoặc [+ 1F1: + 1iF1a-1: "Tôi không thể kiểm tra điều này vào lúc này nhưng tôi tin rằng nó cắt 1 byte từ mã của bạn.> <> quines có thể được thực hiện như #o <-1:" vv: D
Teal bồ nông

1

Toán học, 91 byte

Bình luận rất hoan nghênh; Tôi vẫn đang học những sợi dây về những gì các quines là đúng.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Xác định một hàm được gọi nhiều lần mà không có đối số. Sau cuộc gọi thứ 91, nó sẽ gây ra một lỗi lớn và trả về giá trị.

Có hai vấn đề cần khắc phục: đầu tiên, tôi chỉ muốn sử dụng StringTake[ToString[#0]<>"[]"], nhưng ToString[]dường như xóa các dấu ngoặc kép; vì vậy tôi phải thay thế "[]"bằng FromCharacterCode[{91, 93}]. Thứ hai, các biến Mathicala bắt đầu chưa được khởi tạo, vì vậy tôi không thể gọi ++qtrước qđược xác định; đây là lý do tại sao ban đầu If[!NumberQ[q], q = 0]là cần thiết.

Coda không liên quan: trong khi tìm kiếm NumberQ, tôi đã học được rằng Mathicala có một hàm gọi là TrueQ... mà, vâng, trả về Truenếu đối số là TrueFalsenếu đối số là False! (Tiện ích là nó cũng trả Falsevề tất cả các đối số khác.)


1

Kính hiển vi II, 40 33 byte

Một khối mã theo nghĩa đen, ngôn ngữ gần nhất với một chức năng:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Sau khi chạy, nó sẽ tự quay trở lại xđể dễ dàng gọi lại.


0

Bash (và zsh, ksh), 39 byte

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

Nó không in gì sau khi chương trình được in ra.

Đảm bảo 0không tồn tại trong thư mục hiện tại và chạy:

bash iquine.bash

Chào mừng đến với PPCG! Bạn đã có một ý tưởng thông minh để tăng chỉ số. Thật không may, có vẻ như câu trả lời này hoạt động bằng cách đọc mã nguồn của chính nó, điều đó có nghĩa là nó không phải là một câu hỏi hợp lệ theo tiêu chuẩn của chúng tôi . Nếu bạn sửa đổi nó để sử dụng các kỹ thuật quine ngoài việc đọc nguồn của chính nó, đó sẽ là một câu trả lời tốt.
DLosc
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.