# 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!"? May 3, 2011 at 2:49
• @muntoo it's a play on "Learn you a Haskell for Great Good". May 3, 2011 at 2:52
• Did anybody notice that this is question 69? Oct 24, 2020 at 22:47

# Yabasic, 103 bytes

An anonymous Yabasic quine

c$=Chr$(34):q$="c$=Chr$(34):q$=:?Left$(q$,15)+c$+q$+c$+Mid$(q$,16)":?Left$(q$,15)+c$+q$+c$+Mid$(q$,16)

Includes a trailing newline

Try it online!

"34 8ko@

Try it online!

# 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. # Tcl, 47 bytes puts [join {p \{ \}]} {uts [join {p \{ \}]} }] Based on Joe Miller's quine on this page. ## 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, 2019 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, 2019 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, 2019 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, 2019 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, 2019 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! • Save a byte like this: Try it online! Aug 1, 2019 at 22:50 • Would print((_=x=>print((_=${_})()))()) count too? JavaScript (V8) 35 bytes Aug 20, 2019 at 8:30

# 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, 2019 at 23:28
• I have absolutely no idea.
– user85052
Oct 30, 2019 at 3:57

# Keg, 86 4 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.

## W, 13 bytes

Print the data string & prepend quote.

p34CS+"p34CS+

## tq, 8 bytes

New high-level language! (Technically inspired by Jo King's Symbolic Raku quine.)

etq'etq'

## Explanation

'etq' # Define the second item of the list
# As a string
q      # Surround the string with quotes
t       # For the first item of the list,
# Access the last (tail) item in the list,
e        # and un-quote the accessed value.

# The list becomes etq, 'etq' (comma is for readability)
# , which then becomes foreach-printed without any separator.
$$$$

# Common Lisp, 58 bytes

Lisp is perfect for quines because of using code as data, but terseness is not its strong suit.

(FORMAT T "(~{~S ~}~:*'~S)" '(FORMAT T "(~{~S ~}~:*'~S)"))

Excellent expert explanation.

(FORMAT T  -- print
"(      )" -- between parentheses
" ~{  }~ " -- looping over the list argument
" ~S_    " -- each item followed by a space
"   ~:*  " -- use the FORMAT sublanguage's *very* fancy
-- "~*" directive (skip argument) with the ":"
-- modifier to back up and reuse the argument
"    '~S " -- print the argument again with a quote before it
'(FO.. -- the argument is the same thing but with a quote
-- in front to show that it is data

Ideone it!

## Alternative 9 bytes, that only works in the REPL

(prin1 -)

(use print for a trailing newline)

This prints the value of '-', which is the current expression being evaluated. You can try it here.

# 33, 24 bytes

"34cke12ketp"34cke12ketp

Try it online!

### Explanation:

"34cke12ketp"               Push the string 34c0ke13ketp to the source string
34c            Put 34 in the accumulator
k           Push a " to the destination string
e          Append the source string to the destination string
12k       Push a " to the end of the destination string
e      Append the source string to the destination string
t     Swap the source and the destination string
p    And print the source string

# 4, 3101 bytes

3.611102101111601492000010000000160111200001000000016010020000100000001601002000010000000160139200001000000016019520000100000001601842000010000000160199200001000000016019920000100000001601092000010000000160190200001000000016010920000100000001601912000010000000160111200001000000016019920000100000001601992000010000000160121200001000000016011020000100000001601092000010000000160193200001000000016010020000100000001601892000010000000160101200001000000016011020000100000001601102000010000000160130200001000000016013020000100000001601002000010000000160100200001000000016019920000100000001601002000010000000160100200001000000016010920000100000001601202000010000000160100200001000000016010220000100000001601312000010000000160199200001000000016019920000100000001601282000010000000160199200001000000016019920000100000001601902000010000000160111200001000000016019920000100000001601992000010000000160127200001000000016019920000100000001601992000010000000160191200001000000016011120000100000001601892000010000000160179200001000000016012120000100000001601192000010000000160198200001000000016019320000100000001601992000010000000160110200001000000016019920000100000001601102000010000000160119200001000000016019920000100000001601922000010000000160101200001000000016011020000100000001601992000010000000160131200001000000016010820000100000001601042000010000000160100200001000000016011020000100000001601092000010000000160190200001000000016013020000100000001601302000010000000160160200001000000016019920000100000001601602000010000000160110200001000000016013020000100000001601302000010000000160151200001000000016010320000100000001601032000010000000160105200001000000016011020000100000001601302000010000000160130200001000000016010220000100000001601822000010000000160103200001000000016010120000100000001601182000010000000160129200001000000016012220000100000001601312000010000000160152200001000000016018220000100000001601252000010000000160110200001000000016012520000100000001601222000010000000160151200001000000016015120000100000001601022000010000000160120200001000000016011320000100000001601152000010000000160112200001000000016011120000100000001601012000010000000160131200001000000016012920000100000001601452000010000000160194200001000000016015920000100000001601452000010000000160194200001000000016015820000100000001601452000010000000160194200001000000016015020000100000001601552000010000000160184200001000000016015920000100000001601452000010000000160194200001000000016015920000100000001601452000010000000160145200001000000016015120000100000001601052000010000000160115200001000000016015420000100000001601542000010000000160156200001000000016011520000100000001601152000010000000160160200001000000016015020000100000001601562000010000000160194200001000000016019420000100000001601682000010000000160148200001000000016014620000100000001648486494965050651516545455150155454954954954855054954854954954954921310112151310220151522520152282513229281103028200303015030301503030106990603030990010040801399011029999101990199398991129798111999997299991109999982999913200002900000990000030301011098003990011299991119900990999948599300001194

Try it online!

### Explanation

3.           Required boilerplate
6 11 10      Set cell 11 to 10
2 10 11 11   Set cell 10 to cell 11*cell 11 (10*10=100)

-- Data Section --
Every pair of digits in the program are represented by
6 01 49      Set cell 01 to the two digits joined together
2 00 00 10   Multiply cell 00 by 100
0 00 00 01   Add cell 01 to 00

This essentially makes cell 00 the rest of the program after the data section

6 48 48      Set each of the cells 48,49,50,51,54 to their respective values
6 49 49
6 50 50
6 51 51
6 54 54

551501554549549549548550549548549549549549  Print the initial section ('3.611102101111')

2 13 10 11   Initialise various powers of 10
2 15 13 10
2 20 15 15
2 25 20 15
2 28 25 13
2 29 28 11

0 30 28 20   Create the number '1000000010000200106', which is each data part backwards
0 30 30 15
0 30 30 15
0 30 30 10
6 99 06
0 30 30 99

0 01 00 40   Copy cell 00 to cell 01

8 01         Loop while cell 01 is not zero

3 99 01 10    Integer divide cell 01 by 100 and store in cell 99
2 99 99 10    Multiply cell 99 by 100
1 99 01 99    Subtract cell 99 from cell 01 to get cell 01 modulo 100

3 98 99 11
2 97 98 11
1 99 99 97
2 99 99 11
0 99 99 98    Swap the two digits of the modulo result
2 99 99 13    Multiply it by 1000

2 00 00 29    Multiply cell 00 by 10**19
0 00 00 30    And append a copy of a data part
0 00 00 99    And insert the modulo result in the correct place

3 01 01 10    And divide cell 01 by 100
9            End loop

Now we print the number in cell 00 in reverse

8 00         Loop while cell 00 is non-zero
3 99 00 11    Get the last digit of cell 00
2 99 99 11
1 99 00 99

0 99 99 48    Add the digit to '0'
5 99          And print

3 00 00 11    Divide cell 00 by 10
9            End loop
• I should write a SEDE query to see how many of the 362 quines you've written. Sep 19, 2020 at 17:00
• @Razetime A search for inquestion:69 user:76162 currently puts it at 32
– Jo King
Sep 19, 2020 at 21:44
• 8% of all the answers. I'm waiting for the day 50% comes. Sep 20, 2020 at 3:35

a=_=>'a='+a

Try it online!

# Groovy, 90 bytes

s='s=\\\';s[0..1]+s[3]+s[0..1]+s[2]*6+s[3..-1]*2';s[0..1]+s[3]+s[0..1]+s[2]*6+s[3..-1]*2

Edit

Works in GroovyConsole

# AWK, 56 bytes

BEGIN{printf a="BEGIN{printf a=%c%s%c,34,a,34}",34,a,34}

Try it online!

Outgolfed these two.

# Agony, 243 bytes

<[.<]>[{(<(<){*}*{(>)}~)<(<){-.+(*}*<{)>(>)>}]${(@]@){,{.{[{*{]{)+*<}>[>*+)+]{@$${<{<<+(@[{({.{({,>]@(>]+[>){,{({.+(@[+({,+(@(+({]+({)+({.<@[<{-+({<@[+[>]{.>]{->]{.+(>){,+[{,{-{({]{[+({.>){->){.+]+[{.>]{-+({,+[{,+({.>){->){-+(@(>]@[>){]@(>) Try it online! This looks like a bit of a mess, but this language is actually a brainfuck derivative, similar to SMBF. The self-modifying part is not used to read the executed code though (especially as each instruction is not mapped to one character). Agony splits up each brainfuck cell into 4 bits each (with two cells being a "character"), with special instructions to manipulate individual cells. ### Explanation: The code is split up into three sections; Code, the printable list of characters (offset by one to avoid the zero cell in @) and the data section (which is the printable version of the other two sections backwards). #### Code <[.<] Print out the data section printing the code and the list of chars >[ Loop over each 4 bits of the data section {( While the current cell is not zero <(<){ Go to the start of the character list *}*{ Move it over one cell to make the next character the new start (>)}~ Go back to the current cell and decrement it ) <(<){ Go to the start of the character list -.+ Print it offset by one (@ is 0010 0000, so we store it as 0010 0001) (*}*<{) Move over all the other characters by one to restore the list >(>)>} Move to the next cell in the data section ] End the loop and halt This section is modified or read (except the , which separates it from the character list section). #### Character list The character list is the section between the and the$$ {( @] @) {, {. {[ {* {] {) +* <} >[ >* +) +] {@$  }  {  >  <  @  ~  +  -  .  ,  (  )  [  ]  *

Each pair of characters represents 8 bits each, which is the ordered list of the 15 instructions in Agony (offset by one).

#### Data section

Similar to the character section, each pair of characters in this part represent a single character in the code section. You can have it more efficient by just duplicating the code section entirely (thus being one to one), which is actually how the reference quine works. However, I think that even golfed, this would still take more code to handle duplicating the data section than it would save (but I'm not too sure about that, so feel free to prove me wrong).

# ALGOL 68 (Genie), 70 bytes

STRINGa="STRINGa="";print(a[..9]*2+a[9..]*2)";print(a[..9]*2+a[9..]*2)

Try it online!

It's fascinating how modern feeling the syntax of this language (or at least the parts I've used), despite being over 50 years old. I wrote this without looking at any documentation, simply guessing at the features like string indexing (with ranges even!) and string multiplying.

### Explanation:

STRINGa="STRINGa="";print(a[..9]*2+a[9..]*2)";  # Assign this string to a #
# This escapes the " by doubling it #
print(a[..9]*2             # Print STRINGa=" twice #
+a[9..]*2)            # Followed by ";print(a[..9]*2+a[9..]*2) twice #

# OCaml, 66 bytes

(fun x->Printf.printf"%s%S"x x)"(fun x->Printf.printf\"%s%S\"x x)"

Try it online!

# JsonLogic, 631

{"reduce":[[1],{"cat":[{"reduce":[{"var":"accumulator"},{"cat":[{"var":"accumulator"},{"substr":["\\\",:[]1abcdelmnorstuv{}",{"var":"current"},1]}]}]},{"var":"accumulator"},"]]}"]},[21,1,16,11,10,19,9,11,1,3,4,4,6,5,2,21,1,9,7,18,1,3,4,21,1,16,11,10,19,9,11,1,3,4,21,1,20,7,16,1,3,1,7,9,9,19,13,19,12,7,18,15,16,1,22,2,21,1,9,7,18,1,3,4,21,1,20,7,16,1,3,1,7,9,9,19,13,19,12,7,18,15,16,1,22,2,21,1,17,19,8,17,18,16,1,3,4,1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,1,2,21,1,20,7,16,1,3,1,9,19,16,16,11,14,18,1,22,2,6,5,22,5,22,5,22,2,21,1,20,7,16,1,3,1,7,9,9,19,13,19,12,7,18,15,16,1,22,2,1,5,5,22,1,5,22,2,4]]}

Try it online by pasting it under "Rule" here. (Note: the "Output" section is JSON-encoded. The raw unquoted string is logged in the console which can be viewed with F12)

# OIL, 77 bytes

Quines are one of the things that aren't that hard in OIL, because of the whole "unified memory" thing. The quine exists since a long time, but I hadn't posted it here yet.

The following code needs to be stripped of the comments to work:

0  # do nothing, these two fields are just placeholders
0
1  # copy the line above to itself
1
1
4  # output line 1
1
11 # and a newline
4  # and output line 1 again
1
11 # and a newline (now we printed 0 and 0)
1  # copy line 2 to line 2
2  # *
2
1  # copy
12 # line 12 (the one marked with the star)
18 # to line 18 (marked with $) 10 # ^, if the next line (currently 2) is equal to the line afterwards (1) 18 #$
1
32 # jump to line 32 (essentially quitting, because it's out of bounds)
22 # otherwise to the next line:
1  # copy from 18 ($) to 26 (&) 18 26 4 # output from the cell with the number in the next line 26 # & 8 # increment line 18 ($)
18
11 # newline
6  # jump to line 17 (^, beginning of the loop)
17

# !@#$%^&*()_+, 112811161069960877844540477407383 33 bytes Edit: Woah... -304 B with space Edit 2: Bruh. Edit 3: Thanks Jo King for the idea! I outgolfed ya! A stack-based language(The first on TIO's list!) It's a big pile of unprintables though N0N (!&+$*)^(!&@^)!

(Spaces are NUL bytes)

Try it online!

Here's the code, but in Control Pictures form:

␙N0␖␑␘N␙␚␔␛␀␖␑␘␀␐(!&␐+$*)^(!&@^)! ## Explanation ␙N0␖␑␘N␙␚␔␛␀␖␑␘␀␐ Data (!&␐+$*)         Push the stack, reversed and +16 back on top
^(!&@^)! Print everything reversed, including the length (Hence the final !)

It does error on overflow though...

• Will it get to BF length? I wonder... Apr 18 at 11:44
• Almost there... Apr 18 at 12:02
• just as a note, i have posted a quine in this language before, though don't let that stop you improving this further
– Jo King
Apr 18 at 13:27
• SO messed up the unprintables Apr 18 at 18:34

## Ada, 274258 257 Characters

with Text_IO;use Text_IO;procedure Q is M:Character:='"';T:String:="with Text_IO;use Text_IO;procedure Q is M:Character:=';T:String:=;begin Put_Line(T(1..54)&M&T(54..65)&M&T&M&T(66..126));end Q;";begin Put_Line(T(1..54)&M&T(54..65)&M&T&M&T(66..126));end Q;

pretty printed:

with Text_IO;
use Text_IO;
procedure Quine is
M : Character := '"';
T : String := "with Text_IO;use Text_IO;" &
"procedure Q is M:Character:=';T:String:=;" &
"begin Put_Line(T(1..54)&M&T(54..65)&M&T&M&T(66..126));end Q;";
begin
Put_Line(T(1..54)&M&T(54..65)&M&T&M&T(66..126));
end Quine;

this program actually produces the short version (output can be redirected to q.adb).

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. May 28, 2017 at 1:39
• One part of the program does not encode another, so this program is invalid Feb 5, 2019 at 18:04
• @MilkyWay90 Am I missing something about the definition of a quine? The challenge simply states "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." This seems to do that. Mar 31, 2021 at 18:15