var QUESTION_ID=69;
var OVERRIDE_USER=98;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}
function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}
function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=!1;comment_page=1;getComments()}})}
function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}
getAnswers();var SCORE_REG=(function(){var headerTag=String.raw `h\d`
var score=String.raw `\-?\d+\.?\d*`
var normalText=String.raw `[^\n<>]*`
var strikethrough=String.raw `<s>${normalText}</s>|<strike>${normalText}</strike>|<del>${normalText}</del>`
var noDigitText=String.raw `[^\n\d<>]*`
var htmlTag=String.raw `<[^\n<>]+>`
return new RegExp(String.raw `<${headerTag}>`+String.raw `\s*([^\n,]*[^\s,]),.*?`+String.raw `(${score})`+String.raw `(?=`+String.raw `${noDigitText}`+String.raw `(?:(?:${strikethrough}|${htmlTag})${noDigitText})*`+String.raw `</${headerTag}>`+String.raw `)`)})();var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}
function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))
body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)
valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,})});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)
lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<i>'+a.language+'</i>').text().toLowerCase();languages[lang]=languages[lang]||{lang:a.language,user:a.user,size:a.size,link:a.link,uniq:lang}});var langs=[];for(var lang in languages)
if(languages.hasOwnProperty(lang))
langs.push(languages[lang]);langs.sort(function(a,b){if(a.uniq>b.uniq)return 1;if(a.uniq<b.uniq)return-1;return 0});for(var i=0;i<langs.length;++i)
{var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
Jawaban:
Hexagony , panjang sisi
1716,816705 byteCobalah online!
Inilah yang terlihat seperti dilipat:
Ah well, ini cukup rollercoaster emosional ... Saya berhenti menghitung berapa kali saya beralih antara "haha, ini gila" dan "tunggu, jika saya melakukan ini seharusnya benar-benar bisa dilakukan". Kendala yang dikenakan pada kode oleh aturan tata letak Hexagony adalah ... parah.
Dimungkinkan untuk mengurangi panjang sisi sebesar 1 atau 2 tanpa mengubah pendekatan umum, tetapi itu akan sulit (hanya sel dengan
#
saat ini tidak digunakan dan tersedia untuk decoder). Saat ini saya juga sama sekali tidak tahu bagaimana pendekatan yang lebih efisien, tetapi saya yakin ada. Saya akan memikirkan hal ini selama beberapa hari ke depan dan mungkin mencoba bermain golf dengan panjang satu sisi, sebelum saya menambahkan penjelasan dan segalanya.Yah setidaknya, saya sudah membuktikan itu mungkin ...
Beberapa skrip CJam untuk referensi saya di masa depan:
sumber
!
dan kemudian dengan mirror/
pada baris terakhir ke-2 memasuki decoder untuk mencetak kode decoder untuk menyelesaikan quine. Ini memiliki penggunaan yang ajaib<
dan>
yang bertuliskan bilangan bulat sangat besar multiline dan membangun area untuk menyimpan decoder. Saya benar-benar ingin tahu "lusinan pendekatan" apa yang sedang dipertimbangkan?MySQL, 167 karakter
Tepat sekali. :-)
Saya benar-benar menulis ini sendiri. Awalnya diposting di situs saya .
sumber
GolfScript, 2 byte
(note trailing newline) Ini mendorong angka 1 ke tumpukan. Di akhir program, GolfScript mencetak semua item dalam tumpukan (tanpa spasi di antaranya), lalu mencetak baris baru.
Ini adalah quine sejati (seperti yang tercantum dalam pertanyaan), karena sebenarnya mengeksekusi kode; tidak hanya "membaca file sumber dan mencetaknya" (tidak seperti pengiriman PHP).
Untuk contoh lain, inilah program GolfScript untuk dicetak
12345678
:9
: tekan 9 ke tumpukan,
: mengkonsumsi 9 sebagai argumen, dorong array[0 1 2 3 4 5 6 7 8]
ke tumpukan(
: mengkonsumsi array sebagai argumen, dorong array[1 2 3 4 5 6 7 8]
dan item0
ke stack;
: buang item atas tumpukanTumpukan sekarang berisi array
[1 2 3 4 5 6 7 8]
. Ini akan ditulis ke output standar tanpa spasi antara elemen, diikuti oleh baris baru.sumber
1
bukan quine di GolfScript: itu output1\n
, di mana\n
menunjukkan baris baru. Namun, program dua-char1\n
adalah quine.\n
mungkin juga?Brain-Flak ,
9.8e5801.3e5629.3e51612818110244452433242404200418038523656361635402485 + 3 = 2488 byteSekarang cocok di alam semesta yang bisa diamati!
Cobalah online!
Penjelasan
Quine ini berfungsi seperti kebanyakan Quine dalam bahasa esoteris; ini memiliki dua bagian encoder dan decoder. Encoder adalah semua tanda kurung di awal dan decoder adalah bagian yang lebih kompleks di bagian paling akhir.
Cara naif pengkodean program adalah dengan menempatkan nilai ASCII dari setiap karakter dalam dekoder ke stack. Ini bukan ide yang sangat bagus karena Brain-Flak hanya menggunakan 8 karakter (
()<>[]{}
) sehingga Anda akhirnya membayar beberapa byte untuk mengkodekan informasi yang sangat sedikit. Gagasan yang lebih cerdas, dan yang digunakan sampai sekarang adalah untuk menetapkan masing-masing dari 8 kawat gigi ke angka yang jauh lebih kecil (1-8) dan mengonversinya ke nilai ASCII dengan dekoder kami. Ini bagus karena harganya tidak lebih dari 18 byte untuk mengkodekan karakter yang bertentangan dengan 252 sebelumnya.Namun program ini tidak melakukan keduanya. Itu bergantung pada fakta bahwa program Brain-Flak semua seimbang untuk menyandikan 8 kawat gigi dengan angka hingga 5. Ia mengkodekan mereka sebagai berikut.
Semua kurung kurawal diberikan 1 karena kita dapat menggunakan konteks untuk menentukan yang mana yang perlu kita gunakan dalam skenario tertentu. Ini mungkin terdengar seperti tugas yang menakutkan untuk program Brain-Flak, tetapi sebenarnya tidak. Ambil contoh pengkodean berikut dengan kurung terbuka yang diterjemahkan dan kurung dekat diganti dengan
.
:Mudah-mudahan Anda dapat melihat bahwa algoritme ini cukup sederhana, kami membaca dari kiri ke kanan, setiap kali kami menemukan penahan terbuka, kami mendorong penahan dekat ke tumpukan imajiner dan ketika kami menjumpai,
.
kami memunculkan nilai teratas dan meletakkannya di tempat.
. Pengkodean baru ini menyelamatkan kita sejumlah besar byte dalam encoder sementara kita hanya kehilangan beberapa byte pada decoder.Penjelasan tingkat rendah
Bekerja dalam proses
sumber
Prelude ,
51574514234817611537664569535423241214184178175169148142136133 byteTerima kasih kepada Sp3000 untuk menghemat 3 byte.
Ini agak lama ...(oke, masih panjang ... setidaknya itu mengalahkan quineBrainfuckC # terpendek yangdiketahuitentang tantangan ini sekarang) tapi itu quine pertama yang saya temukan sendiri (kiriman Lua dan Julia saya benar-benar hanya terjemahan dari teknik standar quine ke bahasa lain) dan sejauh yang saya tahu tidak ada yang menulis quine di Prelude sejauh ini, jadi saya sebenarnya cukup bangga dengan ini. :)Jumlah digit yang besar itu hanyalah sebuah pengkodean dari kode inti, itulah sebabnya quine begitu panjang.
Digit yang menyandikan quine telah dibuat dengan skrip CJam ini .
Ini membutuhkan penerjemah yang memenuhi standar, yang mencetak karakter (menggunakan nilai sebagai kode karakter). Jadi, jika Anda menggunakan juru bahasa Python, Anda harus mengaturnya
NUMERIC_OUTPUT = False
.Penjelasan
Pertama, beberapa kata tentang Prelude: setiap baris dalam Prelude adalah "suara" terpisah yang memanipulasi tumpukannya sendiri. Tumpukan ini diinisialisasi ke jumlah 0 tak hingga. Program ini dieksekusi kolom demi kolom, di mana semua perintah dalam kolom dieksekusi "secara bersamaan" berdasarkan negara stack sebelumnya. Digit didorong ke tumpukan secara individual, sehingga
42
akan mendorong a4
, lalu a2
. Tidak ada cara untuk mendorong angka yang lebih besar secara langsung, Anda harus menambahkannya. Nilai dapat disalin dari tumpukan yang berdekatan denganv
dan^
. Loop gaya Brainfuck dapat diperkenalkan dengan tanda kurung. Lihat tautan di informasi utama untuk informasi lebih lanjut.Ini adalah ide dasar quine: pertama kita dorong banyak digit ke stack yang mengkodekan inti quine. Inti kata kemudian mengambil angka-angka itu, menerjemahkannya untuk mencetak dirinya sendiri dan kemudian mencetak angka-angka seperti yang muncul dalam kode (dan trailing
)
).Ini sedikit rumit oleh kenyataan bahwa saya harus membagi inti lebih dari beberapa baris. Awalnya saya memiliki pengkodean di awal, tetapi kemudian diperlukan untuk mengisi garis lain dengan jumlah spasi yang sama. Inilah sebabnya mengapa skor awal semuanya sangat besar. Sekarang saya telah menempatkan pengkodean di bagian akhir, tetapi ini berarti bahwa saya pertama-tama harus melewatkan inti, kemudian mendorong angka, dan melompat kembali ke awal dan melakukan pencetakan.
Pengkodean
Karena kode hanya memiliki dua suara, dan dan adjacency adalah siklik,
^
danv
identik. Itu bagus karenav
sejauh ini memiliki kode karakter terbesar, jadi menghindarinya dengan selalu menggunakan^
membuat penyandian menjadi lebih sederhana. Sekarang semua kode karakter berada dalam kisaran 10 hingga 94, inklusif. Ini berarti saya dapat menyandikan setiap karakter dengan tepat dua digit desimal. Namun ada satu masalah: beberapa karakter, terutama linefeed, memiliki nol dalam representasi desimal mereka. Itu masalah karena nol tidak mudah dibedakan dari bagian bawah tumpukan. Untungnya ada perbaikan sederhana untuk itu: kami mengimbangi kode karakter dengan2
, jadi kami memiliki kisaran 12 hingga 96, inklusif, yang masih cocok dengan nyaman dalam dua digit desimal. Sekarang dari semua karakter yang dapat muncul dalam program Prelude,0
memiliki 0 dalam representasinya (50), tetapi kami benar-benar tidak perlu0
sama sekali. Jadi itulah pengkodean yang saya gunakan, mendorong setiap digit satu per satu.Namun, karena kami bekerja dengan tumpukan, representasi didorong mundur. Jadi jika Anda melihat akhir dari pengkodean:
Membagi menjadi pasangan dan mundur, lalu kurangi dua, dan kemudian cari kode karakter:
di mana
32
sesuai dengan spasi. Inti melakukan transformasi ini, dan kemudian mencetak karakter.Inti
Jadi mari kita lihat bagaimana angka-angka ini diproses. Pertama, penting untuk dicatat bahwa tanda kurung yang cocok tidak harus berada pada baris yang sama di Prelude. Hanya ada satu tanda kurung per kolom, sehingga tidak ada ambiguitas di mana tanda kurung menjadi satu. Secara khusus, posisi vertikal tanda kurung tutup selalu tidak relevan - tumpukan yang diperiksa untuk menentukan apakah loop berakhir (atau dilewati seluruhnya) akan selalu menjadi yang memiliki
(
.Kami ingin menjalankan kode persis dua kali - pertama kali, kami melewatkan inti dan mendorong semua angka di akhir, kedua kalinya kami menjalankan inti. Faktanya, setelah kita menjalankan inti, kita akan mendorong semua angka itu lagi, tetapi karena loop berakhir setelah itu, ini tidak relevan. Ini memberikan kerangka berikut:
Pertama, kita dorong a
7
ke suara pertama - jika kita tidak melakukan ini, kita tidak akan pernah memasuki loop (untuk kerangka itu hanya penting bahwa ini bukan nol ... mengapa khusus7
kita akan lihat nanti) . Lalu kita memasuki loop utama. Sekarang, suara kedua berisi loop lain. Pada pass pertama, loop ini akan dilewati karena tumpukan kedua kosong / hanya berisi 0s. Jadi kami melompat langsung ke pengkodean dan mendorong semua angka itu ke tumpukan. The7
kita didorong ke stack pertama masih ada, sehingga berulang lingkaran.Kali ini, ada juga
7
pada stack kedua, jadi kami memasukkan loop pada suara kedua. Putaran pada suara kedua dirancang sedemikian rupa sehingga tumpukan kosong lagi di akhir, sehingga hanya berjalan sekali. Ini juga akan menghabiskan tumpukan pertama ... Jadi ketika kita meninggalkan loop pada suara kedua, kita mendorong semua digit lagi, tetapi sekarang7
pada tumpukan pertama telah dibuang, sehingga loop utama berakhir dan program berakhir.Selanjutnya, mari kita lihat loop pertama di inti aktual. Melakukan sesuatu secara bersamaan dengan
(
atau)
cukup menarik. Saya telah menandai lingkaran di sini dengan=
:Itu berarti kolom yang berisi
(
tidak dianggap sebagai bagian dari loop (karakter di sana hanya dieksekusi sekali, dan bahkan jika loop dilewati). Tetapi kolom yang berisi)
adalah bagian dari loop dan dijalankan sekali pada setiap iterasi.Jadi kita mulai dengan satu
-
, yang mengubah7
tumpukan pertama menjadi-7
... lagi, lebih lanjut tentang itu nanti. Adapun loop yang sebenarnya ...Loop berlanjut sementara tumpukan angka belum dikosongkan. Ini memproses dua digit sekaligus. Tujuan dari loop ini adalah untuk memecahkan kode pengodean, mencetak karakter, dan pada saat yang sama menggeser tumpukan angka ke suara pertama. Jadi bagian ini dulu:
Kolom pertama memindahkan 1 digit ke suara pertama. Kolom kedua menyalin 10 digit ke suara pertama sementara juga menyalin kembali 1 digit ke suara kedua. Kolom ketiga bergerak yang menyalin kembali ke suara pertama. Itu berarti suara pertama sekarang memiliki 1 digit dua kali dan 10 digit di antaranya. Suara kedua hanya memiliki salinan 10 digit lainnya. Itu berarti kita dapat bekerja dengan nilai-nilai di atas tumpukan dan pastikan ada dua salinan yang tersisa di tumpukan pertama untuk nanti.
Sekarang kita memulihkan kode karakter dari dua digit:
Bagian bawah adalah lingkaran kecil yang hanya mengurangi 10 digit menjadi nol. Untuk setiap iterasi kami ingin menambahkan 10 ke atas. Ingat bahwa yang pertama
2
bukan bagian dari loop, jadi loop body sebenarnya+8+2
yang menambahkan 10 (menggunakan2
dorongan sebelumnya) dan mendorong yang lain 2. Jadi ketika kita selesai dengan loop, tumpukan pertama sebenarnya memiliki basis- Nilai 10 dan lainnya 2. Kami kurangi 2 dengan-
memperhitungkan offset dalam pengodean dan mencetak karakter dengan!
. The#
hanya membuang nol pada akhir loop bawah.Setelah loop ini selesai, tumpukan kedua kosong dan tumpukan pertama menampung semua digit dalam urutan terbalik (dan a
-7
di bagian bawah). Sisanya cukup sederhana:Ini adalah loop kedua dari inti, yang sekarang mencetak kembali semua digit. Untuk melakukannya, kita perlu 48 setiap digit untuk mendapatkan kode karakter yang benar. Kami melakukan ini dengan loop sederhana yang menjalankan
8
waktu dan menambahkan6
setiap waktu. Hasilnya dicetak dengan!
dan8
pada akhirnya adalah untuk iterasi berikutnya.Jadi bagaimana dengan
-7
? Ya,48 - 7 = 41
yang merupakan kode karakter)
. Sihir!Akhirnya, ketika kita selesai dengan loop itu kita membuang,
8
kita hanya mendorong dengan#
untuk memastikan bahwa kita meninggalkan loop luar pada suara kedua. Kami mendorong semua digit lagi dan program berakhir.sumber
Hexagony , panjang sisi 11, 314 byte
Cobalah online!
Versi yang lebih lama:
Hexagony , panjang sisi 11, 330 byte
Cobalah online!
Encoder: Cobalah online!
Program ini kira-kira setara dengan kode Python ini: Coba online!
Kode dibuka:
Dua
.
s membutuhkan 1 bit. Setiap karakter lain membutuhkan 1 bit dan basis-97 digit.Penjelasan
Klik pada gambar untuk ukuran lebih besar. Setiap bagian penjelasan memiliki kode Python yang sesuai untuk membantu pemahaman.
Bagian data
Alih-alih struktur kompleks yang digunakan dalam beberapa jawaban lain (dengan
<
,"
dan beberapa hal lain), saya hanya membiarkan IP melewati bagian bawah.Pertama, IP dijalankan melalui banyak angka dan no-op's (
.
) dan mirror (\
). Setiap digit ditambahkan ke nomor dalam memori, sehingga pada akhirnya nilai memori sama dengan angka pada awal program.!
mencetaknya,dan
$
melompat melalui yang berikutnya>
.Mulai dari
<
. Jika nilai memorimem
salah (<= 0
, yaitu, kondisimem > 0
tidak terpenuhi), kami telah selesai mencetak program, dan harus keluar. IP akan mengikuti jalur atas.(biarkan IP berjalan
di seluruh duniaselama sekitar 33 perintah sebelum memukul@
(yang mengakhiri program) karena meletakkannya di tempat lain menimbulkan beberapa byte tambahan)Jika itu benar, kita mengikuti jalan yang lebih rendah, dialihkan beberapa kali dan menjalankan beberapa perintah lagi sebelum mencapai persyaratan lain.
Sekarang memori terlihat seperti ini:
Jika nilainya benar:
kode berikut dijalankan:
Lihat penjelasan rinci tentang
Q4
di MartinEnder ini HelloWorld Hexagony jawaban . Singkatnya, kode ini mencetak.
dua kali.Awalnya saya berencana untuk mencetak ini
.
sekali. Ketika saya menemukan ini (mencetak.
dua kali) dan menerapkannya, sekitar 10 digit disimpan.Kemudian,
Berikut adalah fakta penting yang saya sadari yang menyelamatkan saya sekitar 14 digit: Anda tidak perlu berada di tempat Anda memulai.
Untuk memahami apa yang saya katakan, mari kita analogi BF. (lewati ini jika Anda sudah mengerti)
Diberi kode
Dengan asumsi kita membiarkan
a
menjadi nilai sel saat ini danb
menjadi nilai sel kanan, terjemahan langsung dari ini ke BF adalah:Namun, perhatikan bahwa kita tidak perlu berada pada posisi yang sama sepanjang waktu selama program. Kita dapat membiarkan nilai
a
menjadi apa pun kita di awal setiap iterasi, lalu kita memiliki kode ini:yang beberapa byte lebih pendek.
Juga, perilaku pembungkus sudut juga menyelamatkan saya dari memiliki
\
cermin di sana - tanpanya saya tidak akan bisa masuk ke digit (+2 digit untuk\
dirinya sendiri dan +2 digit untuk tidak berpasangan.
di sebelah kanannya, belum lagi bendera)(detail:
\
yang mencerminkannya, sekarang ia mengarah ke kanan)
Jika nilai (dari operasi mod 2 di atas) adalah falsy (nol), maka kita mengikuti jalur ini:
Saya tidak akan menjelaskan terlalu rinci di sini, tetapi offset sebenarnya tidak tepat
33
, tetapi kongruen dengan33
mod256
. Danchr
memiliki implisit% 256
.sumber
Vim, 11 byte
iq"qP<Esc>
: Masukkan secara manual duplikat teks yang harus berada di luar rekaman.q"
danhqP
: Catat bagian dalam langsung ke""
register yang tidak disebutkan namanya , sehingga dapat ditempelkan di tengah. Inih
adalah satu-satunya reposisi yang diperlukan; jika Anda memasukkannya ke dalam makro, itu akan ditempelkan ke hasilnya.Sunting
Catatan tentang rekaman dengan
q"
: Daftar yang tidak disebutkan namanya""
adalah hal yang lucu. Ini sebenarnya bukan register yang benar seperti yang lain, karena teks tidak disimpan di sana. Ini sebenarnya adalah penunjuk ke beberapa register lain (biasanya"-
untuk menghapus tanpa baris baru,"0
untuk menarik, atau"1
untuk menghapus dengan baris baru).q"
melanggar aturan; sebenarnya menulis untuk"0
. Jika Anda""
sudah menunjuk ke beberapa register selain"0
,q"
akan menimpa"0
tetapi""
tidak berubah. Ketika Anda memulai Vim baru,""
secara otomatis menunjuk"0
, sehingga Anda baik-baik saja dalam hal itu.Pada dasarnya, Vim aneh dan bermasalah.
sumber
y
atau sesuatu sebelum berlari dapat membantu␛
untuk menunjukkan menekan tombol <Esc>? Bagian dari Blok Unicode<Esc>
Notasi adalah standar dalam pemetaan Vim (:help <>
) dan itulah yang digunakan vimgolf.com. Setiap vimgolfer yang berpengalaman akan digunakan untuk membacanya. Adapun unicode, saya harus menyipitkan mata untuk membaca huruf-huruf kecil, dan mereka mengaburkan metode mengetiknya dan mencari file bantuan.Cubix , 20 byte
Hampir
\o/
...Bersih :
Cobalah online
Coba di sini !
Catatan tambahan
Cerita latar belakang
Setelah terkesan dengan membaca jawaban hebat dari @ ais523 ini, saya mulai berpikir untuk bermain golf lebih lanjut. Lagi pula, ada beberapa no-ops di sana, dan itu tidak terasa sangat terkompresi. Namun, karena teknik yang digunakan oleh jawabannya (dan juga milik saya), membutuhkan kode untuk menjangkau garis penuh, penghematan setidaknya 12 byte diperlukan. Ada satu komentar dalam penjelasannya yang benar-benar membuat saya berpikir:
Kemudian, tiba-tiba, ketika saya berdiri dan berjalan pergi untuk mengambil sesuatu untuk diminum, saya tersadar: Bagaimana jika program tersebut tidak menggunakan kode karakter, melainkan angka untuk mewakili wajah teratas? Ini sangat pendek jika nomor yang kami cetak memiliki 2 digit. Cubix memiliki 3 petunjuk satu-byte untuk mendorong angka dua digit:
N
,S
danQ
, yang mendorong10
,32
dan34
masing-masing, jadi ini harus cukup Golfy, pikirku.Komplikasi pertama dengan ide ini adalah bahwa bagian atas sekarang dipenuhi dengan angka-angka yang tidak berguna, jadi kita tidak bisa menggunakannya lagi. Komplikasi kedua adalah bahwa permukaan atas memiliki ukuran yang merupakan ukuran kubus, dan itu harus memiliki ukuran genap, jika tidak satu nomor juga akan berakhir pada posisi awal dari penunjuk instruksi, yang mengarah ke tumpukan yang tercemar. Karena komplikasi ini, kode saya harus sesuai dengan ukuran kubus 2 (yang dapat berisi 'hanya' 24 byte, jadi saya harus bermain golf setidaknya 21 byte). Juga, karena wajah atas dan bawah tidak dapat digunakan, saya hanya memiliki 16 byte efektif.
Jadi saya mulai dengan memilih nomor yang akan menjadi setengah dari wajah teratas. Saya mulai dengan
N
(10), tetapi itu tidak berhasil karena pendekatan yang saya ambil untuk mencetak semuanya. Either way, saya mulai lagi dan menggunakanS
(32) untuk beberapa alasan. Itu memang menghasilkan quine yang tepat, atau begitulah menurut saya. Semuanya bekerja dengan sangat baik, tetapi tanda kutipnya hilang. Kemudian, saya sadar bahwaQ
(34) akan sangat berguna. Bagaimanapun, 34 adalah kode karakter dari kutipan ganda, yang memungkinkan kita untuk menyimpannya di stack, menghemat (2, dalam tata letak yang saya gunakan saat itu) byte yang berharga. Setelah saya mengubah rute IP sedikit, yang tersisa hanyalah latihan untuk mengisi kekosongan.Bagaimana itu bekerja
Kode dapat dibagi menjadi 5 bagian. Saya akan membahasnya satu per satu. Perhatikan bahwa kami menyandikan wajah tengah dalam urutan terbalik karena model tumpukan adalah first-in-last-out.
Langkah 1: Mencetak wajah bagian atas
Instruksi yang tidak relevan telah digantikan oleh no-ops (
.
). IP memulai baris ketiga, di paling kiri, menunjuk ke timur. Tumpukan itu (jelas) kosong.IP berakhir di posisi paling kiri di baris keempat, menunjuk ke barat, akan membungkus ke posisi paling kanan di jalur yang sama. Instruksi yang dijalankan adalah (tanpa karakter aliran kontrol):
Tumpukan hanya berisi 34, mewakili karakter terakhir dari sumber.
Langkah 2: Encode baris keempat
Bit ini melakukan apa yang Anda harapkan: enkode baris keempat. IP dimulai pada kuotasi ganda di akhir baris itu, dan menuju ke barat sambil mendorong kode karakter dari setiap karakter yang didudukinya hingga menemukan kuotasi ganda yang cocok. Kutipan ganda yang cocok ini juga merupakan karakter terakhir pada baris keempat, karena IP membungkus lagi ketika mencapai tepi kiri.
Secara efektif, IP telah memindahkan satu posisi ke kiri, dan tumpukan sekarang berisi representasi dari baris keempat dalam kode karakter dan urutan terbalik.
Langkah 3: Dorong kutipan lain
Kita perlu mendorong kutipan lain, dan cara apa yang lebih baik daripada mendaur ulang
Q
di awal program dengan mendekatinya dari kanan? Ini memiliki bonus tambahan bahwa IP langsung berjalan ke kutipan yang menyandikan baris ketiga.Inilah versi bersih untuk langkah ini. Instruksi yang tidak relevan telah digantikan oleh no-ops lagi, no-ops yang dijalankan telah digantikan oleh tagar (
#
) untuk tujuan ilustrasi dan IP dimulai pada karakter terakhir pada baris keempat.IP berakhir pada baris ketiga pada instruksi pertama, akan membungkus ke ujung garis itu karena menunjuk ke barat. Instruksi berikut (tidak termasuk aliran kontrol) dieksekusi:
Kutipan ganda ini mewakili yang ada di akhir baris ketiga.
Langkah 4: Pengkodean baris ketiga
Ini berfungsi persis sama dengan langkah 2, jadi silakan lihat di sana untuk penjelasan.
Langkah 5: Cetak tumpukan
Tumpukan sekarang berisi baris keempat dan ketiga, dalam urutan terbalik, jadi yang perlu kita lakukan sekarang adalah mencetaknya. IP dimulai pada instruksi kedua dari belakang pada baris ketiga, bergerak ke barat. Inilah bagian yang relevan dari kubus (sekali lagi, bagian yang tidak relevan telah digantikan oleh no-ops).
Ini adalah loop, seperti yang mungkin Anda lihat / harapkan. Tubuh utama adalah:
Loop berakhir jika item teratas adalah 0, yang hanya terjadi ketika tumpukan kosong. Jika loop berakhir,
@
dieksekusi, mengakhiri program.sumber
Javascript ES6 - 21 byte
Saya menyebut quine ini "The Bling Quine."
Terkadang, Anda harus bermain golf dengan gaya.
sumber
!$=_=>`!$=${$}()`()
Anda menghemat 2 byte?Invalid assignment left hand side
. Semoga berhasil :(Array.prototype.join
.alert
atauconsole.log
setelah fungsi panah dan membungkus string template dalam tanda kurung akan berhasil.Brainf * ck (755 karakter)
Ini didasarkan dari teknik yang dikembangkan oleh Erik Bosman (ejbosman di cs.vu.nl). Perhatikan bahwa "ESineine Quine!" teks sebenarnya diperlukan untuk menjadi quine!
sumber
ESultanik's Quine!
mengatur memori sebagai stack encodingESultanik's Quine!
dan seterusnya, dengan dua byte memori untuk setiap karakter (nilai ASCII offset dari 0x1F). Bit kode terakhir melewati memori, pertama secara pemrograman mereproduksi++>+++…
kode untuk setiap karakter, kemudian benar-benar mencetak karakter.Hexagony , panjang sisi
15 14 1312,616 533 456383 byteSetelah beberapa hari bermain golf dengan hati-hati, mengatur ulang putaran dan memulai lagi, akhirnya saya berhasil menurunkannya ke segi 12 segi enam.
Cobalah online!
Dibuka:
Meskipun tidak terlihat seperti kode Hexagony yang paling golf, jenis pengkodean yang saya gunakan dioptimalkan untuk menjalankan no-ops yang lebih lama, yang merupakan sesuatu yang seharusnya Anda hindari.
Penjelasan
Ini mengalahkan jawaban Hexagony sebelumnya dengan menyandikan no-ops (
.
) dengan cara yang berbeda. Sementara jawaban itu menghemat ruang dengan membuat setiap karakter lainnya menjadi.
, saya akan menyandikan nomornya no-op. Ini juga berarti sumbernya tidak harus dibatasi.Di sini saya menggunakan pengkodean basis 80, di mana angka-angka di bawah 16 menunjukkan berjalannya no-ops, dan angka antara 16 dan 79 mewakili kisaran 32 (
!
) hingga 95 (_
) (Saya baru saja menyadari bahwa saya bermain golf semua_
keluar dari saya kode lol). Beberapa pseudocode Pythonic:Jumlahnya dikodekan di paruh pertama segi enam, dengan semua
di sisi kiri dan
di sisi kanan mengarahkan pointer untuk mengkodekan angka menjadi satu sel. Ini diambil dari jawaban Martin Ender (terima kasih), karena saya tidak tahu cara yang lebih efisien.
Kemudian memasuki bagian bawah melalui
->
:!
mencetak nomor dan'
menavigasi ke sel memori kanan sebelum memulai loop.P='%
mods angka sekarang dengan 80. Jika hasilnya 0, naik ke terminating@
, lain turun dan buat sel di sebelah hasil mod dengan nilainya-16
.Setel sel ke (nilai mod + -16). Jika nilai itu negatif, naik di percabangan
>+'\
, jika tidak turun.Jika nilainya positif:
Pointer berakhir di
;-<
yang mengatur sel ke (nilai mod - -16) dan mencetaknya.Nilai negatif:
Turun ke
> ) <
bagian yang memulai loop. Ini dia terisolasi:Yang mengeksekusi kode
'Q4;="=
yang mencetak a.
(terima kasih lagi kepada Martin Ender, yang menulis sebuah program untuk menemukan kombinasi angka-huruf untuk karakter) dan bergerak kembali ke sel awal. Ia kemudian menambahkan ()
) sel nilai mod dan loop lagi, sampai nilai mod positif.Ketika itu selesai, ia bergerak ke atas dan bergabung dengan bagian lain di:
Pointer kemudian bergerak kembali ke awal loop yang lebih besar lagi
Ini dijalankan
='=:'
yang membagi angka saat ini dengan 80 dan menavigasi ke sel yang benar.Versi lama (Panjang sisi 13)
Cobalah online!
Saya pasti bisa bermain golf di sisi lain, tetapi saya harus meninggalkannya sampai besok karena sudah larut.Ternyata saya tidak sabar dan tidak bisa menunggu sampai besok.Mungkin sisi lain bisa bermain golf?:(ahhhhhhhhh aku berhasil!Saya bahkan bermain golf beberapa digit tambahan dengan basis pengkodean 77, tetapi tidak terlalu penting, karena memiliki bytecount yang sama.
sumber
PostScript, 20 karakter
Singkat dan sah. 20 karakter termasuk mengikuti baris baru.
sumber
Cubix , 45 byte
Anda dapat menguji kode ini di sini .
Program ini cukup sulit untuk diikuti, tetapi untuk memiliki kesempatan untuk melakukannya, kita perlu mulai dengan mengembangkannya menjadi sebuah kubus, seperti yang dilakukan oleh juru bahasa Cubix:
Ini adalah quine gaya Befunge, yang bekerja dengan mengeksploitasi pembungkus untuk membuat string literal "membungkus" kode yang dapat dieksekusi (dengan hanya satu
"
tanda, kode tersebut ada di dalam dan di luar kutipan pada saat yang sama, sesuatu yang menjadi mungkin ketika Anda memiliki program yang nonlinier dan nonplanar). Perhatikan bahwa ini sesuai dengan definisi kami tentang quine yang tepat, karena dua dari tanda kutip ganda tidak mengkodekan diri mereka sendiri, melainkan dihitung kemudian melalui penggunaan aritmatika.Tidak seperti Befunge, kami menggunakan empat string di sini, bukan satu. Inilah cara mereka didorong ke tumpukan;
Program dimulai di bagian atas tepi kiri, ke kanan; belok kanan dua kali (
R
), menjadikannya ke kiri di sepanjang garis ketiga dan terakhir yang membungkus seluruh kubus. Kutipan ganda cocok dengan dirinya sendiri, jadi kami mendorong seluruh baris ketiga ke tumpukan ke belakang. Kemudian eksekusi berlanjut setelah penawaran ganda.The
u
perintah melakukan U-turn ke kanan, sehingga hal berikutnya kita menjalankan adalah dari'"
seterusnya pada garis tengah. Itu mendorong a"
ke stack. Melanjutkan untuk membungkus, kami memukul<
dekat sisi kiri kubus dan bangkit kembali. Ketika mendekati dari arah ini, kita melihat"
perintah sederhana , tidak'"
, sehingga seluruh baris kedua didorong ke tumpukan di atas baris ketiga dan kutipan ganda.Kita mulai dengan mendorong
!
ke stack ('!
) dan menambahkannya ()
); ini menghasilkan kuotasi ganda tanpa memerlukan kuotasi ganda dalam kode sumber kami (yang akan mengakhiri string). Cermin (\
) mencerminkan arah eksekusi ke utara; laluW
perintah tersebut bergerak ke kiri. Ini membuat kita naik ke atas pada kolom ketujuh, yang karena ini adalah sebuah kubus, membungkus ke kiri pada baris ketiga, lalu ke bawah pada kolom ketiga. Kami menekanR
, untuk berbelok ke kanan dan ke kiri di sepanjang baris atas; lalu$
lompatiR
melalui tempat kita memasuki program, jadi eksekusi membungkus"
di akhir baris, dan kita menangkap baris pertama dalam sebuah string dengan cara yang sama seperti yang kita lakukan untuk yang kedua dan ketiga.The
^
perintah mengirim kami ke utara sampai kolom kesebelas, yang (memungkinkan untuk kubus pembungkus) ke selatan di kelima. Satu-satunya hal yang kita temui di sana adalah!
(lewati jika bukan nol; bagian atas tumpukan memang bukan nol), yang melompatio
perintah, secara efektif membuat kolom kelima sepenuhnya kosong. Jadi kita membungkus kembali keu
perintah, yang sekali lagi berbalik, tetapi kali ini kita tinggal di kolom terakhir ke selatan, yang membungkus ke kolom keempat ke utara. Namun, kami menekan kuotasi ganda selama belokan U, jadi kami menangkap seluruh kolom keempat dalam sebuah string, dari bawah ke atas. Tidak seperti kebanyakan tanda kutip ganda dalam program, yang ini tidak menutup sendiri; alih-alih, ditutup oleh"
sudut kanan atas, artinya kita menangkap string sembilan karakter...>.....
.Jadi tata letak tumpukan sekarang, dari atas ke bawah: kolom keempat; baris teratas;
"
; baris tengah;"
; baris bawah. Masing-masing diwakili pada tumpukan dengan karakter pertama terdekat bagian atas tumpukan (Cubix mendorong string di balik urutan ini, seperti yang dilakukan Befunge, tetapi setiap kali IP bergerak dalam arah yang berlawanan dengan arah membaca alami, jadi itu efektif terbalik dua kali). Dapat dicatat bahwa isi tumpukan hampir identik dengan program asli (karena kolom keempat, dan bagian utara / atas kubus, berisi karakter yang sama dalam urutan yang sama; jelas, itu dirancang seperti itu dengan sengaja).Langkah selanjutnya adalah mencetak isi tumpukan. Setelah semua dorongan, IP mengarah ke utara pada kolom keempat, sehingga menyentuh di
>
sana dan memasuki lingkaran ketat>>o;?
(yaitu "belok timur, belok timur, keluaran sebagai karakter, pop, belok kanan jika positif"). Karena baris ketujuh penuh dengan NOP, maka?
akan dibungkus kembali ke yang pertama>
, jadi ini secara efektif mendorong seluruh isi tumpukan (?
adalah no-op pada tumpukan kosong). Kami hampir mencetak seluruh program! Sayangnya, itu belum selesai; kami kehilangan penawaran ganda di bagian akhir.Setelah loop berakhir, kita merefleksikan ke garis tengah, bergerak ke barat, melalui sepasang cermin. (Kami menggunakan "sisi lain"
\
cermin sebelumnya; sekarang kami menggunakan sisi barat daya./
Cermin belum pernah digunakan sebelumnya.) Kami bertemu'!
, jadi kami menekan tanda seru (yaitu 33; kami menggunakan ASCII dan Cubix tidak membedakan antara integer dan karakter) ke stack. (Mudahnya, ini sama dengan!
yang digunakan untuk melewatio
perintah sebelumnya.) Kami menemukan sepasangR
perintah dan menggunakannya untuk membuat putaran U "manual" (R
perintah kedua di sini digunakan sebelumnya untuk mencapai yang pertama baris, jadi sepertinya paling alami untuk mencocokkanR
perintah lain di sampingnya.W
perintah, untuk menghindar ke kiri. Langkah samping menabrak tepat ke>
perintah pada baris kedua, memantul eksekusi kembali tepat di tempat itu. Jadi kita melangkah ke kiri lagi, tapi kali ini kita akan ke selatan, jadi perintah berikutnya untuk mengeksekusi adalah)
(menambahkan tanda seru menjadi tanda kutip ganda), diikuti oleho
(untuk menampilkannya). Akhirnya, eksekusi membungkus sepanjang baris kedelapan ke kolom kedua, di mana ia menemukan a@
untuk keluar dari program.Saya minta maaf untuk apostrof nyasar di baris ketiga. Itu tidak melakukan apa pun dalam versi program ini; itu adalah bagian dari ide sebelumnya yang saya miliki tetapi ternyata tidak perlu. Namun, begitu saya mendapatkan quine yang berfungsi, saya hanya ingin mengirimkannya daripada mengacaukannya lebih jauh, terutama karena menghapusnya tidak akan mengubah jumlah byte. Mengenai masalah golf di quine ini lebih lanjut, tidak akan mengejutkan saya jika ini mungkin pada 3 × 3 dengan hanya menggunakan lima baris pertama, tapi saya tidak bisa melihat cara yang jelas untuk melakukan itu, dan itu perlu bahkan pengemasan yang lebih ketat dari semua aliran kontrol bersama-sama dengan beberapa cara lain untuk mewakili permukaan atas kubus (atau memodifikasi algoritma sehingga dapat terus menggunakan kolom keempat meskipun sekarang akan panjangnya sepuluh atau sebelas karakter) .
sumber
"
adalahQ
.Python 2, 30 byte
Diambil dari sini
sumber
_
, tetapi lebih baik dibaca jika Anda menugaskannya ke huruf apa pun, yaitu s:s='s=%r;print s%%s';print s%s
Vim,
17, 14 penekanan tombolSeseorang secara acak meng-upgrade ini, jadi saya ingat itu ada. Ketika saya membacanya kembali, saya berpikir "Hei, saya bisa melakukan yang lebih baik dari itu!", Jadi saya bermain golf dua byte. Ini masih bukan yang terpendek, tapi setidaknya ini perbaikan.
Untuk waktu yang lama, saya bertanya-tanya apakah vim quine dimungkinkan. Di satu sisi, itu harus dimungkinkan, karena vim sudah selesai. Tetapi setelah mencari vim quine untuk waktu yang sangat lama, saya tidak dapat menemukannya. saya memang menemukan tantangan PPCG ini , tetapi itu tertutup dan tidak persis tentang quina literal. Jadi saya memutuskan untuk membuatnya, karena saya tidak dapat menemukannya.
Saya sangat bangga dengan jawaban ini, karena dua pertama :
Ini adalah quine pertama yang pernah saya buat, dan
Sejauh yang saya tahu, ini adalah vim-quine pertama di dunia pernah diterbitkan! Saya bisa salah tentang ini, jadi jika Anda mengetahuinya, beri tahu saya.
Jadi, setelah perkenalan yang panjang itu, ini dia:
Cobalah online!
Perhatikan bahwa ketika Anda mengetik ini, itu akan menampilkan
<esc>
keystroke sebagai^[
. Ini masih akurat, karena^[
mewakili0x1B
, yang lolos di ASCII , dan cara vim secara internal mewakili<esc>
kuncinya.Perhatikan juga , bahwa pengujian ini mungkin gagal jika Anda memuat sesi vim yang ada. Saya menulis sebuah tip jawaban yang menjelaskan bahwa di sini , jika Anda menginginkan informasi lebih lanjut, tetapi pada dasarnya Anda perlu meluncurkan vim with
atau ketik
qqq
sebelum menjalankan ini.Penjelasan:
Di samping catatan, jawaban ini mungkin merupakan rekor dunia untuk sebagian besar 'q's dalam jawaban PPCG, atau sesuatu.
sumber
2i2i<esc>
sangat dekat. Saya merasa harus ada sesuatu yang bisa saya lakukan untuk membuat ini bekerja.<Esc>
tersirat dalam V, sehingga berfungsi . Sayangnya itu juga menambahkan baris baru, itulah sebabnya saya belum mempostingnya.q"iq"qbP<Esc>qbP
adalah 11. Setelah Anda menempatkan ini di reddit , saya menyelidiki pelanggaran di sini dan memutuskan untuk membuat akun. Ini adalah jawaban yang saya posting di sana.Hilang ,
120 116 98 96 76 7066 byteEdit: yay, di bawah 100
Sunting: Menyimpan banyak byte dengan beralih ke semua yang ada
/
di baris terbawahCobalah online! + verifikasi itu deterministik untuk semua kemungkinan keadaan
Lost adalah bahasa 2D di mana posisi awal dan arahnya sepenuhnya acak. Ini berarti harus ada banyak pengecekan kesalahan pada setiap tahap untuk memastikan Anda mendapat penunjuk instruksi yang benar, dan itu bukan salah satu yang baru saja berkeliaran secara acak.
Penjelasan:
Semua
/
s pada baris bawah ada untuk memastikan bahwa semua pointer yang bertelur dalam arah vertikal atau pada garis bawah disalurkan ke arah yang benar. Dari sana, mereka berakhir di beberapa tempat yang berbeda, tetapi semuanya berakhir tepat diYang menghapus semua angka bukan nol dalam tumpukan. The
([
setelah itu membersihkan apapun 0s ekstra juga.Di tengah-tengah jelas, itu hits
%
, yang mematikan 'keselamatan', yang memungkinkan program untuk berakhir ketika hits@
(tanpa ini, program bisa berakhir segera jika pointer dimulai di@
).Dari sana ia melakukan quine bahasa 2D yang cukup sederhana, dengan membungkus string literal (
"
) di sekitar baris pertama, mendorong"
karakter dengan menduplikasi spasi (:2+
) dan kemudian baris baru (52*
). Untuk baris kedua, ia menciptakan/
karakter (95*2+
) dan menduplikatnya banyak (>::1?:[:[[[[
), sebelum akhirnya berakhir di@
dan mencetak tumpukan secara implisit. The?1
adalah untuk menghentikan proses dari menciptakan terlalu banyak 0s jika pointer memasuki awal, menghemat harus membersihkan mereka nanti.Saya menyimpan 20 byte di sini dengan membuat baris terakhir semua karakter yang sama, yang berarti saya bisa langsung dari proses duping ke akhir
@
.Penjelasan tentang proses pembodohan:
[
adalah karakter yang dikenal sebagai 'Pintu'. Jika pointer menyentuh sisi datar dari[
atau]
, itu mencerminkan, kalau tidak melewatinya. Setiap kali pointer berinteraksi dengan Pintu, itu beralih ke tipe yang berlawanan. Dengan menggunakan pengetahuan ini kita dapat membuat formula sederhana untuk berapa kali suatu instruksi akan dieksekusi dalam sebuah>:[
blok.Tambahkan jumlah instruksi awal. Untuk masing-masing
[
, tambahkan 2 kali jumlah instruksi di sebelah kiri itu. Sebagai contoh>::::[:[[[
, kita mulai dengan 5 sebagai jumlah awal. Pintu pertama memiliki 4 instruksi dupe, jadi kami menambahkan 4 * 2 = 8 hingga 5 untuk mendapatkan 13. Tiga Pintu lainnya memiliki 5 dupes di sebelah kiri mereka, jadi kami menambahkan 3 * (5 * 2) = 30 hingga 13 untuk mendapatkan 43 instruksi dupe dieksekusi, dan ada 44>
s pada stack. Proses yang sama dapat diterapkan pada instruksi lain, seperti(
mendorong sejumlah besar item dari stack ke cakupan, atau seperti yang digunakan di sini, untuk menghapus item dari stack.Trik yang saya gunakan di sini untuk menghindari pembodohan terlalu banyak adalah
1?
. Jika karakternya adalah 0,?
itu tidak melewatkan angka 1, yang berarti itu menduplikasi 1 untuk sisa dupe. Ini membuatnya lebih mudah untuk menghapus tumpukan nanti.sumber
Ini adalah dua quine Ruby terpendek dari SO :
dan
Jangan tanya saya bagaimana yang kedua bekerja ...
sumber
<<2
memulai string pada baris berikutnya, dan*2
mengulangi stringFission , 6 byte
Tampaknya ini sekarang quine terpendek "tepat" di antara jawaban-jawaban ini.
Penjelasan
Aliran kendali dimulai
R
dengan satu(1,0)
atom yang benar. Ini menyentuh"
mode cetak toggling dan kemudian membungkus garis, mencetak'!+OR
sebelum memukul yang sama"
lagi dan keluar dari mode cetak.Itu meninggalkan
"
dirinya untuk dicetak. Cara terpendek adalah'"O
(di mana'"
mengatur massa atom ke kode karakter"
danO
mencetak karakter dan menghancurkan atom), tetapi jika kita melakukan ini"
akan mengganggu mode cetak. Jadi alih-alih, kami menetapkan nilai atom ke'!
(satu kurang dari"
), lalu menambahkan+
dan kemudian mencetak hasilnya denganO
.Alternatif
Berikut adalah beberapa alternatif, yang lebih panjang, tetapi mungkin teknik mereka menginspirasi seseorang untuk menemukan versi yang lebih pendek menggunakannya (atau mungkin mereka akan lebih berguna dalam quines umum tertentu).
8 byte menggunakan
J
umpSekali lagi, kode dimulai pada
R
. The@
swap massa dan energi untuk memberikan(0,1)
. Oleh karena ituJ
membuat atom melompatiO
lurus ke atas"
. Kemudian, seperti sebelumnya, semua kecuali"
dicetak dalam mode string. Setelah itu, atom menyentuh|
untuk membalikkan arahnya, dan kemudian melewati'"O
pencetakan"
. Ruang agak mengganggu, tetapi tampaknya perlu, karena kalau tidak,'
akan membuat atom memperlakukan|
sebagai karakter, bukan cermin.8 byte menggunakan dua atom
Ini memiliki dua atom, mulai dari kiri ke
L
kanan dan ke kanan dariR
. Atom yang tertinggal akan mendapatkan nilainya'"
yang kemudian dicetak denganO
(dan atomnya dihancurkan). Untuk atom yang tepat, kita menukar massa dan energi lagi, melompatiO
untuk mencetak sisa kode dalam mode cetak. Setelah itu nilainya ditentukan oleh'L
tetapi itu tidak masalah karena atom kemudian dibuang;
.sumber
'!+
mengkodekan"
.|R@JO"'
berhasil, atau apakah Anda masih membutuhkan ruang setelah itu'
?'
pertama.JavaScript lintas-browser (41 karakter)
Ini bekerja di 5 browser web teratas (IE> = 8, Mozilla Firefox, Google Chrome, Safari, Opera). Masukkan ke dalam konsol pengembang di salah satu di antaranya:
Ini bukan "curang" - tidak seperti quine byte tunggal Chris Jester-Young, karena dapat dengan mudah dimodifikasi untuk menggunakan
alert()
fungsi (biaya 14 karakter):Atau dikonversi ke bookmarklet (seharga 22 karakter):
sumber
C,
6460 byteSejauh ini, ini adalah C Cine terpendek yang dikenal. Ada karunia yang diperluas jika Anda menemukan yang lebih pendek.
Ini berfungsi di GCC , Dentang , dan TCC dalam POSIX lingkungan . Ini memunculkan perilaku berlebihan yang tidak terdefinisi dengan mereka semua.
Hanya untuk bersenang-senang, inilah repo yang berisi semua pertanyaan C yang saya tahu. Silakan garpu / PR jika Anda menemukan atau menulis yang berbeda yang menambahkan sesuatu yang baru dan kreatif dari yang sudah ada.
Perhatikan bahwa ini hanya berfungsi di lingkungan ASCII . Ini berfungsi untuk EBCDIC , tetapi masih membutuhkan POSIX . Selamat mencoba menemukan lingkungan POSIX / EBCDIC: P
Bagaimana itu bekerja:
main(s)
main
argumen penyalahgunaan , mendeklarasikan variabel yang sebenarnya tidak diketiks
. (Catatan yangs
sebenarnya bukan yang tidak diketik, tetapi karena kompiler yang terdaftar secara otomatis meng-cast-nya seperlunya, mungkin juga *.)printf(s="..."
sets
ke string yang disediakan dan meneruskan argumen pertama keprintf
.s
diatur kemain(s){printf(s=%c%s%1$c,34,s);}
.%c
diatur ke ASCII34
,"
. Ini memungkinkan quine. Sekarangs
terlihat seperti ini:main(s){printf(s="%s%1$c,34,s);}
.%s
diatur kes
dirinya sendiri, yang dimungkinkan karena # 2. Sekarangs
terlihat seperti ini:main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}%1$c,34,s);}
.%1$c
diatur ke ASCII 34"
,printf
argumen ** pertama. Sekarangs
terlihat seperti ini:main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}
... yang kebetulan merupakan kode sumber asli.
* Contoh berkat @Pavel ** argumen pertama setelah penentu
format - dalam hal ini
s
,. Tidak mungkin untuk merujuk penspesifikasi format.Saya pikir tidak mungkin ini akan menjadi lebih pendek dengan pendekatan yang sama. Jika
printf
specifier format dapat diakses melalui$
, ini akan bekerja selama 52 byte:sumber
s
bertipeint
, bukan "variabel yang tidak diketik".s=3
jelas tidak akan berfungsi karena Anda harus meneruskan string dua kaliprintf
.Java, 528 byte:
Solusi Java dengan pendekatan asli:
dalam bentuk yang mudah dibaca:
sumber
if(++i==92)
,a*
karena array tidak keluar di Jawa, itu C. Beberapa bagian lain untuk golf :, diimport java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("abc",36);int i=0;for(int c:b.toByteArray())System.out.printf("%s%c",++i==92?b.toString(36):"",c);}}
manaabc
akan menjadi String nomor ajaib yang baru dihitung. Di java 8+ juga dimungkinkan untuk berubahclass a{public static void main
menjadiinterface a{static void main
, dan di Java 10+ juga dimungkinkan untuk berubahimport java.math.*;
danBigInteger b=new BigInteger(
kevar b=new java.math.BigInteger(
.Ayam , 7
Tidak, ini tidak langsung digaungkan :)
sumber
chicken
!Retina ,
201497 byteSebelum kita mulai, saya ingin menyebutkan solusi sepele dari file yang berisi satu
0
. Dalam hal ini Retina akan mencoba menghitung0
s pada input kosong, yang hasilnya juga0
. Saya tidak akan menganggap itu quine yang tepat.Jadi ini yang benar:
Cobalah online!
Atau, kita bisa menggunakan
;
bukan>
.Penjelasan
Program ini terdiri dari penggantian tunggal yang kami cetak dua kali.
Di baris pertama,
`
memisahkan konfigurasi dari regex, sehingga regex kosong. Oleh karena itu string kosong (yaitu input yang tidak ada) diganti dengan baris kedua, kata demi kata.Untuk mencetak hasilnya dua kali, kami membungkusnya dalam dua tahap output. Yang dalam,
\
mencetak hasilnya dengan linefeed jejak, dan yang luar,>
,, mencetak tanpa satu.Jika Anda agak terbiasa dengan Retina, Anda mungkin bertanya-tanya apa yang terjadi pada output implisit Retina. Keluaran implisit Retina bekerja dengan membungkus tahap akhir suatu program dalam tahap keluaran. Namun, Retina tidak melakukan ini, jika tahap akhir sudah merupakan tahap keluaran. Alasan untuk itu adalah bahwa dalam program normal lebih bermanfaat untuk dapat mengganti tahap keluaran implisit dengan yang khusus seperti
\
atau;
untuk satu byte (daripada harus menyingkirkan yang implisit dengan.
bendera juga). Sayangnya, perilaku ini akhirnya menghabiskan biaya dua byte untuk quine.sumber
Javascript (36 karakter)
Ini, AFAICT, quine javascript terpendek yang diposting sejauh ini.
sumber
a
, Anda dapat mengakses isinya dengan menelepona.toString
.a
persis sama seperti yang telah ditulis di atas. Namun, output dari kode ini cenderung menjadi quine pada implementasi JavaScript apa pun.!function a(){alert("!"+a+"()")}()
.(a=()=>alert(
($ {a})))()
GolfScript, 8 byte
Saya selalu berpikir quine GolfScript terpendek (benar) adalah 9 byte:
Di mana trafeed linefeed diperlukan karena GolfScript mencetak linefeed trailing secara default.
Tapi saya baru saja menemukan quine 8-byte, yang bekerja persis di sekitar batasan linefeed:
Cobalah online!
Jadi tangkapannya adalah bahwa GolfScript tidak mencetak linefeed baris, tetapi mencetak isi
n
di akhir program. Hanya saja,n
berisi linefeed untuk memulai. Jadi idenya adalah untuk menggantinya dengan string":n`"
, dan kemudian menggantinya , sehingga salinan pada tumpukan dicetak dengan tanda kutip dan salinan disimpan dalamn
cetakan tanpa.Seperti yang ditunjukkan oleh Thomas Kwa, 7-byte CJam quine juga dapat disesuaikan dengan solusi 8-byte:
Sekali lagi, kita perlu linefeed tambahan.
sumber
Labyrinth ,
12411053 byteBerkat Sp3000 untuk bermain golf 9 byte, yang memungkinkan saya untuk bermain golf 7 byte lainnya.
Cobalah online!
Penjelasan
Labirin 101:
n*10 + <digit>
. Ini memungkinkan penumpukan yang mudah dalam jumlah besar. Untuk memulai nomor baru, gunakan_
, yang mendorong nol."
adalah no-ops.Pertama, saya akan menjelaskan versi yang sedikit lebih sederhana yaitu satu byte lebih lama, tetapi sedikit kurang magis:
Cobalah online!
Gagasan utamanya adalah untuk menyandikan isi utama sumber dalam satu angka, menggunakan basis yang besar. Angka itu kemudian dapat dengan mudah dicetak kembali sebelum diterjemahkan untuk mencetak sisa kode sumber. Penguraiannya hanyalah aplikasi berulang
divmod base
, di mana mencetakmod
dan terus bekerja dengandiv
sampai nol.Dengan menghindari
{}
, kode karakter tertinggi yang kita perlukan adalah_
(95) sehingga basis 96 cukup (dengan menjaga basis rendah, angka di awal lebih pendek). Jadi yang ingin kita enkode adalah ini:Mengubah karakter-karakter tersebut menjadi poin-poin kode mereka dan memperlakukan hasilnya sebagai angka dasar-96 (dengan digit paling signifikan sesuai
!
dan yang paling signifikan.
, karena itulah urutan di mana kita akan membongkar nomor itu), kita dapatkanSekarang kode dimulai dengan trik yang cukup keren (jika boleh saya katakan demikian) yang memungkinkan kita untuk mencetak kembali encoding dan menyimpan salinan lain untuk decoding dengan overhead yang sangat sedikit: kita memasukkan nomor ke dalam kode secara terbalik. Saya menghitung hasilnya dengan skrip CJam ini. Jadi mari kita beralih ke kode aktual. Inilah awalnya:
IP dimulai di sudut kiri atas, menuju ke timur. Sementara itu berjalan di atas angka-angka itu, itu hanya membangun nomor itu di atas tumpukan. Angka itu sendiri sama sekali tidak berarti, karena itu kebalikan dari yang kita inginkan. Ketika IP menyentuh
!
, yang muncul nomor ini dari tumpukan dan mencetaknya. Itu semua yang ada untuk mereproduksi pengkodean dalam output.Tetapi sekarang IP telah menemui jalan buntu. Itu berarti berbalik dan sekarang bergerak kembali ke barat (tanpa mengeksekusi
!
lagi). Kali ini, dengan mudah, IP membaca nomor dari belakang ke depan, sehingga sekarang nomor di atas tumpukan tidak menyandikan sisa sumber.Ketika IP sekarang menyentuh sudut kiri atas lagi, ini bukan jalan buntu karena IP dapat berbelok ke kiri, jadi sekarang dan sekarang bergerak ke selatan. Ini
"
adalah no-op, yang kita butuhkan di sini untuk memisahkan nomor dari loop utama kode. Ngomong-ngomong soal:Selama bagian atas tumpukan belum nol, IP akan berjalan melalui kode yang agak padat ini di loop berikut:
Atau ditata secara linear:
Alasan mengapa diperlukan giliran itu adalah karena semantik aliran kontrol Labyrinth. Ketika setidaknya ada tiga tetangga ke sel saat ini, IP akan berbelok ke kiri pada nilai tumpukan negatif, teruskan pada nol dan belok kanan pada nilai tumpukan positif. Jika arah yang dipilih tidak mungkin karena ada dinding, IP akan mengambil arah yang berlawanan sebagai gantinya (itulah sebabnya ada dua belokan kiri dalam kode meskipun bagian atas tumpukan tidak pernah negatif).
Kode loop itu sendiri sebenarnya cukup mudah (mengompresnya dengan ketat ini bukan dan merupakan kontribusi utama Sp3000):
Setelah
N
mencapai nol, kontrol perubahan aliran. Sekarang IP ingin bergerak lurus ke depan setelah/
(yaitu barat), tetapi ada tembok di sana. Jadi alih-alih jika berbalik (timur), jalankan6
lagi. Itu membuat bagian atas tumpukan positif, sehingga IP berbelok ke kanan (selatan) dan menjalankan9
. Bagian atas tumpukan sekarang69
, tetapi yang kita pedulikan adalah positif. IP mengambil belok kanan lagi (barat) dan bergerak ke@
yang mengakhiri kode.Singkatnya, sebenarnya cukup sederhana.
Oke, sekarang bagaimana kita mencukur byte tambahan itu. Jelas, bahwa no-op tampaknya boros, tetapi kita membutuhkan baris tambahan: jika loop berdekatan dengan nomor tersebut, IP akan segera pindah ke sana alih-alih melintasi seluruh nomor. Jadi bisakah kita melakukan sesuatu yang bermanfaat dengan larangan itu.
Nah, pada prinsipnya kita bisa menggunakannya untuk menambahkan digit terakhir ke dalam encoding. Pengkodean tidak benar-benar perlu semua pada baris pertama ...
!
hanya memastikan bahwa apa pun yang ada juga akan dicetak di sana.Namun ada masalah, kami tidak bisa melakukan ini:
Masalahnya adalah bahwa sekarang kita telah mengubah
"
ke3
, yang juga mengubah angka aktual yang kita inginkan. Dan tentu saja angka itu tidak berakhir3
. Karena angka tersebut sepenuhnya ditentukan oleh kode mulai dari!
kita tidak dapat melakukan banyak hal tentang itu.Tapi mungkin kita bisa memilih digit lain? Kami tidak benar-benar peduli apakah ada
3
di tempat itu asalkan kita berakhir dengan angka yang mengkodekan sumber dengan benar. Sayangnya, tidak ada satu pun dari 10 digit yang menghasilkan pengkodean yang digit paling signifikannya cocok dengan digit yang dipilih. Untungnya, ada beberapa kelonggaran dalam sisa kode sehingga kita dapat mencoba beberapa pengkodean lagi tanpa menambah jumlah byte. Saya telah menemukan tiga opsi:@
menjadi/
. Dalam hal ini kita dapat menggunakan angka apa saja dari1357
dan mendapatkan pengkodean yang cocok. Namun, ini berarti bahwa program kemudian diakhiri dengan kesalahan, yang diizinkan tetapi tampaknya tidak terlalu bersih._
). 26 pilihan memberi banyak kemungkinan. Misalnya untukA
setiap digit angka ganjil. Ini sedikit lebih baik, tetapi masih tidak tampak elegan, karena Anda tidak akan pernah menggunakan huruf dalam kode nyata.1
, pengkodean juga berakhir1
. Ini adalah satu-satunya solusi di antara pangkalan 96, 97, 98, 99, jadi ini memang sangat beruntung. Dan begitulah akhirnya kita dengan kode di bagian atas jawaban ini.sumber
Hilang ,
293262249 bytesCobalah online!
Penjelasan
Seluruh proyek ini telah naik turun. Saya terus berpikir itu tidak mungkin dan kemudian datang dengan ide gila yang mungkin berhasil.
Mengapa Quine yang Hilang begitu sulit?
Seperti yang Anda ketahui, Lost adalah bahasa pemrograman 2D di mana lokasi awal dan arahnya sepenuhnya acak. Hal ini membuat penulisan program yang hilang sama sulitnya dengan menulis kode pengerasan radiasi. Anda harus mempertimbangkan setiap lokasi dan arah yang memungkinkan.
Yang sedang berkata ada beberapa cara standar untuk melakukan sesuatu. Sebagai contoh di sini adalah cara standar untuk mencetak string.
Ini memiliki aliran pengumpulan di bagian bawah yang meraih sebagian besar ips dan menariknya ke lokasi awal. Begitu mereka mencapai lokasi awal (kiri atas) kita membersihkannya dengan loop menyingkirkan semua nilai pada stack kemudian mengubah keamanan mendorong string dan keluar. (Keselamatan adalah konsep yang unik untuk Kehilangan setiap program harus mengenai
%
sebelum keluar, ini mencegah kemungkinan program berakhir pada awal). Sekarang ide saya adalah memperluas formulir ini menjadi quine yang lengkap.Hal pertama yang harus dilakukan adalah mengerjakan ulang loop sedikit, loop yang ada khusus untuk format String.
Kita perlu menambahkan stream kedua untuk menghindari kemungkinan
!
melompati stream dan membuat loop.Sekarang kami ingin mencampur ini dengan format Quine standar. Karena Lost didasarkan sangat banyak pada Klein,
pada dasarnyaakumencurimeminjam Klien Quine untuk Martin Ender .Ini cukup mudah mencetak baris pertama quine. Sekarang yang perlu kita lakukan adalah mengkodekan stream. Nah ini lebih mudah diucapkan daripada dilakukan. Saya mencoba kira-kira empat metode berbeda untuk melakukan ini. Saya hanya akan menjelaskan yang berhasil.
Idenya di sini adalah menggunakan pintu untuk mendapatkan jumlah panah yang diinginkan. A Door adalah jenis cermin khusus yang berubah setiap kali dipukul.
[
mencerminkan ips yang datang dari kiri dan]
dari kanan. Ketika mereka dihantam oleh ip dari salah satu sisi ini orientasi saklar. Kita dapat membuat garis pintu-pintu ini dan reflektor statis untuk berulang kali melakukan operasi.Akan tampil
:
tiga kali. Dengan cara ini jika kita mendorong<
ke stack sebelumnya, kita dapat membuat banyak dari mereka dengan byte lebih sedikit. Kami membuat 2 dari ini, satu untuk setiap baris, dan di antara mereka kami meletakkan baris baru, namun yang kedua hanya perlu berjalan sampai mencakup!
kita menambahkannya untuk, apa pun dapat dibiarkan kosong menyelamatkan kita beberapa byte. Ok sekarang kita perlu menambahkan panah vertikal ke aliran kita. Di sinilah optimasi kunci masuk. Alih-alih mengarahkan semua ips ke "mulai" program secara langsung, kita akan mengarahkan mereka ke paling kiri, karena kita sudah tahu bahwa ips mulai di paling kiri harusbekerja (atau setidaknya akan bekerja di versi final) kami juga dapat mengarahkan ulang ips lainnya. Ini tidak hanya membuatnya lebih murah dalam byte, saya pikir optimasi ini adalah apa yang memungkinkan quine.Namun masih ada beberapa masalah, yang paling penting adalah ips mulai setelah
>
didorong tetapi sebelum kita mulai membuat salinannya. Ips tersebut akan memasuki mesin fotokopi dan membuat banyak salinan dari 0. Ini buruk karena mekanisme pembersihan tumpukan kami menggunakan nol untuk menentukan bagian bawah tumpukan, meninggalkan sejumlah besar nol di bagian bawah. Kita perlu menambahkan metode sanitasi tumpukan yang lebih kuat. Karena tidak ada cara nyata untuk mengetahui apakah stack kosong, kita hanya perlu berusaha menghancurkan sebanyak mungkin item di stack. Di sini kita akan sekali lagi menggunakan metode pintu yang dijelaskan sebelumnya. Kami akan menambahkan((((((((((([[[[[[[[[[[[[[
ke akhir baris pertama tepat setelah sanitizor untuk menghilangkan nol.Sekarang ada satu masalah lagi, karena kita mengalihkan aliran kita ke ips kiri atas mulai dari
%
dan bergerak ke bawah sudah mematikan keselamatan dan akan keluar sebelum waktunya. Jadi kita perlu mematikan keamanannya. Kami melakukan ini dengan menambahkan a#
ke aliran, dengan cara itu ips yang mengalir melalui aliran akan dimatikan tetapi ips yang sudah disanitasi tidak akan. The#
juga harus sulit kode ke baris pertama juga.Itu saja, semoga Anda mengerti bagaimana ini bekerja sekarang.
sumber
Yup ,
1165879606561540522498 + 7 = 505 byteMembutuhkan
-cheat
bendera untuk memungkinkan definisi alias.Cobalah online!
Penjelasan
Ada dua bagian untuk ini (seperti kebanyakan quines). Data:
Dan dekoder:
Data hanyalah pengkodean biner dari decoder (atau lebih tepatnya kebalikannya). Setiap
0
memulai karakter baru dan1
s dan2
s adalah0
- dan-1
bit, masing-masing.Perhatikan bahwa itu
0
adalah perintah Yup standar yang mendorong nol, sementara1
dan2
tidak didefinisikan pada titik ini. Namun, kami menetapkan seluruh bagian data ke perintah%
sehingga1
dan2
dapat tetap tidak ditentukan hingga%
benar-benar digunakan.Selanjutnya, kami mendefinisikan beberapa perintah lagi:
<
mengurangi bagian atas tumpukan,>
menambahnya.1
(agak tidak sengaja) menggandakan bagian atas tumpukan.2
gandakan dan kemudian tambahkan. Berkat definisi ini, sesuatu seperti0221111
akan benar-benar meninggalkan 48 (110000 dalam biner) di stack.32 byte yang tersisa melakukan decoding aktual dalam dua bagian. Pertama, kita perlu merekonstruksi string data.
Dan akhirnya, kami mendorong data lagi dan mencetak setiap nilai sebagai karakter:
Untuk referensi di masa mendatang, berikut adalah skrip CJam untuk menyandikan data.
sumber
Fueue , 423 byte
Fueue adalah esolang berbasis antrian di mana program yang berjalan adalah antrian.
Cobalah online!
Bagaimana itu bekerja
Penjelasan ini
mungkin atau mungkin tidak adajalan keluar. Di sisi lain saya tidak tahu bagaimana menjelaskannya dengan lebih singkat dengan cara yang saya harap orang bisa ikuti.Lembar cheat Fueue
Lihat artikel wiki esolang untuk detailnya, termasuk beberapa fitur yang tidak digunakan dalam program ini.
Program awal adalah keadaan awal antrian, yang dapat berisi elemen-elemen berikut:
+*/-%
: bilangan bulat aritmatika (-
adalah unary,%
negasi logis). Lemah jika tidak diberi nomor argumen.()<
: letakkan elemen dalam tanda kurung, hapus tanda kurung dari blok, tambahkan elemen terakhir ke blok. Dua yang terakhir inert kecuali diikuti oleh blok.~:
: swap, duplikat.$
: copy (mengambil nomor + elemen). Lambat sebelum non-angka.H
: menghentikan program.Perhatikan bahwa saat
[]
bersarang,()
jangan - yang terakhir hanyalah fungsi yang terpisah.Sintaks penelusuran jejak
Spasi adalah opsional dalam Fueue, kecuali antara angka. Dalam jejak eksekusi berikut ini akan digunakan untuk menyarankan struktur program, khususnya:
Kurung keriting
{}
(tidak digunakan dalam Fueue) digunakan dalam jejak untuk mewakili hasil integer dari ekspresi matematika. Ini termasuk angka negatif, karena Fueue hanya memiliki literal non-negatif --
adalah fungsi negasi.Berbagai nama metavariabel dan
...
digunakan untuk menunjukkan nilai dan singkatan.Taktik penundaan
Secara intuitif, siklus eksekusi di sekitar antrian, sebagian memodifikasi apa yang dilewatinya. Hasil dari suatu fungsi tidak dapat dijalankan lagi sampai siklus berikutnya. Bagian-bagian berbeda dari program secara efektif berkembang secara paralel selama mereka tidak berinteraksi.
Akibatnya, banyak kode yang ditujukan untuk sinkronisasi, khususnya untuk menunda eksekusi bagian-bagian program hingga waktu yang tepat. Ada banyak opsi untuk bermain golf ini, yang cenderung mengubah bagian-bagian itu menjadi gumpalan yang tidak dapat dibaca yang hanya dapat dipahami dengan melacak siklus eksekusi mereka dengan siklus.
Taktik ini tidak akan selalu disebutkan secara individual di bawah ini:
)[A]
keterlambatanA
untuk satu siklus. (Mungkin metode termudah dan paling mudah dibaca.)~ef
menukar elemene
danf
yang juga menunda eksekusi. (Mungkin yang paling tidak mudah dibaca, tetapi sering kali paling pendek untuk penundaan kecil.)$1e
menunda satu elemene
.-
dan%
berguna untuk menunda angka (yang terakhir untuk0
dan1
.):
atau$
dapat digunakan untuk membuatnya dari satu elemen .(n
membungkusn
tanda kurung, yang nantinya dapat dihapus dengan nyaman. Ini sangat penting untuk perhitungan numerik, karena angka terlalu tidak stabil untuk disalin tanpa terlebih dahulu menempatkannya di blok.Struktur keseluruhan
Sisa dari penjelasan ini dibagi menjadi tujuh bagian, masing-masing untuk bagian dari program yang sedang berjalan. Siklus yang lebih besar setelah sebagian besar dari mereka mengulangi sendiri akan disebut "iterasi" untuk membedakan mereka dari "siklus" melewati tunggal melalui seluruh antrian.
Berikut adalah bagaimana program awal dibagi di antara mereka:
Angka besar pada akhir program mengkodekan sisanya secara terbalik, dua digit per karakter, dengan 30 dikurangkan dari setiap nilai ASCII (jadi mis.
10
Mengkode a(
.)Pada level yang lebih tinggi, Anda dapat menganggap data dalam program ini (dimulai dengan bignum) sebagai mengalir dari kanan ke kiri, tetapi kontrol mengalir dari kiri ke kanan. Namun, pada level yang lebih rendah, Fueue membuat perbedaan antara kode dan data setiap saat.
0
sebagai bilangan bulat48
), memisahkan angka yang paling tidak penting terlebih dahulu. Ini menghasilkan satu digit setiap 15 siklus.[x[y]]
, juga mencetak karakter yang disandikan dari masing-masing pasangan.[x[y]]
blok sedemikian rupa sehingga setelah berisi semua digit, dapat dijalankan untuk mencetak semuanya, lalu menghentikan seluruh program.Bagian A
Bagian A menangani penjadwalan akhir program. Dibutuhkan 4258 siklus untuk mereduksi menjadi fungsi swap tunggal
~
, yang kemudian membuat penyesuaian ke bagian B yang menghentikan loop utamanya dan mulai menjalankan bagian D sebagai gantinya.$
fungsi menciptakan 4255 salinan berikut ini%
sementara(
membungkus~
tanda kurung.%
digunakan untuk beralih nomor berikut antara0
dan1
.%
digunakan,$1
salinan 1 dibuat[~]
(efektif NOP), dan pada siklus berikutnya)
menghapus tanda kurung.Bagian B
Bagian B menangani regenerasi sendiri serta pengulangan baru dari bagian C setiap 30 siklus.
:
duplikat mengikuti blok besar (satu salinan disingkat[BkB]
), lalu)
menghapus tanda kurung dari salinan pertama.$$24%%0
membuat hitung mundur yang mirip dengan yang ada di bagian A.:<
berubah menjadi<<
, dan~
menukar dua blok, menempatkan kode untuk bagian C baru terakhir.<
fungsi mengemas dua blok terakhir ke yang pertama - ini berlebihan pada iterasi normal, tetapi akan memungkinkan~
dari bagian A untuk melakukan tugasnya di akhir.)
tanda kurung luar dihapus. Selanjutnya~:)
berubah menjadi):
dan~)
menukar)
ke awal kode bagian C.)
baru saja akan menghapus tanda kurung untuk mulai menjalankan iterasi baru dari bagian C.Dalam iterasi akhir,
~
dari bagian A muncul di titik (1) di atas:The
~
swap yang)
di blok dan ke bagian C, mencegah bagian B dari yang dijalankan lagi.Bagian C
Bagian C menangani penggabungan pasangan karakter digit baru ke dalam blok bagian D, dan juga membuat iterasi baru dari bagian E.
Di bawah ini menunjukkan iterasi khas dengan
x
dany
mewakili kode ASCII digit. Dalam iterasi pertama, elemen "D" dan "E" yang masuk adalah yang pertama[H]
dan-
sebagai gantinya, karena tidak ada bagian E sebelumnya yang dijalankan untuk menghasilkan pasangan karakter digit apa pun.~
berturut-turut, baris tersebut akan menyusut menjadi sekitar 2/3 setiap siklus (karena satu~
swap dua berikut), tetapi kadang-kadang dengan sisa dari~
s yang mendatangkanmalapetakamemanipulasi dengan hati-hati apa yang mengikuti.$11~
menghasilkan baris seperti itu. Selanjutnya~
swap a<
di blok berikut. Lain<
di akhir menambahkan blok pasangan digit baru (digit x dan y sebagai kode ASCII) ke dalam blok bagian D.~
baris memiliki~~
sisa, yang bertukar~
atas yang berikut ini)
. Yang lain<
menambahkan bagian D ke a[)))~]
blok.~
itu sendiri menukar blok berikut dengan kode E bagian baru di seluruh blok bagian D. Kemudian sisa baru~
menukar)
seberang, dan akhirnya yang terakhir~~
di~
baris menukar salah satu dari mereka menyeberang ke bagian E sama seperti)
telah menghapus tanda kurung.Dalam iterasi akhir, bagian A
~
telah bertukar)
melintasi bagian B dan ke bagian C. Namun, bagian C berumur pendek sehingga sudah menghilang, dan)
berakhir di awal bagian D.Bagian D
Bagian D menangani pencetakan angka besar terakhir dan menghentikan program. Selama sebagian besar program dijalankan, itu adalah blok lembam yang bagian B – G bekerja sama dalam membangun.
(
membungkus fungsi penghentianH
dalam tanda kurung. SEBUAH-
berikut, itu akan digunakan sebagai elemen dummy untuk iterasi pertama, bukan pasangan digit.[49[49]]
, sesuai dengan final11
dalam angka.[49[48]]
(sesuai dengan10
di awal numeral) sebenarnya tidak dimasukkan ke dalam blok, tetapi ini tidak membuat perbedaan sama)[A[B]]
dan)[A][B]
setara, keduanya berubah menjadiA[B]
.Setelah iterasi terakhir, yang
)
ditukar ke kanan dari bagian B tiba dan bagian D blok diblokir. Di)))~
awal setiap sub-blok memastikan bahwa semua bagian dieksekusi dalam urutan yang benar. Akhirnya blok terdalam berisiH
penghentian program.Bagian E
Bagian E menangani kombinasi pasangan digit ASCII yang diproduksi oleh bagian G, dan keduanya mencetak karakter yang dikodekan yang sesuai dan mengirimkan blok dengan pasangan gabungan ke kiri ke bagian C dan D.
Sekali lagi di bawah ini menunjukkan iterasi khas dengan
x
dany
mewakili kode ASCII digit.10*x+y-498
, nilai ASCII dari karakter yang dikodekan.498 = 10*48+48-30
,48
s membatalkan pengodean ASCII darix
dany
sementara30
menggeser pengodean dari00–99
ke30–129
, yang mencakup semua ASCII yang dapat dicetak.Bagian F
Bagian F terdiri dari blok inert yang berisi kode digit ASCII. Untuk sebagian besar program yang dijalankan akan ada paling banyak dua di sini, karena bagian E mengkonsumsinya dengan kecepatan yang sama dengan yang dihasilkan G. Namun, pada tahap pencetakan akhir, beberapa
0
angka berlebih akan dikumpulkan di sini.Bagian G
Bagian G menangani pemisahan angka besar di akhir program, angka paling tidak penting terlebih dahulu, dan mengirim blok dengan kode ASCII mereka ke kiri ke bagian lain.
Karena tidak ada cek penghentian, itu akan benar-benar terus menghasilkan
0
angka ketika angka telah dipangkas menjadi 0, sampai bagian D menghentikan seluruh program denganH
fungsi.[BkG]
menyingkat salinan blok kode awal yang besar, yang digunakan untuk replikasi diri untuk memulai iterasi baru.Inisialisasi dalam siklus pertama:
Iterasi tipikal,
N
menunjukkan nomor yang akan dipisah:+:5
alih-alih--10
menunda10
dua siklus. Sayangnya hanya satu dari10
program yang dibantu oleh ini.[N]
dan[BkG]
blok digandakan, maka satu salinanN
dibagi oleh10
.[{N/10}]
digandakan, maka lebih banyak fungsi aritmatika digunakan untuk menghitung kode ASCII dari digit terakhirN
as48+((-10)*(N/10)+N)
. Blokir dengan kode ASCII ini dibiarkan untuk bagian F.[{N/10}]
ditukar antara[BkG]
blok untuk mengatur awal iterasi baru.Bonus quine (540 bytes)
Cobalah online!
Karena saya tidak yakin metode mana yang akan terpendek, saya pertama kali mencoba menyandikan karakter sebagai angka dua digit yang dipisahkan oleh
(
s. Kode inti sedikit lebih pendek, tetapi representasi data 50% lebih besar menggantikannya. Tidak golf seperti yang lain, ketika saya berhenti ketika saya menyadari itu tidak akan mengalahkan itu. Ini memiliki satu keuntungan: Tidak memerlukan implementasi dengan dukungan bignum.Struktur keseluruhannya agak mirip dengan yang utama. Bagian G tidak ada karena representasi data mengisi bagian F secara langsung. Namun, bagian E harus melakukan perhitungan divmod yang sama untuk merekonstruksi digit angka dua digit.
sumber
)$n[)](
adalah byte yang lebih pendek untuk penghitung penundaan.Jelly, 3 byte
Cobalah online!
Verifikasi
Bagaimana itu bekerja
sumber
LANG=en_US
hanya mencapai itu. tio.run/nexus/bash#@@/…