203
\$\begingroup\$

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> 

\$\endgroup\$

This question has an open bounty worth +500 reputation from user202729 ending in 7 days.

This question has not received enough attention.

The shortest Hexagony answer at the end of the bounty period (that's not posted by me) will get the bounty. If no new answers are posted, Jo King's answer (currently 261 bytes) will get the bounty.

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

323 Answers 323

0
\$\begingroup\$

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.

\$\endgroup\$
  • \$\begingroup\$ Don't forget newlines. \$\endgroup\$ – CalculatorFeline May 28 '17 at 1:39
  • \$\begingroup\$ One part of the program does not encode another, so this program is invalid \$\endgroup\$ – MilkyWay90 Feb 5 at 18:04
0
\$\begingroup\$

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()
\$\endgroup\$
0
\$\begingroup\$

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.

\$\endgroup\$
0
\$\begingroup\$

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.

\$\endgroup\$
0
\$\begingroup\$

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
\$\endgroup\$
  • 1
    \$\begingroup\$ If it prints with a newline in the middle, but the original doesn't have it, it's not a quine. \$\endgroup\$ – Pavel Dec 29 '16 at 5:07
  • \$\begingroup\$ Fixed. It's because there's no way to tell where spaces/newlines are as it's only compiled code \$\endgroup\$ – therealfarfetchd Dec 29 '16 at 13:39
  • \$\begingroup\$ It's not a proper quine anyway, because it reads its own source. \$\endgroup\$ – mbomb007 May 10 '17 at 14:02
0
\$\begingroup\$

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")
\$\endgroup\$
0
\$\begingroup\$

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.

\$\endgroup\$
0
\$\begingroup\$

GNU Make, 52 51 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
\$\endgroup\$
0
\$\begingroup\$

Babel, 161 bytes

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

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

\$\endgroup\$
  • \$\begingroup\$ You can golf off some whitespace. Try it online! \$\endgroup\$ – Esolanging Fruit May 25 '17 at 1:07
  • \$\begingroup\$ @Challenger5 Cheers :D \$\endgroup\$ – MD XF May 25 '17 at 1:10
0
\$\begingroup\$

Perl 5, 37 bytes

$_=q{$_=q{0};s/0/$_/;say};s/0/$_/;say

Try it online!

\$\endgroup\$
0
\$\begingroup\$

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

\$\endgroup\$
0
\$\begingroup\$

Jstx, 4 bytes

£↕26

Try it online!

\$\endgroup\$
  • \$\begingroup\$ 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. \$\endgroup\$ – ბიმო Apr 10 '18 at 16:34
  • 1
    \$\begingroup\$ 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? \$\endgroup\$ – Kevin Cruijssen Apr 20 '18 at 12:03
  • \$\begingroup\$ 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. \$\endgroup\$ – Quantum64 Apr 21 '18 at 16:53
0
\$\begingroup\$

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!

\$\endgroup\$
0
\$\begingroup\$

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)
\$\endgroup\$
0
\$\begingroup\$

Ahead, 8 bytes

"34 8ko@

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Runic Enchantments, 7 bytes

"'<~S@|

Try it online!

Explanation

  <        Entry
"'         Push the " character (loop around)
      |    Mirror (loop around)
"          Begin string mode
 '<~S@|    Push the string '<~S@|
"          End string mode
 '<~       Push and pop a < character
    S      Swap stack the following also work, r: reverse, q: concatenate, +: add
     @     Print and terminate
\$\endgroup\$
0
\$\begingroup\$

Tidy, 71 bytes

q:=34|chr|str;a:="q:=34|chr|str;a:=%swrite(a%%(q.a.q))"write(a%(q.a.q))

Try it online!

q:=34|chr|str gets a quote character, and a:=... defines the format string. Finally, write(a%(q.a.q)) formats a with a surrounded by quotes.

\$\endgroup\$
0
\$\begingroup\$

Tamsin, 67 bytes

main='->T&$:repr(T)->U&\'main=\'+U+T.'->T&$:repr(T)->U&'main='+U+T.

Ungolfed (isn't a quine, but outputs a quine):

main =  '→T&$:repr(T)→U&\'main=\'+U+T.' → T
     &  $:repr(T) → U
     &  'main=' + U + T.

Tamsin has a builtin that formats strings correctly, which makes this fairly easy.

\$\endgroup\$
0
\$\begingroup\$

Tcl, 47 bytes

puts [join {p \{ \}]} {uts [join {p \{ \}]} }]

Based on Joe Miller's quine on this page.

\$\endgroup\$
0
\$\begingroup\$

C# (Visual C# Interactive Compiler), 57 bytes

var s="var s={0}{1}{0};Write(s,'{0}',s);";Write(s,'"',s);

Try it online!

There is another C# answer that uses a console application with a Main method. This approach seemed a little outdated given most current C# answers use the Visual C# Interactive Compiler. This compiler allows for a much shorter variation using the exact same technique.

\$\endgroup\$
0
\$\begingroup\$

Pip, 26 23 bytes

Y\"O"Y"ORPyy\"O"Y"ORPyy

Try it online!

\$\endgroup\$
0
\$\begingroup\$

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);}
\$\endgroup\$
  • 1
    \$\begingroup\$ Going by the output this is 1195 bytes \$\endgroup\$ – Jo King Aug 2 at 1:24
  • 2
    \$\begingroup\$ Also, as this is code-golf, you should make an attempt to shorten your program, such as removing uneccesary whitespace. \$\endgroup\$ – Jo King Aug 2 at 1:25
  • 1
    \$\begingroup\$ With some golfing, including changing it from hexadecimal to decimal, this can be 354 bytes \$\endgroup\$ – Jo King Aug 2 at 2:04
  • 1
    \$\begingroup\$ The link itself is a gcc compiler and it works fine. Are you sure they aren't just warnings? \$\endgroup\$ – Jo King Aug 2 at 2:51
  • 1
    \$\begingroup\$ If only the output is erroring, then what is the difference between the two programs? What version of gcc are you using? \$\endgroup\$ – Jo King Aug 2 at 3:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.