Quine tambahan

23

Tugas Anda adalah menulis program atau fungsi yang menampilkan karakter pertama dari kode sumbernya, lalu yang kedua, lalu yang ketiga ... setiap kali dijalankan.

Misalnya, jika program Anda foomenggunakan bahasa bardalam file baz.bar, maka Anda akan mendapatkan hasil yang mirip dengan ini:

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

Program Anda dapat melakukan apa saja setelah selesai mencetak kode sumbernya dengan cara ini. Anda dapat mengubah kode sumber untuk file tersebut, tetapi ingat bahwa kode sumber yang akan dicetak adalah kode sumber asli .

Ini adalah kode-golf, jadi program terpendek dalam byte menang.

Conor O'Brien
sumber
1
Jika kita dapat memodifikasi kode sumber untuk file tersebut, apakah itu berarti kita dapat membacanya juga?
FlipTack
1
@ Flp.Tkc Pertanyaan bagus. Sejujurnya aku tidak tahu. Saya tidak ingin Anda membuat quine dengan membaca sumbernya, tapi saya baik-baik saja jika Anda membaca sumber untuk modifikasi file saja.
Conor O'Brien

Jawaban:

6

Jelly , 12 byte

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

Ini adalah tautan niladik. Cobalah online! (Termasuk kode untuk memanggil tautan dua belas kali.)

Bagaimana itu bekerja

“;⁾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.

Sebagai bonus tambahan, karena register akan menyimpan string kosong setelah panggilan kedua belas, itu sekali lagi palsu dan tautan siap untuk memulai dari awal. Memanggil tautan 24 kali akan menampilkan kode sumber dua kali, menyebutnya 36 kali tiga kali, dll.

Dennis
sumber
Saya tidak tahu Jelly, jadi apa yang dilakukan footer dengan tepat? Kenapa ^ 17?
Conor O'Brien
Panggil tautan di atas ( ¢), fungsi identitas ( ¹, tidak benar-benar diperlukan setelah panggilan pertama), atur nilai kembali ke umpan baris ( , secara implisit mencetak nilai pengembalian sebelumnya), ulangi. ¹dan keduanya superskrip, tetapi keduanya tidak terkait. Saya telah menggantinya dengan yang kurang membingungkan ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(menelepon, menyatukan, ulangi).
Dennis
12

Javascript - 26 byte

Menentukan f()yang mengembalikan karakter kode sumber dengan karakter.

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

Pengembalian tidak terdefinisi setelah kehabisan karakter.

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

Maltysen
sumber
Jika saya tidak salah, Anda harus memasukkan pemanggilan fungsi sebagai bagian dari kode.
Mama Fun Roll
@MamaFunRoll tautan ke meta post yang relevan?
Downgoat
Saya tidak tahu apa-apa: P Namun, saya selalu berpikir bahwa pemanggilan fungsi itu sendiri adalah bagian dari quine; mungkin ada sesuatu yang saya lewatkan?
Mama Fun Roll
@MamaFunRoll Spesifikasi secara khusus memungkinkan fungsi, jadi panggilan tidak diperlukan. Lagipula itu tidak masuk akal untuk tantangan partikel ini.
Dennis
Baiklah, pastikan saja.
Mama Fun Roll
2

ditumpuk , tidak bersaing, 34 byte

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

Variasi pada quine standar. Ini adalah program lengkap. Ini digunakan execCounteruntuk mendapatkan berapa kali program ini dijalankan secara spesifik. Kesalahan setelah mengeluarkan semuanya.

Coba di sini!

Conor O'Brien
sumber
2

Pip , 31 byte

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

Fungsi anonim. Uji di TIO!

Penjelasan

Mulai dengan quine Pip standar ini:

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

Bungkus ini dalam kurung kurawal untuk membuatnya berfungsi. Sekarang, alih-alih mengembalikan seluruh sumber, kita perlu mengindeksnya. Menggunakan variabel global untuk indeks dan menambahkannya setiap kali akan memenuhi persyaratan "karakter berikutnya setiap kali disebut". vadalah kandidat terbaik karena telah diinisialisasi ke -1. Menambahkannya pertama kali memberikan indeks 0, waktu berikutnya 1, dll.

Pip memiliki pengindeksan siklus, jadi setelah fungsi mencetak karakter terakhirnya, ia akan memulai dari awal.

DLosc
sumber
1

Python, 90 byte

Perpanjangan pada standar Python quine (selamat datang tips golf):

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

Ini adalah fungsi generator python , artinya Anda mengulanginya, dan setiap iterasi memberikan karakter berikutnya dalam kode sumber. Ketika semua karakter telah dikembalikan, ini macet dengan IndexError.

Untuk pengujian, cukup tambahkan skrip ini ke akhir program:

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)

Atau coba online!

FlipTack
sumber
1

*> <> , 13 21 byte

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

Membuat file dengan nama \nuntuk melacak indeks.

Ini mungkin bisa bermain golf lebih banyak, tetapi tidak ada yang langsung melompat ke arah saya ...

Keluaran

$ 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

Penjelasan

" 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

Quine Incremental Quine

a1Fi1+:0go1F;

Penjelasan

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
redstarcoder
sumber
haha, saya tidak tahu Anda bisa memberi nama file "\ n". Meskipun ini secara teknis membaca kode sumber, dengan ginstruksi.
Conor O'Brien
@ Conor'Brien, ah cukup adil. hmm ...
redstarcoder
Apakah *> <> memiliki semacam pengindeksan tumpukan? Atau perintah pengulangan? Kemudian, Anda dapat menggunakan kerangka quine standar "your code goes here;untuk> <>, lalu mengakses anggota ke-n di stack
Conor O'Brien
@ ConorO'Brien ya Teal Pelican menunjukkan kepada saya varian quine ini pada jawaban quine quine lainnya :).
redstarcoder
1
@ redstarcoder Saya telah bekerja lebih banyak pada quines (YAY!) dan saya menemukan trik yang bagus, jika Anda mengganti r untuk # Anda dapat: 1- the # like; #; atau [+ 1F1: + 1iF1a-1: "Saya tidak dapat menguji ini saat ini tetapi saya yakin ini memotong 1 byte dari kode Anda.> <> quines dapat dilakukan seperti #o <-1:" etc: D
Teal pelican
1

Mathematica, 91 byte

Komentar sangat disambut; Saya masih belajar tali tentang apa quines quines yang tepat.

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

Menentukan fungsi yang dipanggil berulang kali tanpa argumen. Setelah panggilan 91, ia melakukan kesalahan besar dan kembali tidak dievaluasi.

Ada dua masalah yang harus diatasi: pertama, saya hanya ingin menggunakan StringTake[ToString[#0]<>"[]"], tetapi ToString[]tampaknya menghapus tanda kutip; jadi saya harus mengganti "[]"dengan FromCharacterCode[{91, 93}]. Kedua, variabel Mathematica mulai tidak diinisialisasi, jadi saya tidak bisa menelepon ++qsebelum qdidefinisikan; inilah mengapa awal If[!NumberQ[q], q = 0]dibutuhkan.

Coda yang tidak relevan: ketika melihat ke atas NumberQ, saya mengetahui bahwa Mathematica memiliki fungsi yang disebut TrueQ... yang, ya, kembali Truejika argumennya adalah Truedan Falsejika argumennya adalah False! (Utilitasnya adalah ia mengembalikan Falsesemua argumen lain juga.)

Greg Martin
sumber
1

Microscript II, 40 33 byte

Kode blok literal, bahasa yang paling dekat dengan fungsi:

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

Setelah berlari, ia menempatkan dirinya kembali ke xuntuk membuatnya lebih mudah untuk memanggil lagi.

SuperJedi224
sumber
0

Bash (dan zsh, ksh), 39-byte

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

Ia tidak mencetak apa pun setelah program dicetak.

Pastikan 0tidak ada di direktori saat ini dan jalankan:

bash iquine.bash
Kaito Udagawa
sumber
Selamat datang di PPCG! Anda punya ide pintar untuk menambah indeks. Sayangnya, sepertinya jawaban ini berfungsi dengan membaca kode sumbernya sendiri, yang artinya bukan quine yang valid menurut standar kami . Jika Anda memodifikasinya untuk menggunakan teknik quine selain membaca sumbernya sendiri, itu akan menjadi jawaban yang bagus.
DLosc