# Golf you a quine for great good!

Using your language of choice, golf a quine.

A quine is a non-empty computer program which takes no input and produces a copy of its own source code as its only output.

No cheating -- that means that you can't just read the source file and print it. Also, in many languages, an empty file is also a quine: that isn't considered a legit quine either.

No error quines -- there is already a separate challenge for error quines.

Points for:

• Smallest code (in bytes)
• Most obfuscated/obscure solution
• Using esoteric/obscure languages
• Successfully using languages that are difficult to golf in

The following Stack Snippet can be used to get a quick view of the current score in each language, and thus to know which languages have existing answers and what sort of target you have to beat:

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>

• Do you not mean, "Golf you a quine for greater good!"? – Mateen Ulhaq May 3 '11 at 2:49
• @muntoo it's a play on "Learn you a Haskell for Great Good". – Rafe Kettler May 3 '11 at 2:52

# Pascal (FPC), 103 bytes

const s=#39'const s=#39;begin write(s[2..12],s,s[10..50])end.'#39;begin write(s[2..12],s,s[10..50])end.

Try it online!

s is the string that the output is generated from. In Pascal, subtrings can be easily extracted with [from..to] syntax. #39 is replacement for ' using its ASCII codepoint. As seen in this program, sequences of character codepoints can be glued together with the rest of the string delimited with 's at any time. s consists of characters before and after 's concatenated together. #39 occurs immediately before first ' and after second ' so it can be put in s only once and used in both substrings in the output.

The version that may be more suitable in modified, quine-like programs is at 106 bytes:

const s='const s=;begin write(s[1..8],#39,s,#39,s[9..52])end.';begin write(s[1..8],#39,s,#39,s[9..52])end.

Try it online!

# !@#$%^&*()_+, 76 bytes 40Kjiiiiiiiiiiij,306j,6641,iK31,i,6j,,!!_+!^!&(@^!&)++!_+%(!_^^^^^^^^^^^_@%) Try it online! The code can be decomposed into two sections: the data and the decoder. The data is this: 40Kjiiiiiiiiiiij,306j,6641,iK31,i,6j,, Each character pushes itself, and corresponds to a command (shifted up by 11). The decoder is this: !!_+!^!&(@^!&)++!_+%(!_^^^^^^^^^^^_@%) This can also be divided into two parts, one which prints the data raw, and one which decodes the data. This part prints the initial data segment: !!_+!^!&(@^!&)++!_+% !!_+ push 0 (duplicate twice then subtract) this is our delineator !^ push 1 (duplicate and increment) this is our pointer !& push the entry at that index in the stack ( ) until the dilineator is found: @ output the stack entry ^ increment pointer !& refresh entry at index ++!_+ pop top two (add twice, duplicate, subtract) % push 0 underneath stack Then the decoder: (!_^^^^^^^^^^^_@%) ( %) For each character: !_ _ subtract ^^^^^^^^^^^ 11 @ and output it # Muriel, 36 bytes A:"\";.\"A:\\\"\"+|A+A";."A:\""+|A+A Try it online! Since Muriel isn't on TIO (yet!), I've included the interpreter in the link. Thanks Dennis! Quines are the base component of any complex Muriel program, since they're a requirement for any sort of loop. ### Explanation: A: Assign to A " ... "; An escaped version of ";."A:\""+|A+A . Print "A:\"" A:" +|A Escaped version of A +A Then A itself # Aubergine, 16 bytes -a1+a1=oA:bA=iB Try it online! The program has a trailing null byte. Works similarly to my hello world. ## Perl 6, 36 printf |(q<printf |(q<%s>xx 2)>xx 2) Based on the Perl 5 quine. # Brachylog v2, 12 bytes "~k;?w₁";?w₁ Try it online! Full program. Essentially a translation of Fatalize's (non-builtin) Brachylog v1 answer, although it also uses different SWI-Prolog formatting sequences, or rather, a single different one, which saves about 20 bytes (both [34:s, both :34]s, and both ~cs). It seems to have existed back in 2016, but it was probably bugged or something. The last two bytes saved come from using the implicit input, which Brachylog being Brachylog is useful even when the program receives no input, because it's a variable (so instead of explicitly unifying the string with S, we just let it be implicitly unified with ?). w Print "~k;?w₁" "~k;?w₁" which is the input ₁ formatted with ;? the input. ~k (so that the ~k is replaced with the input's canonical representation, i.e. in quotes) We don't actually need to use implicit input--"~kgjw₁"gjw₁ works just as well (and might even translate back to v1)--but doing so regardless manages to both more closely mirror the structure of the original and feel cleverer. # Java, 515 bytes In order to make this quine, I made strings representing every part of the code that needed to be printed. Then, I created and printed a string representing the code by adding the strings together. This is my first time playing code golf, let me know what you think of my quine! interface a{static void main(String[]a){String ce="interface a{static void main(String[]a){String ",e="=",c="\",",q="\"",cq="\\",ec=";System.out.print(ce+cc+ee+e+q+ce+c+ee+e+q+e+c+cc+e+q+cq+c+c+qq+e+q+cq+q+c+cc+qq+e+q+cq+cq+c+ee+cc+e+q+ec+c+ee+qq+e+q+eq+c+ee+ee+e+q+ee+c+cc+cc+e+q+cc+c+qq+qq+e+q+qq+q+ec+eq",eq=");}}",ee="e",cc="c",qq="q";System.out.print(ce+cc+ee+e+q+ce+c+ee+e+q+e+c+cc+e+q+cq+c+c+qq+e+q+cq+q+c+cc+qq+e+q+cq+cq+c+ee+cc+e+q+ec+c+ee+qq+e+q+eq+c+ee+ee+e+q+ee+c+cc+cc+e+q+cc+c+qq+qq+e+q+qq+q+ec+eq);}} in readable form: interface a { static void main(String[] a) { String ce = "interface a{static void main(String[]a){String ", e = "=", c = "\",", q = "\"", cq = "\\", ec = ";System.out.print(ce+cc+ee+e+q+ce+c+ee+e+q+e+c+cc+e+q+cq+c+c+qq+e+q+cq+q+c+cc+qq+e+q+cq+cq+c+ee+cc+e+q+ec+c+ee+qq+e+q+eq+c+ee+ee+e+q+ee+c+cc+cc+e+q+cc+c+qq+qq+e+q+qq+q+ec+eq", eq = ");}}", ee = "e", cc = "c", qq = "q"; System.out.print(ce+cc+ee+e+q+ce+c+ee+e+q+e+c+cc+e+q+cq+c+c+qq+e+q+cq+q+c+cc+qq+e+q+cq+cq+c+ee+cc+e+q+ec+c+ee+qq+e+q+eq+c+ee+ee+e+q+ee+c+cc+cc+e+q+cc+c+qq+qq+e+q+qq+q+ec+eq); } } • If you want to try shortening this further, have a look into using the printf function – Jo King Jun 28 at 6:41 • I tried that, but I found print easier. I guess I'll try again. – Ethan Gallagher Jul 1 at 2:22 # C (gcc), 85 bytes #define q(k)main(){puts(#k"\nq("#k")");} q(#define q(k)main(){puts(#k"\nq("#k")");}) Try it online! The q() macro expands into a program that prints out its argument on the first line, and prints out the argument called by q() itself in the second line. So: #define q(k)main(){puts(#k"\nq("#k")");} q(foo) would expand into: main(){puts("foo""\nq(""foo"")");} and after string literal concatenation, becomes: main(){puts("foo\nq(foo)");} And executing and running the program would produce: foo q(foo) Replacing foo with the macro definition itself results in the quine. ## C, 353 bytes char q[]={125,59,109,97,105,110,40,41,123,112,114,105,110,116,102,40,34,99,104,97,114,32,113,91,93,61,123,34,41,59,99,104,97,114,42,112,61,113,59,119,104,105,108,101,40,42,112,41,112,114,105,110,116,102,40,34,37,100,44,34,44,42,112,43,43,41,59,112,117,116,115,40,113,41,59,125,};main(){printf("char q[]={");char*p=q;while(*p)printf("%d,",*p++);puts(q);} • With some golfing, including changing it from hexadecimal to decimal, this can be 354 bytes – Jo King Aug 2 at 2:04 • The link itself is a gcc compiler and it works fine. Are you sure they aren't just warnings? – Jo King Aug 2 at 2:51 • If only the output is erroring, then what is the difference between the two programs? What version of gcc are you using? – Jo King Aug 2 at 3:15 • ... What is the difference between the code of the two programs, not their behaviour. I already know that the second one fails. The version TIO uses is 8.3, and that works fine. – Jo King Aug 2 at 3:32 • I don't care about the output of the second generation quine. I would like to know the output of the first program, the one that didn't fail and produced something that did. I don't want to know about the errors that you have commented about several times already. I would like to know the difference between the program I have given you and its output. You can put the program in an online compiler like I have and link it in a comment below. – Jo King Aug 2 at 3:49 # Javascript (REPL), 2322 21 bytes someone else posted this first (_=x=>(_=${_})())()

paste into chrome console or equivalent to test

# JavaScript (V8), 4948 47 bytes

@NieDzejkob saved 1 byte on both versions

console.log((_=x=>console.log((_=${_})()))()) Try it online! # Corea, 11 bytes <0C>;"<0C>; Try it online! Alternatively, <0C>>"<0C>> <0C>;"<0C>; <0C>; set the contents to that literal string " start command sequence < push a copy of the contents to the stack 0C push a quote " > append that to the contents ; and append the original copy and stop command sequence # Wren, 287 bytes var a="[118,97,114,32,97,61,34].each{|m|System.write(String.fromCodePoint(m))} System.write(a+String.fromCodePoint(34)+String.fromCodePoint(10)+a)" [118,97,114,32,97,61,34].each{|m|System.write(String.fromCodePoint(m))} System.write(a+String.fromCodePoint(34)+String.fromCodePoint(10)+a) Try it online! ## Explanation var a= // Define the variable a "[118,97,114,32,97,61,34].each{|m|System.write(String.fromCodePoint(m))} System.write(a+String.fromCodePoint(34)+String.fromCodePoint(10)+a)" // As the string that processes the variable // A literal newline is inserted and can be decoded literally. [118,97,114,32,97,61,34].each{|m|System.write(String.fromCodePoint(m))} // Output the string "var a=" to the console System.write( // Output without a newline: a // The string a +String.fromCodePoint(34) // Plus a quote +String.fromCodePoint(10) // Plus a newline +a) // Plus the string again $$$$ • Why doesn't fromByte work in place of fromCodePoint? – Jo King Oct 29 at 23:28 • I have absolutely no idea. – A̲̲ Oct 30 at 3:57 # Keg, 8 6 bytes ④,④, Try it online! ## Answer History ### 8 bytes :.,`:., Try it online! Why did it take me so long to figure out how to write a quine in Keg? I really should have picked up on this sooner. Basically, it pushes the string :.,, duplicates it, prints the string repr'd and then prints it nicely. Pretty certain you can't get shorter than this with Common Lisp. The first one I managed to figure out myself; all credit to http://rosettacode.org/wiki/Quine#Common_Lisp for the second one. # Common Lisp - 9 (With REPL) (write -) In Common Lisp, - is a special variable that holds the expression currently being evaluated but only during a read-eval-print loop. If you're running from a script or you've disabled the REPL though... # Common Lisp - 25 (No REPL) #1=(write '#1# :circle t) This references itself and then prints itself out. :circle t makes it detect the infinite recursion cycle and exit early. # CJam, 1 byte Note: CJam was made after this challenge was posted, I am posting this answer as documentation as opposed to a serious entry. 0 Pushes a 0 to the stack, and CJam automatically outputs the stack after program execution. • Don't forget newlines. – CalculatorFeline May 28 '17 at 1:39 • One part of the program does not encode another, so this program is invalid – MilkyWay90 Feb 5 at 18:04 # ForceLang with this module, 87 bytes Noncompeting, language postdates the challenge set j require njs j var f=function(){print("set j require njs\nj var f="+f+";f()")};f() # Idris, 88 bytes q:String;main:IO();main=putStr$q++show q;q="q:String;main:IO();main=putStr$q++show q;q=" It’s like Haskell with more enforced top-level type signatures. I had to put q’s type first, because Idris’s type checker is a little weird? I dunno. # Scala, 56 bytes val s="val s=%c%s%c;printf(s,34,s,34)";printf(s,34,s,34) First defines s as val s=%c%s%c;printf(s,34,s,34), then prints it formatted with double quotes (ascii 34) and itself. # Forth (gforth), 21 bytes : x latest name-see ; This prints the decompiled source of the latest word, thus only works if x is the latest defined word. Test: x : x latest name-see ; ok This one works without that condition, but replaces the constant definition with it's value (since that's the only thing that actually gets saved to memory) : x [ latest ] literal name-see ; Test: x : x 140121195205104 name-see ; ok • If it prints with a newline in the middle, but the original doesn't have it, it's not a quine. – Pavel Dec 29 '16 at 5:07 • Fixed. It's because there's no way to tell where spaces/newlines are as it's only compiled code – therealfarfetchd Dec 29 '16 at 13:39 • It's not a proper quine anyway, because it reads its own source. – mbomb007 May 10 '17 at 14:02 ## Pyke, 14 bytes "34.Cp\D\Es"DE Try it here! "34.Cp\D\Es" - "34.Cp\D\Es" DE - eval(^, stack=^) 34.C - '"' p - print(^) \D\Es - sum("34.Cp\D\Es", ^, "D", "E") # SimpleTemplate, 56 bytes This is a template engine language I've made for fun. It was written in PHP and run by compiling the weird syntax to PHP. This answer is a translation of Aurel Bílý's amazing PHP answer! {@setF"{@setF%c%s%c}{@printF,34,F,34}"}{@printF,34,F,34} Weird, right? This works with the commit d1d3e2c43bd98da2bd38f884ee5ac7b39cb8c579 on my Github and you can try it on http://sandbox.onlinephpfunctions.com/code/cca9ed3b9c87abad61159725f159285e5daf9bb9. In there, you will have the existing code on that commit, plus showing the result and the generated PHP. # GNU Make, 5251 11 bytes$(value $0) When called as a function, returns its source code. And here's a complete makefile that doesn't return its code, but rather prints it: Q=$(info Q=$(value Q))$(info $$(call Q)) (call Q) ## Explanation The second line just instantiates the variable, the first one defines it: (info Q=(value Q))(info$$(call Q))
$(value Q) # Get unexpanded value$$# "$" escaped
$(info Q= )$(info   (call Q))  # Print the remaining parts

# Babel, 161 bytes

{ "{ '{ ' << dup [val 0x22 0xffffff00 ] dup <- << << -> << ' ' << << ' }' << } !" { '{ ' << dup [val 0x22 0xffffff00 ] dup <- << << -> << ' ' << << '}' << } ! }%

# Ceylon, 173 154 bytes

Saved those bytes thanks to Challenger5

shared void run(){print(let(x="""shared void run(){print(let(x=$)x.replaceFirst("$","\"\"\""+x+"\"\"\""));}""")x.replaceFirst("$","\"\"\""+x+"\"\"\""));} source • You can golf off some whitespace. Try it online! – Esolanging Fruit May 25 '17 at 1:07 • @Challenger5 Cheers :D – MD XF May 25 '17 at 1:10 # Conway's Game of Life, 7 bytes ! ** ** Uses Plaintext format. • 5 bytes, you missed the newline. Alternatively, in Standard Plaintext: **\n** – CalculatorFeline May 27 '17 at 23:30 • @CalculatorFeline Thanks, edited. – MD XF May 28 '17 at 0:23 • What interpreter are you running this in? – Wheat Wizard May 28 '17 at 20:50 • @WheatWizard This is not necessarily run in an interpreter, it simply means "a 2x2 square of live cells in an empty grid". – MD XF May 28 '17 at 21:16 • -1 this method of IO is very limited – ASCII-only Aug 28 '17 at 2:31 # Perl 5, 37 bytes$_=q{$_=q{0};s/0/$_/;say};s/0/$_/;say Try it online! ## ColdFusion, 276 bytes <cfset u=Chr(34)><cfset q="<cfset u=Chr(34)><cfset q=%s%s%s><cfoutput>%screateObject(%sjava%s,%sjava.lang.String%s).format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])%s</cfoutput>"><cfoutput>#createObject("java","java.lang.String").format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])#</cfoutput> I've never used ColdFusion, but after seeing @Danninta's post on Self-growing code codee codeee codeeee I thought I'd play around. This could almost certainly be golfed down by someone that actually knows the language, so feel free to add a new answer. Tested locally on lucee-express-5.2.6.60 # Jstx, 4 bytes £↕26 Try it online! • You might want to include an explanation, I'd be interested! Also I believe you'll need to include a newline in your code since the output of this program seems to include one as well. – ბიმო Apr 10 '18 at 16:34 • I assume you are the created of Jstx and the GitHub? In your documentation you mention all the possible commands/operations/functions, but not which character represents it. Since I couldn't find it in the documentation, what commands/operators/functions do these £ and represent? – Kevin Cruijssen Apr 20 '18 at 12:03 • It's not a solid association between opcodes and bytes, and it changes from version to version of the interpreter and compiler. In fact some opcodes can actually remap every opcode to byte association at runtime. Fortunately you don't need to worry about which bytes correspond to which instructions because all the programming is done directly through instructions using the Jstx compiler, then the resulting bytes can be interpreted with the same version of the Jstx interpreter. – Quantum64 Apr 21 '18 at 16:53 # PHP, 147 bytes <?php$c= <<<'s'
$n='<?php$c= <<<\'s\''."\n";global $c;echo($n.$c."\ns;\n".'$e=create_function("",$c);$e();');
s;
$e=create_function("",$c);\$e();

Try it online!

# VBA, 77 bytes

An anonymous VBE immediate window quine.

c=Chr(34):q="c=Chr(34):q=:?Replace(q,Chr(7),c+q+c)":?Replace(q,Chr(7),c+q+c)