Mirror quine (or my head hurts)
GolfScript, 46 chars
0{`".~#"+.-1%+\.!@@}.~##~.}@@!.\+%1-.+"#~."`{1
Well, this is ugly, but it works. The output equals the code reversed, and is also a valid GolfScript program which outputs the original code again.
OK, let me try to explain how I constructed it. First, I started from the quine {".~"}.~
, and modified it as in this answer to reverse itself. To make the output an executable quine in itself, I made a copy of the code before reversing it, and included a #
at the end of the code, so that the reversed version at the end became just a comment. Thus, we get the palindromic quine:
{`".~#"+.-1%}.~##~.}%1-.+"#~."`{
However, by the rules, palindromes are not allowed, so I needed to break the symmetry somehow. I figured the easiest way would be to include a 0
(which, in itself, is a quine in GolfScript) in the code and flip it to 1
with !
after creating the reversed copy. Most of the remaining complexity is just ugly stack manipulation to get everything in the right order.
Perl and C 6478 1955
#!/usr/bin/perl -i//
$_=<<'rahc';eval $_; #//
print scalar reverse "#!/usr/bin/perl -i//\n\$_=<<'rahc';eval \$_; #//\n${_}rahc\n" #//
__END__
__END__ enifed#
};)"{ = ][cn\rahcn\n\"(p
};)'n\'( rahctup) 1 == 21%b ( fi
;)d(p;)]1-b[c,",d%",)d(foezis,d( ftnirpns{)b--;b;)c(foezis=b( rof
;)c(p;]9[d rahc;b tni{)(niam diov
}};)]1-b[c(rahctup )]1-b[c(fi{)b--;b;)c(nelrts=b(rof;b tni{)c*rahc(p diov
>h.gnirts< edulcni#
>h.oidts< edulcni#
;}
,0
,53,33,74,711,511,411,74,89,501,011,74,211
,101,411,801,23,54,501,74,74,01,63,59,16
,06,06,93,411,79,401,99,93,95,101,811,79
,801,23,63,59,95,23,53,74,74,01,211,411
,501,011,611,23,511,99,79,801,79,411,23,411
,101,811,101,411,511,101,23,43,53,33,74,711
,511,411,74,89,501,011,74,211,101,411,801,23
,54,501,74,74,29,011,29,63,59,16,06,06
,93,411,79,401,99,93,95,101,811,79,801,23
,29,63,59,95,23,53,74,74,29,011,63,321
,59,521,411,79,401,99,29,011,43,23,53,74
,74,01,59,59,96,87,86,59,59,01,59,59
,96,87,86,59,59,23,101,011,501,201,101,001
,53,01,521,95,14,43,321,23,16,23,39,19
,99,011,29,411,79,401,99,011,29,011,29,43
,04,211,01,521,95,14,93,011,29,93,04,23
,411,79,401,99,611,711,211,14,23,94,23,16
,16,23,05,94,73,89,23,04,23,201,501,01
,95,14,001,04,211,95,14,39,94,54,89,19
,99,44,43,44,001,73,43,44,14,001,04,201
,111,101,221,501,511,44,001,04,23,201,611,011
,501,411,211,011,511,321,14,89,54,54,95,89
,95,14,99,04,201,111,101,221,501,511,16,89
,04,23,411,111,201,01,95,14,99,04,211,95
,39,75,19,001,23,411,79,401,99,95,89,23
,611,011,501,321,14,04,011,501,79,901,23,001
,501,111,811,01,521,521,95,14,39,94,54,89
,19,99,04,411,79,401,99,611,711,211,23,14
,39,94,54,89,19,99,04,201,501,321,14,89
,54,54,95,89,95,14,99,04,011,101,801,411
,611,511,16,89,04,411,111,201,95,89,23,611
,011,501,321,14,99,24,411,79,401,99,04,211
,23,001,501,111,811,01,26,401,64,301,011,501
,411,611,511,06,23,101,001,711,801,99,011,501
,53,01,26,401,64,111,501,001,611,511,06,23
,101,001,711,801,99,011,501,53,01,95,521,01
{ = ][c
rahc
Edit:
Brief explanation: from perl the two interesting lines are the second and the third. The second line has two statements the first of which reads the rest of the document into a string. The second evals the string. The Third line prints everything backwards. every thing else gets ignored. from the c side you have an array which has the program as a string, which gets printed as an array and a string, and the rest is a comment.
Ruby 145
DATA.read.tap{|a|puts a.reverse,a.tr("\x79\x59","\x59\x79")} :y __END__ __DNE__ Y: })"97x\95x\","95x\97x\"(rt.a,esrever.a stup|a|{pat.daer.ATAD
The main idea is simple: just put the first half of the source code backwards after the __END__
which can be read using DATA
from ruby. Then just print the reverse of this data, then print the data, and you get back the original source code
The problem is, that this becomes a palindrome (note that the first line needs an endline), so we have to break the symmetry. I just added a symbol :y
to the code, and some code that will transform this symbol between lowercase and uppercase between runs, thereby reverting to the original state after two runs.
Test one: they can be executed
$ ruby rq2.rb > rq2t.rb
$ ruby rq2t.rb > rq2tt.rb
Test two: the result of two runs will return the original source
$ diff rq2.rb rq2tt.rb
$
Test three: the code is not a palindrome (the middle run is different)
$ diff rq2.rb rq2t.rb
3c3
< :y
---
> :Y
6c6
< Y:
---
> y: