Quine-spirations: To infinity and beyond
Stephen Hawking begins his book, A Brief History of Time, with this story:
A well-known scientist (some say it was Bertrand Russell) once gave a public lecture on astronomy. He described how the earth orbits around the sun and how the sun, in turn, orbits around the center of a vast collection of stars called our galaxy. At the end of the lecture, a little old lady at the back of the room got up and said: "What you have told us is rubbish. The world is really a flat plate supported on the back of a giant tortoise." The scientist gave a superior smile before replying, "What is the tortoise standing on?" "You're very clever, young man, very clever," said the old lady. "But it's turtles all the way down!"
We are pretty sure that the Universe isn't turtles all the way down, but we certainly can create Quines - Self replicating computer programs, going all the way down to infinity.
Zip Quine
Below is a zip file, that when extracted, unpacks into the same zip file, which when extracted, unpacks to the same zip file, and on and on ad infinitum. There's also an Image taking a free ride along the infinite recursion, injecting itself as an Intron.
Download the ZIP quine, and try extracting it for yourself!
How is this possible, you might ask? Well, there are several lossless compression standards, and one basic algorithm you might've come across is Run-Length encoding (RLE), wherein a prefix integer tells how many times to repeat the next alphabet. Ex: The compressed data 2a6b1c9d
, gets decompressed into aabbbbbbcddddddddd
Similarly, one of the sophisticated standards is L-Zip. Given an input data sequence, It spits out a compressed data sequence, and a series of commands to decompress. Running the commands as an action on the compressed data will decompress into the original sequence. There are only 2 possible commands:
print M: prints the next M lines of input as is.
repeat M N: seeks back N lines from the end of the output and prints the next M lines of output as is.
One can carefully design an input sequence, that is also made of the same two commands, such that it decompresses to itself.
Try solving the interactive Zip Quine puzzle. It's fun!
Below are some Inspirational-Quines; or more generally, programs with a self-referential nature in them.
Fluid simulation Quine
This is an HTML, CSS, and JavaScript Quine, that not only prints itself but also simulates fluid flow animation on its own source code!
HTML / CSS / JavaScript: Watch it online!
<body id="b" style="font-size:6vw;width:29ch"><tt><b>1kb Fluid
Simulation Quine</b><p>Click to restart / <a href="https://github.com/xem/
miniFluid/">github</a></p><canvas width="512" height="192" id="c"
style="width:99%;background:#9cf"><script>M=o=>//<3
a.map(p =>{ p.t=.1 ;p.s =0; o||( p.D=p.w)
;a.map( q=>(g=Math .hypot (e=p .x- q.x, f= p.y-q.y
)/2-1)< 0?o?( g/=p.D ,p.t +=( f*(z =3- p.D-q.D
)+p.v-q .v)*g,p.s +=(e*z +p.u -q. u)*g ): p.D+=g*
g:1)}); ;;;;;;;;; ;G= b.outerHTML . slice/*#
#*/(0,-22);Q=o=>{_=a=[];for(C of G)_++,C!=" "&&a.push({x:_%/*.#
#*/64+4,y:5+_/64|0,C,w:"#"==C,u:0,v:0})};setInterval(`R-->0/*;#
#*/&&Q();M(c.width^=M());for(p of a)with(p)c.getContext(/*Vida#
#*/"2d").fillText(C,7*x,8*y),w||(y+=v+=t/4,x+=u+=s/8)`,R=19)/*#
#*/;onclick=o=>R=1;/* ##
## ###########
###################################################*/</script>
What's more, is that the code can be formatted to fit 64 characters wide, and 16 lines tall, making it 64 * 16 = 1024
bytes. The entire source code of this fluid simulation Quine is exactly 1 KB!
The big empty spaces in the middle of the code spell out a certain word. Did you notice?
Palindromic Quine
This is a JavaScript Quine that is also a palindrome! Try it in the console.
JavaScript:
(q=u=>(i=`(q=${q},q())`,i+' // '+[...i].reverse().join``),q()) // ))(q,)``nioj.)(esrever.]i...[+' // '+i,`))(q,}q{$=q(`=i(>=u=q(
Palindromic PolyQuine
This is a C# and Java Polyglot-Quine, that is also a palindrome!
C#: Try it online!
Java: Try it online!
/**///\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="`**?`@#_^using System;?_#^class Program{public static void?@#_^Main?_#main^(String[]z){String s=!$!,t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&_!,!`!,!?!,s};for(i=0;i<9;i++)t=t.?@#_^Replace?_#replace^(!!+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t?@#_^[i];Console.Write?_#.charAt(i);System.out.printf^(t);}}/",t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A","/","//",s};for(i=0;i<9;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t//\u000A\u002F\u002A
[i];Console.Write//\u002A\u002F.charAt(i);System.out.printf
(t);}}/*/}};)t(
ftnirp.tuo.metsyS;)i(tArahc.F200u\A200u\//etirW.elosnoC;]i[
A200u\F200u\A000u\//t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+""(
ecalperF200u\A200u\//ecalpeR
A200u\F200u\A000u\//.t=t)++i;9<i;0=i(rof;}s,"//","/","A200u\\","F200u\\","A000u\\","\\","n\",""\"{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,"/}};)t(^ftnirp.tuo.metsyS;)i(tArahc.#_?etirW.elosnoC;]i[^_#@?t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+!!(^ecalper#_?ecalpeR^_#@?.t=t)++i;9<i;0=i(rof;}s,!?!,!`!,!_&!,!#&!,!@&!,!&&!,!n&!,!!&!{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,!$!=s gnirtS{)z][gnirtS(^niam#_?niaM^_#@?diov citats cilbup{margorP ssalc^#_?;metsyS gnisu^_#@`?**`"=s gnirtS{)z][gnirtS(
niamF200u\A200u\//niaM
A200u\F200u\A000u\//diov citats cilbup{margorP ssalc
F200u\A200u\//;metsyS gnisu
A200u\F200u\A000u\///**/
Upside-down Quine
Here's a JavaScript Quine, that not only prints itself backwards character by character but also flips each character upside-down!
JavaScript: (Try it in console)
(o=(Z="()[]<>⌄^Ɩ1nueǝrɹvʌmɯaɐjɾiᴉfɟpd\"⹂˙.")=>[..."(o="+o+")()"].reverse().map(s=>Z[Z.indexOf(s)^1]||s).join(""))()
prints
()((⹂⹂)uᴉoɾ˙(s||[Ɩ⌄(s)ɟOxǝpuᴉ˙Z]Z<=s)dɐɯ˙()ǝsɹǝʌǝɹ˙[⹂()(⹂+o+⹂=o)⹂˙˙˙]<=(⹂˙."⹂\\pdfɟiᴉjɾaɐmɯvʌrɹeǝnuƖ1⌄^<>[]()⹂=Z)=o)
Snake game Quine
A quine that plays snake over its own source code.
Too much food for one snake? Share it with others from the Multiplayer variant of the Snake-Quine game below. Each red dot is food, and the other 3 colors are players!
C to HTML Quine
This is a C program, that prints the source code of an HTML/JS website, that displays the original C program:
Rubick cube Quine:
This is a JavaScript Quine with a fully functional Rubik Cube at the center!
It does have colors! ANSI escape codes are used to display the colour when output into the terminal.
eval((c=`[b,d,p]=($=String.fromCh arCode)(96,92,32);M=process.argv[S
='slice'](2).join(W='').split (/(\\ww?\\d?'?)/).filter(d=>d
.trim());P=[6,3,0,7,4,1,8, 5,2];E=/./.constructor;C=$
(85,70,82,66,76,68);s=c. replace(E('[^'+C+']','g'
),W);I=C+'xyz';u=_=>{s =P.map(d=>s[d]).join(W
)+s[S](12,21)+s[S](9, 12)+s[S](21)};y=_=>{s
=[P.map(d=>s[d]),[0, 12,24].flatMap(_=>[[
q=12+_,21+_],[9+_,q UUU ]]).map(d=>s[S](...
d)),[...P].reverse UUU ().map(d=>s[d+45])
].flat().join(W)}; UUU x=_=>{s=[...'ÀÁÂÌÍ
ÎØÙÚ¿Ë×áâãÛÏü»º¾Ê LLLFFFRRRBBB ÖäåæÜП·½ÉÕçèéÝÑ
Ŷµ´àßÞÔÓÒÈÇÆ'].ma LLLFFFRRRBBB p(d=>s[d.charCodeA
t()-180]).join(W)} LLLFFFRRRBBB ;z=[x,y,x,x,x];X=[
x,x,x];m=[[u],[x,u DDD ,X],[y,y,y,X,u,x,y
],[X,u,x],[z,u,z,z DDD ,z],[x,x,u,x,x],[x
],[y],z];M.map(d=> DDD {A=_=>m[I.indexOf(
d[0])].flat().map(d =>d());A();d[1]=="'
"?(A(),A()):d[1]&&A( )});i=0;console.log(
'eval((c='+b+c.replac e(/\\x1b\\[\\d+m/g,''
).replace(E('['+C+']', 'g'),_=>'\\x1b['+[47,4
2,41,44,45,43][I.indexOf (s[i])]+'m'+s[i++]+'\\x1
b[0m').replaceAll(d,d+d)+b +').replace('+p.repeat(16)
+'/'+d+'x1b'+d+'['+d+'d+m|'+d +'s+|['+C+']*/g,""))');/3x3x3
*simulator*by*kirjava/`).replace( /\x1b\[\d+m|\s+|[UFRBLD]*/g,""))
When executed normally, it functions as a regular Quine, and prints itself. When executed with a moves as arguments, it produces a new Quine with the moves applied! node qube.js "RUR'URU2R'"
Since this is a Quine, you can continuously pipe the program into itself and apply moves on the way. node qube.js "R U" | node - "R' U'" | node - "R' F'"
Hash Quine
This is a PNG Image, which contains it's own MD5 Hash value in the image. Hash Value: 1337e2ef42b9bee8de06a4d223a51337
Try MD5 Hashing Online and check if it spits out the same value.
Globe Quine
A Ruby Quine with an ASCII image of a globe in its source code that rotates by 45 degrees after each run, eventually coming around after eight runs.
v=0000;eval$s=%q~d=%!^Lcf<LK8, _@7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC "%.#% :::##" 97N-A&Kj_K_><wS5rtWk@*a+Y5
yH?b[F^e7C/56j|pmRe+:)B "##% ::##########" O98(Zh)'Iof*nm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y? "##: ###############" g6`YT+qLw9k^ch|K'),tc
6ygIL8xI#LNz3v}T=4W "# #. .####:#######" lL27FZ0ij)7TQCI)P7u
}RT5-iJbbG5P-DHB<. " ##### # :############" R,YvZ_rnv6ky-G+4U'
$*are@b4U351Q-ug5 " #######################" 00x8RR%`Om7VDp4M5
PFixrPvl&<p[]1IJ " ############:#### %#####" EGgDt8Lm#;bc4zS^
y]0`_PstfUxOC(q " .#############:##% .## ." /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!; " %% .################. #. " ;s="v=%04o;ev"%
(;v=(v-($*+[45, ":####: :##############% : " ])[n=0].to_i;)%
360)+"al$s=%q#{ "%######. ######### " ;;"%c"%126+$s<<
126}";d.gsub!(/ "##########. #######% " |\s|".*"/,"");;
require"zlib"|| "########### :######. " ;d=d.unpack"C*"
d.map{|c|n=(n|| ":#########: .######: . " )*90+(c-2)%91};
e=["%x"%n].pack " :#######% :###### #: " &&"H*";e=Zlib::
Inflate.inflate( " ######% .####% :: " &&e).unpack("b*"
)[0];22.times{|y| " ####% %### " ;w=(Math.sqrt(1-(
(y*2.0-21)/22)**(; " .###: .#% " ;2))*23).floor;(w*
2-1).times{|x|u=(e+ " %## " )[y*z=360,z]*2;u=u[
90*x/w+v+90,90/w];s[( " #. " ;y*80)+120-w+x]=(""<<
32<<".:%#")[4*u.count(( " . " ;"0"))/u.size]}};;puts\
s+";_ The Qlobe#{" "*18+ ( "# :#######" ;"Copyright(C).Yusuke End\
oh, 2010")}";exit~;_ The Qlobe Copyright(C).Yusuke Endoh, 2010
Quine Tweet
Quine Tweet - A tweet that tweets its own link. This was done way before, the edit feature was introduced.
Here's a write-up about how it was done: Write up
Quine blog series
Last but not least, is the existence of this very own blog series! Each blog in this 7-part series has a referential easter egg relating to the topic in question. How many did you find?
Although we've explored self-reference in Computing here, you can find self-reference embedded in Art, Literature, Math, Biology and much more. In fact, there is a case to be made that, self reference might be a crucial ingredient for intelligence and consciousness.
That is to say, a Quine, in its essence, embodies a fundamental truth: the capacity for self-reflection and self-replication is not just a quirk of computer science, but a cornerstone of existence itself. From the spiralling double helix of DNA to the introspective musings of the human mind, the universe seems to whisper a persistent message: "Know thyself!"
It beckons us to turn our gaze inward, to explore the depths of our own being, to understand the code that shapes our thoughts, actions, and destinies.
"Until you make the unconscious conscious, it will direct your life and you will call it fate."
- Carl Jung
Sources and references:
How to write a lot of Quines, GitHub repo.
Fluid Simulation Quine, website.
LZ77 Write your own Zip Quine, online puzzle by Will Greenberg.
Zip Files All The Way Down, blog by Russ Cox.
A Brief History of Time, book by Stephen Hawking.
Quine-spirations. To infinity and beyond, self-referencing blog with inspiring Quines.
Subscribe to my newsletter
Read articles from Darshan A S directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Darshan A S
Darshan A S
Tricking rocks into thinking, at Google.