Rumah pembangunan bahagian belakang Tutorial Python QuineRelay: Kelahiran ular Quine

QuineRelay: Kelahiran ular Quine

Aug 07, 2024 pm 10:30 PM

Dalam pengembaraan siri blog Quine sebelum ini, kami meneroka cara menulis Quines dan Intron kami sendiri. Hari ini kita akan melihat apakah itu QuineRelays dan cara anda boleh memanfaatkan Intron untuk menciptanya.

Bayangkan bulatan program, setiap satu ditulis dalam bahasa yang berbeza. Setiap program dalam bulatan ini mempunyai satu tujuan: untuk mencetak kod sumber program seterusnya dalam urutan. Program terakhir kemudian menutup gelung dengan mencetak kod sumber program pertama.

Pada asasnya, QuineRelays ialah satu set n program, dalam n bahasa yang berbeza seperti:

  • Setiap program mengeluarkan sumber program seterusnya.
  • Atur cara terakhir mengeluarkan semula sumber yang pertama. Fikirkan Senarai Berkaitan Pekeliling di sini. Contoh terakhir ialah penyegar minda!

Mari lihat beberapa contoh untuk memahami konsep dengan lebih baik.


relay pesanan ke-2

QuineRelay pesanan ke-2 ini menampilkan program JavaScript yang mencetak program Python, yang kemudiannya mencetak semula program JavaScript asal. Ia merupakan duo dinamik replikasi diri.
JavaScript → Python ⥀

JavaScript: Cuba dalam talian!

console.log((q=_=>`print(${JSON.stringify(`console.log((q=${q+[]})())`)})`)())
Salin selepas log masuk

Python: Cuba dalam talian!

print("console.log((q=_=>`print(${JSON.stringify(`console.log((q=${q+[]})())`)})`)())")
Salin selepas log masuk

relay pesanan ke-3

Perkara menjadi lebih menarik dengan QuineRelay pesanan ke-3. Yang ini bermula dengan atur cara Haskell, yang mengeluarkan atur cara Python, yang mengeluarkan atur cara Ruby, dan akhirnya, atur cara Ruby kembali kepada atur cara Haskell yang asal.
Haskell → Python2 → Ruby ⥀

Haskell: Cuba dalam talian!

q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"
Salin selepas log masuk

Python2: Cuba dalam talian!

def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'
q("def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'","def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']")
Salin selepas log masuk

Ruby: Cuba dalam talian!

def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end
q("def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']","def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'")
Salin selepas log masuk

relay pesanan ke-4

Berikut ialah QuineRelay pesanan ke-4: Ruby → Java → C# → Python ⥀
GitHub


Merentas budaya, terdapat beberapa simbolisme yang dikongsi bersama. Salah satunya ialah Ouroboros, yang mempunyai rujukan dalam mitologi Mesir, Yunani, Rom, Hindu, Siberia, Norse, Afrika, dan Amerika Selatan. Ouroboros ialah simbol purba yang menggambarkan seekor ular atau naga memakan ekornya sendiri, mewakili kitaran kekal penciptaan dan kemusnahan.

QuineRelay: Birth of the Quine serpent

Dalam mitologi Norse, Jörmungandr ialah seekor ular besar, anak tengah Loki dan gergasi Angrboða. Odin melemparkan Jörmungandr ke dalam lautan mengelilingi Midgard (alam manusia), di mana ular itu menjadi sangat besar sehingga ia mengelilingi dunia dan menggenggam ekornya sendiri. Akibatnya mengelilingi Midgard (Bumi) ia dirujuk sebagai Ular Dunia - Ouroboros. Jörmungandr melepaskan ekornya adalah salah satu tanda permulaan Ragnarök (pertempuran terakhir dunia).

Relay kui menjelmakan simbolisme ini dengan agak kemas, kerana setiap program dalam kitaran menghasilkan yang seterusnya, hanya untuk dilahirkan semula pada akhirnya, dan oleh itu digelar program Ouroboros.


Relay Ouroboros pesanan ke-128

Pegang pada tempat duduk anda. Berikut ialah Ouroboros QuineRelay pesanan ke-128. Ya, anda membacanya dengan betul. 128 !!!
Ruby → Rust → Scala → ... (120 yang lain) ... → Python → R → Ratfor → rc → REXX ⥀
GitHub

QuineRelay: Birth of the Quine serpent

Seolah-olah ini tidak cukup menarik, ia termasuk telur easter. Kod Ruby asal apabila dizum keluar mengandungi naga Ouroboros!

QuineRelay: Birth of the Quine serpent


Menulis QuineRelay anda sendiri

Mari mulakan intron Python yang kami tulis sebelum ini dan cuba tukarkannya menjadi QuineRelay tertib ke-2.

Python Intron: Cuba dalam talian!

intron = 'wubbalubbadubdub'
data = "print('intron =', repr(intron)); print('data =', repr(data)); print(data)"
print('intron =', repr(intron)); print('data =', repr(data)); print(data)
Salin selepas log masuk

Menggunakan keajaiban intron, kini kita boleh dengan mudah meletakkan kod bahagian adik beradik Quine dalam bahasa berbeza ke dalam intron. Menghasilkan atur cara dalam bentuk:

Python:

intron = "code part of sibling"
data = "code part of self"
print('intron =', repr(intron)); print('data =', repr(data)); print(data)
Salin selepas log masuk

Memandangkan, setiap pembolehubah adalah adil, bertindak sebagai data Quine yang berbeza. Mari kita tukar nama data dan intron, masing-masing menjadi d1 dan d2.

Python:

d1 = "code part of self"
d2 = "code part of sibling"
print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d1)
Salin selepas log masuk

Kini, d2 bertindak sebagai intron, tetapi program di atas masih cuba mencetak sebahagian kod diri. Untuk mendapatkannya mencetak sumber seterusnya, mari cetak(d2) dan bukannya cetak(d1) pada penghujungnya.

Python:

d1 = "code part of self"
d2 = "code part of sibling"
print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)
Salin selepas log masuk

Kita sedia maklum bahawa kandungan d1 hanyalah salinan baris 3. Tetapi kita belum mempunyai kandungan d2.

Katakanlah, kami mahu mencipta QuineRelay dengan JavaScript. Mari tulis intron yang serupa dalam JS.

JavaScript:

d1 = "code part of sibling"
d2 = "code part of self"
console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1);
Salin selepas log masuk

Sekarang, baris 3 intron JS di atas, ialah kod program adik-beradik yang kami mahu!
Tampalkan kod satu sama lain sebagai intron pada yang lain.
Nota. Kita perlu menambah d1 + '' dalam js untuk mengelakkan beberapa ketidakpadanan petikan

Python: Try it online!

d1 = "print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)"
d2 = "console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 + '');"
print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)
Salin selepas log masuk

JavaScript: Try it online!

d1 = "print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)"
d2 = "console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 + '');"
console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 + '');
Salin selepas log masuk

There you go. It's a proper 2nd order QuineRelay! A Python program, that prints a JavaScript program, that prints the original Python program back in a cycle.


Creating a QuineRelay is an exercise in creative coding and understanding how different languages represent and manipulate strings. It involves weaving together introns from various programs, each containing the code to replicate its next neighbour.

At its core, an nth-order relay is a game of n clever ways to escape quotes across n programming languages.

Stay tuned for the next post on MultiQuine!


Sources and references:

  • Ouroboros programs, wiki page.
  • A Third Order Quine in Three Languages, blog by sigfpe.
  • Chain Quine, GitHub repo by Ibragimov Ruslan.
  • 128 Quine Relay, GitHub repo by Yusuke Endoh.
  • QuineRelay: Birth of the Quine serpent, self-referencing blog where a word in each n-order example hyperlinks to the next, cyclically. (May not work in dev.to; checkout the canonical blog)
  • Jörmungandr, wiki page.
  • Ouroboros, wiki page.
  • Art of Code, talk by Dylan Beattie

Atas ialah kandungan terperinci QuineRelay: Kelahiran ular Quine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Apr 01, 2025 pm 05:09 PM

Penyelesaian kepada Isu Kebenaran Semasa Melihat Versi Python di Terminal Linux Apabila anda cuba melihat versi Python di Terminal Linux, masukkan Python ...

Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Apr 01, 2025 pm 11:15 PM

Apabila menggunakan Perpustakaan Pandas Python, bagaimana untuk menyalin seluruh lajur antara dua data data dengan struktur yang berbeza adalah masalah biasa. Katakan kita mempunyai dua DAT ...

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Apr 02, 2025 am 07:18 AM

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah? Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah? Apr 02, 2025 am 07:15 AM

Cara mengelakkan dikesan semasa menggunakan fiddlerevery di mana untuk bacaan lelaki-dalam-pertengahan apabila anda menggunakan fiddlerevery di mana ...

Apakah ungkapan biasa? Apakah ungkapan biasa? Mar 20, 2025 pm 06:25 PM

Ekspresi biasa adalah alat yang berkuasa untuk memadankan corak dan manipulasi teks dalam pengaturcaraan, meningkatkan kecekapan dalam pemprosesan teks merentasi pelbagai aplikasi.

Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Apr 01, 2025 pm 10:51 PM

Bagaimanakah Uvicorn terus mendengar permintaan HTTP? Uvicorn adalah pelayan web ringan berdasarkan ASGI. Salah satu fungsi terasnya ialah mendengar permintaan HTTP dan teruskan ...

Apakah beberapa perpustakaan Python yang popular dan kegunaan mereka? Apakah beberapa perpustakaan Python yang popular dan kegunaan mereka? Mar 21, 2025 pm 06:46 PM

Artikel ini membincangkan perpustakaan Python yang popular seperti Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask, dan Permintaan, memperincikan kegunaan mereka dalam pengkomputeran saintifik, analisis data, visualisasi, pembelajaran mesin, pembangunan web, dan h

Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Apr 01, 2025 pm 11:18 PM

Di Python, bagaimana untuk membuat objek secara dinamik melalui rentetan dan panggil kaedahnya? Ini adalah keperluan pengaturcaraan yang biasa, terutamanya jika perlu dikonfigurasikan atau dijalankan ...

See all articles