207
\$\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\$
  • 4
    \$\begingroup\$ Do you not mean, "Golf you a quine for greater good!"? \$\endgroup\$ – Mateen Ulhaq May 3 '11 at 2:49
  • 55
    \$\begingroup\$ @muntoo it's a play on "Learn you a Haskell for Great Good". \$\endgroup\$ – Rafe Kettler May 3 '11 at 2:52
  • \$\begingroup\$ Did anybody notice that this is question 69? \$\endgroup\$ – aidan0626 Oct 24 at 22:47

372 Answers 372

1
9 10 11 12
13
0
\$\begingroup\$

Ahead, 8 bytes

"34 8ko@

Try it online!

| improve this answer | |
\$\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
| improve this answer | |
\$\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.

| improve this answer | |
\$\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.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Tcl, 47 bytes

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

Based on Joe Miller's quine on this page.

| improve this answer | |
\$\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.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

anyfix, 29 bytes

“8221"’OƥO«"ƥ«”8221"’OƥO«"ƥ«

Try it online!

Another half finished golfing language. This is rather longer since the string quoting uses different starting and ending quotes, both with large ordinal values. There's probably a shorter way that I'm missing.

Explanation

“8221"’OƥO«"ƥ«”                    Push string
               8221                Push 8221
                   "’              Duplicate and decrement
                     Oƥ            Convert to character and print (starting quote)
                       O«          Convert to character and swap with string
                         "ƥ        Duplicate string and print
                           «       And swap end quote back to top of stack
                                   Implicitly print from top of stack to bottom
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Stax (packed), 43 bytes

å3o╞╝&∞╝7►JôyG♦◄╨s│*T→╢φY'┘ò☼≤⌠░▼e╓Δ█•Aφ/│.

Try it online!

Doesn't work because for some reason latin1 does not accept the C1 control codes.

For this version, the interpreter needs to be forced to output in latin1. Stax Encoding is used. There is an extra trailing newline, but this appears to be accepted here (judging from many other answers).

Explanation:

The unpacked source is:

"r{32-m2+c+95|EVB|EB128+s+"r{32-m2+c+95|EVB|EB128+s+
  • The first half simply pushes the string which is also the second half.

  • The second half builds the full unpacked source out of it and packs it:

    r{32-m2+c+95|EVB|EB128+s+ Second half
    r{32-m                    Reverse and subtract 32 from each character (for packing)
          2+                  Append 2 (double quote - 32)
            c+                Concatenate with self
              95|E            Decode as a base 95 integer (for packing)
                  VB|E        Encode as a base 256 interager (for packing)
                      B128+s+ Add 128 to the first byte (for packing)
                              Implicit output
    

Stax (packed), 103 bytes (50 characters)

üö╖╞╖┘û■Å╣ß$æi7⌐ê↔T)ç¢┤,I_º>┐ó♫Z╪Æ≤◄▐0σ▓☻E.α╬TŶ7É

Run and debug it

Source and output are UTF-8 here, so they are counted as such. Much longer, but UTF-8 is a little nicer to look at.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

pl – Perl One-Liner Magic Wand, 22 bytes

Very late to the party, just for fun. This decades old Perl wrapper, was only released into the wild, when Corona went viral.

There are 3 quines in the examples page. The one of interest here is the last, and of that the 2nd 1-letter alias variant. It's essentially the same as the Perl one, which it beats by 6 bytes. As on many examples on that page, hover the ▶ button, or the blue code box, to see the result.

&f(qw(&f(qw(%s)x2))x2)
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ Welcome to the site and nice first answer! The "default" online interpreter we use on this site, Try It Online!, has pl listed, so I've edited your answer slightly so it's closer to our standard format. Please, feel free to check out our main questions page for more challenges you can attempt! \$\endgroup\$ – caird coinheringaahing Oct 15 at 21:00
  • \$\begingroup\$ @caird-coinheringaahing Thanks, but that's a different pl. It implements some weird undocumented highly specialized language. It has nothing to do with Perl, other than being implemented in it. It's a total coincidence that it spews out my quine ;-) \$\endgroup\$ – Daniel Oct 15 at 21:09
  • \$\begingroup\$ Huh, a very weird coincidence. My mistake, I've rolled back my edit \$\endgroup\$ – caird coinheringaahing Oct 15 at 21:10
  • \$\begingroup\$ @caird-coinheringaahing Actually not such a weird coincidence. Apart from the few (code golf only?) tasks that other pl language is capable of performing, everything you throw at it seems to be a quine. Like calling cat a language. \$\endgroup\$ – Daniel Oct 16 at 21:49
0
\$\begingroup\$

JavaScript (ES6), 11 bytes

a=_=>'a='+a

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

C (gcc), 70 bytes

#define a(b)*s=#b;b
a(main(){printf("#define a(b)*s=#b;b\na(%s)",s);})

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

TypeScript, 209 197 bytes

type Q<X extends string[]=['`','$',Q<['${X[0]}','${X[1]}','${X[2]}']>]>=`type Q<X extends string[]=['${X[0]}','${X[1]}',Q<['${X[1]}{X[0]}','${X[1]}{X[1]}','${X[1]}{X[2]}']>]>=${X[0]}${X[2]}${X[0]}`

Try it online!

| improve this answer | |
\$\endgroup\$
1
9 10 11 12
13

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.