Mirror quine (or my head hurts)

32

6

I was reading Print your code backwards - reverse quine And I thought, this could be more interesting if your backwards code is also executable. So this challenge will have all the rules and requirements of the other, but must also be valid source once reversed (in the same or another language and still print its source backwards.

All rules and scoring from the reverse quine challenge apply, so all answers to this question will answer that one (but not score as well.)

Edit:

By request, all rules now copied here.

Rules:

  • write a program p which when executed produces output p' where p' is p backwards and p' when executed produces p.
  • No using other files (e.g. reverse.txt)
  • Minimum code length is two characters.
  • Your program cannot be a palindrome.

Scoring:

  • +50 if you use pull data from the Internet.
  • +25 if you read your own source code.
  • +1 point per character.
  • Lowest score wins.

hildred

Posted 2013-12-19T00:37:25.910

Reputation: 1 329

Related. It took me a few minutes to realise the difference: this one disallows palindromes, the other one asks for a palindrome. That said, the GolfScript answer shows that the restriction against palindromes doesn't really change the challenge significantly as it's fairly easy to sneak in an unused character that breaks it. – Martin Ender – 2016-04-07T08:40:51.017

eval(eval(eval(eval(eval(eval(eval(eval(eval(p))))))))) – Andrew Larsson – 2013-12-19T01:18:32.440

I'm just saying that you'd be able to execute the output of executing the output of executing the output of [...] executing the output of p (same as any quine except for the backwards quine). – Andrew Larsson – 2013-12-19T01:21:29.283

@AndrewLarsson Indeed although The proof of concept I am building p will be written in c and p' in perl. – hildred – 2013-12-19T01:23:14.087

Oh, that'd be cool! – Andrew Larsson – 2013-12-19T01:23:45.267

I assume that palindromic programs are not allowed? Because otherwise 1 (or even just the empty program) will work in many languages. – Ilmari Karonen – 2013-12-19T02:53:27.533

could you move the rules from the other question here so that this question is self-contained? – Justin – 2013-12-19T04:23:53.233

1Yeah, saw that too late. Not a duplicate. – Johannes Kuhn – 2013-12-19T08:31:09.343

Does executable mean interpretable in an interpreted language? – jazzpi – 2013-12-19T10:13:56.253

The requirement minimum code length is two characters is redundant here because you also require that the program cannot be a palindrome: any sequences of length 0 and 1 are automatically palindromes. – Voile – 2018-09-18T04:19:03.397

Answers

22

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.

Ilmari Karonen

Posted 2013-12-19T00:37:25.910

Reputation: 19 513

Is it also golfscript when reversed or is it another language? – hildred – 2013-12-19T03:37:09.553

Yes, it's GolfScript both ways. Indeed, except for the 0 and 1 at the beginning and end, the rest of the code is a palindrome. – Ilmari Karonen – 2013-12-19T03:43:17.177

9Wow. Okay, I don't feel smart enough for this SE anymore :( – Cruncher – 2013-12-19T14:34:15.780

21

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.

hildred

Posted 2013-12-19T00:37:25.910

Reputation: 1 329

This is incredible! I think Haskell/C might be another feasible combination. – theonlygusti – 2015-04-13T17:25:26.993

@theonlygusti, if you post it and I can compile it, I will upvote it. – hildred – 2015-04-13T17:28:16.923

1wat. :O My head exploded. But I count 6536 characters in that... – Doorknob – 2013-12-19T02:08:35.840

What...how... 0_0 – The Guy with The Hat – 2013-12-19T02:15:49.597

@DoorknobofSnow I counted the wrong version. But here is a shorter version. – hildred – 2013-12-19T07:22:39.453

8

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:

SztupY

Posted 2013-12-19T00:37:25.910

Reputation: 3 639

4

><>, 21 19 bytes

'rd3*70.r l?!;o90.<

Try it here!

Uses the *><> interpreter for convenience, but this is valid ><> code.


If erroring out is allowed, then it can be done in 16 bytes:

'd3*}70.!r  !|o|

Try it here!

Discordian

Posted 2013-12-19T00:37:25.910

Reputation: 41

@JoKing thank you! It was 7am and I was just too tired to put that together. I'll edit it in, in a couple hours. – Discordian – 2018-09-17T18:58:52.667

"Try it" links are dead. – pppery – 2020-01-05T04:55:19.097

4

Gol><>, 11 bytes

":5-}H}+5:'

A whole byte chopped off! it almost is a palindrome, but technically isn't because of the '+' and '-', haha!

Try it online!

The two below don't work, or at least they don't meet the specifications of the challenge, but the code above does.

slightly younger version, 12 bytes

"r2ssrH}+5:'

Golfed off a byte, simply by using the double quote and incrementing it by 5! And this new version looks less like a palindrome.

Try it online!

older version, 13 bytes

"r2ssrHrss7r'

There was a problem with the previous that JoKing pointed out, thank you for that, now it works, but with the price of 4 extra bytes...

Try it online!

KrystosTheOverlord

Posted 2013-12-19T00:37:25.910

Reputation: 681

1

Help, WarDoq! (27 bytes)

25 bytes added because of reading source code.

<space>q

How it works:
<space> - a comment that ends on non-space character
q - print source code reversed (q"space")

Reversed:

q<space>

How it works:
q - print source code reversed (q for now)
<space> - a comment that ends on non-space character, and add a character to beginning of q command (making "space"q)

user63913

Posted 2013-12-19T00:37:25.910

Reputation: