89
\$\begingroup\$

Write a program that prints its own source code out backwards, in other words an eniuq.

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.

Rules:

  • No using other files (e.g. reverse.txt)
  • Minimum code length is two characters.
  • Your program cannot be a palindrome.
\$\endgroup\$
13
  • 1
    \$\begingroup\$ Looks like this has been done before, just without the "no palindromes" rule. \$\endgroup\$
    – Iszi
    Commented Dec 18, 2013 at 18:59
  • 3
    \$\begingroup\$ Are those scores bonuses or penalties? You need to specify in words if something is a penalty or a bonus, because saying +10 can be taken to mean either "score as if it had 10 more characters than it actually does" or "the code can have 10 more characters that won't be scored", or other interpretations. \$\endgroup\$ Commented Dec 18, 2013 at 20:24
  • 8
    \$\begingroup\$ @AJMansfield Lowest score wins means that +x would be a penalty, -x would be a bonus. \$\endgroup\$
    – Iszi
    Commented Dec 18, 2013 at 20:32
  • 9
    \$\begingroup\$ The one question I have, then, is why is pulling data from the internet given a larger penalty than reading the source file? \$\endgroup\$ Commented Dec 18, 2013 at 20:35
  • 5
    \$\begingroup\$ Woohoo, 1st place on the hot network questions list :D Our site needs more attention... \$\endgroup\$
    – Doorknob
    Commented Dec 19, 2013 at 0:09

74 Answers 74

103
\$\begingroup\$

huh?, 5 characters

!hcuO

I actually have NO idea how it works, but If you download the interpreter, and if you write !hcuO, then you get Ouch!

To run this, you need to execute the program like this:

huh.exe !hcuO

It will actually look for a file called !hcuO, but it doesn't exist, so it outputs Ouch!

\$\endgroup\$
6
  • 105
    \$\begingroup\$ +1 for writing something you don't understand \$\endgroup\$
    – Cruncher
    Commented Dec 18, 2013 at 17:54
  • 36
    \$\begingroup\$ Is it not just a little ironic that you don't understand how your own code works, in an esolang that by design isn't supposed to understand your code either? \$\endgroup\$
    – Iszi
    Commented Dec 18, 2013 at 18:08
  • 10
    \$\begingroup\$ I'm not sure you're using huh? right, though I'm having a hard time finding proper documentation. It seems the usage is intended to be huh.exe <path to source code> and Ouch! is returned for an invalid path. Try putting your code into an actual file, and feeding that file as an argument to huh? and see what happens. It's also interesting to see that it generates a Notes.txt file with some commentary. \$\endgroup\$
    – Iszi
    Commented Dec 18, 2013 at 21:59
  • 8
    \$\begingroup\$ Ok, this thing just told me it thinks it understands but I didn't see anything happen. Maybe I should stop toying with it on my primary system. \$\endgroup\$
    – Iszi
    Commented Dec 18, 2013 at 22:04
  • 1
    \$\begingroup\$ What if there IS a file name !hcuO? \$\endgroup\$
    – MilkyWay90
    Commented May 15, 2019 at 22:51
93
\$\begingroup\$

Mathematica, 3 chars

a 2

a 2 means a times 2. So the answer is 2 a.

\$\endgroup\$
3
  • 2
    \$\begingroup\$ This will probably win unless someone can get a two char solution. \$\endgroup\$
    – ike
    Commented Dec 20, 2013 at 1:54
  • 32
    \$\begingroup\$ In fact I know a two char solution. Also in Mathematica: 1#. The output is #1. \$\endgroup\$
    – alephalpha
    Commented Dec 20, 2013 at 11:24
  • 8
    \$\begingroup\$ @alephalpha: Then you should post that as an answer! \$\endgroup\$
    – ProgramFOX
    Commented Dec 20, 2013 at 12:07
75
\$\begingroup\$

GolfScript - 2


1

(ie \n1 where \n is the newline character)

Output:

1

(ie 1\n)


To quote Ilmari:

GolfScript automatically appends a newline to the end of the output

Thus a newline followed by a number will print the number followed by a newline.

\$\endgroup\$
3
  • 16
    \$\begingroup\$ +1 I didn't think anything could beat the Mathematica solution. \$\endgroup\$
    – Kaya
    Commented Dec 21, 2013 at 19:55
  • 28
    \$\begingroup\$ Pretty boring solution... \$\endgroup\$
    – user36219
    Commented Apr 13, 2015 at 17:26
  • 1
    \$\begingroup\$ @theonlygusti It's golfscript, whaddya expect... \$\endgroup\$
    – rydwolf
    Commented Feb 27, 2019 at 14:39
69
\$\begingroup\$

H9+, 13 characters

!dlrow ,olleH

As the web page says, all characters that are not H, 9 or + are ignored, so my program will print Hello, world!

\$\endgroup\$
4
  • 32
    \$\begingroup\$ The one and only practical benefit of crazy esoteric languages is to answer these crazy questions. \$\endgroup\$
    – totymedli
    Commented Dec 19, 2013 at 8:11
  • \$\begingroup\$ It'd be more practical if these questions were so. \$\endgroup\$
    – kojiro
    Commented Dec 22, 2013 at 18:50
  • 1
    \$\begingroup\$ That's pretty darned clever! \$\endgroup\$
    – user36219
    Commented Apr 13, 2015 at 17:28
  • \$\begingroup\$ According to the JS implementation, H seems to output hello, world\n, therefore your code should be \ndlrow ,olleh, with no bytes added. \$\endgroup\$
    – Makonede
    Commented Feb 26, 2021 at 21:56
45
\$\begingroup\$

Javascript: 34 characters

reifitnedi detcepxenU :rorrExatnyS

outputs SyntaxError: Unexpected identifier, at least in the Chrome console

\$\endgroup\$
5
  • 11
    \$\begingroup\$ Clever use of abusing the system through error abuse \$\endgroup\$ Commented Dec 19, 2013 at 1:46
  • 2
    \$\begingroup\$ You sir, have made my day :D \$\endgroup\$
    – major-mann
    Commented Dec 19, 2013 at 9:54
  • 4
    \$\begingroup\$ Not an original idea, there already was an answer about this in python 2. \$\endgroup\$
    – o0'.
    Commented Dec 19, 2013 at 13:53
  • 1
    \$\begingroup\$ @Lohoris Sorry, I didn't see that one \$\endgroup\$
    – scrblnrd3
    Commented Dec 20, 2013 at 14:58
  • 1
    \$\begingroup\$ Firebug console in Mozilla Firefox: tnemetats erofeb ; gnissim :rorrExatnyS => SyntaxError: missing ; before statement. \$\endgroup\$
    – kenorb
    Commented Jul 21, 2014 at 13:09
28
\$\begingroup\$

Python, 43 41

_=']0~::[_%%_ tnirp;%r=_';print _%_[::~0]
\$\endgroup\$
27
\$\begingroup\$

Mathematica, 2 bytes

1#

Outputs:

#1

\$\endgroup\$
22
\$\begingroup\$

TI-BASIC, 2

i2

Where i is the imaginary number.

Outputs 2i

\$\endgroup\$
2
  • 1
    \$\begingroup\$ This only works in the home screen, not inside a PRGM. \$\endgroup\$
    – kernigh
    Commented Jun 28, 2014 at 3:27
  • 10
    \$\begingroup\$ @kernigh Did you try it? It works fine. (If the last statement of a TI-BASIC program evaluates as an expression, its result is printed instead of 'Done' when the program terminates) \$\endgroup\$ Commented Apr 13, 2015 at 18:04
19
\$\begingroup\$

BASIC, 22 12 7 characters

:-)

1 enil ni rorre xatnyS

EDIT: If you're allowed to enter the program in immediate mode, then this could be reduced to rorre xatnyS (12 characters).

In BBC BASIC, you only need 7 characters:

ekatsiM
\$\endgroup\$
17
\$\begingroup\$

ksh (21 chars)

$ dnuof ton :found :hsk
ksh: dnuof: not found

bash (31 chars)

$ dnuof ton dnammoc :found :hsab-
-bash: dnuof: command not found

sh (29 chars)

$ dnuof ton dnammoc :found :hs-
sh: dnuof: command not found

This one could not work on some Linux distributions, but works on OSX.


tcsh (26 chars)

$ .dnuof ton dnammoC :found.
.dnuof: Command not found.

csh (26 chars)

% .dnuof ton dnammoC :found.
.dnuof: Command not found.

Above should work on all *unix based OS.


Assumptions:

  • You don't have dnuof command or alias present.

bash (2-4 chars)

This one most likely doesn't qualify, but I'll share it as curiosity.

Assuming the previous shell command in Bash was $!. The following command:

!$

will produce: $!.

\$\endgroup\$
5
  • 33
    \$\begingroup\$ Doesn't work for me, i have a command named dnuof \$\endgroup\$
    – Kroltan
    Commented Dec 19, 2013 at 14:23
  • 8
    \$\begingroup\$ I forgot to add, it doesn't work on distributions which has dnuof installed (whatever it is). Damn hackers. \$\endgroup\$
    – kenorb
    Commented Dec 19, 2013 at 15:40
  • 6
    \$\begingroup\$ Hahaha, there's a command named dnuof? :D what does it do? \$\endgroup\$
    – Doorknob
    Commented Dec 19, 2013 at 23:51
  • 1
    \$\begingroup\$ From the name I can tell dnuof = (d)aily (n)ew (u)ser (of). This outputs how many users have been created on this computer today. Its arguments filter which computer(s) on the Internet to show for the daily new users. (The computer names are decoded by the program; each computer is given a different name.) (.dnuof is an alias for dnuof.) \$\endgroup\$
    – user85052
    Commented Nov 8, 2019 at 6:57
  • \$\begingroup\$ ha ha this is funny :)) \$\endgroup\$
    – Tomas
    Commented Jan 10, 2022 at 15:11
15
\$\begingroup\$

C++ 472 characters

A lot of characters but I cant think of a simpler way in a c-based language.

#include<iostream>
#include<string.h>
#define p(t) std::cout<<'}'<<';'<<')'<<strrev(&std::string(#t)[0])<<t;
char* strrev(char*p){char*t=p;char*q=p;while(q&&*q)++q;for(--q;p<q;++p,--q)*p=*p^*q,*q=*p^*q,*p=*p^*q;return t;}
int main(){p("(p{)(niam tni};t nruter;q*^p*=p*,q*^p*=q*,q*^p*=p*)q--,p++;q<p;q--(rof;q++)q*&&q(elihw;p=q*rahc;p=t*rahc{)p*rahc(verrts *rahc;t<<)]0[)t#(gnirts::dts&(verrts<<')'<<';'<<'}'<<tuoc::dts )t(p enifed#>h.gnirts<edulcni#>maertsoi<edulcni#");}
\$\endgroup\$
0
11
\$\begingroup\$

GolfScript, 12 chars

"-1%.`"-1%.`

This code takes the double-quoted string "-1%.`", reverses it (-1%), duplicates it (.) and un-evals (`) the second copy, restoring the double quotes around it.

Previous entry (13 chars):

{`'.~'+-1%}.~

Based on the 8-char quine {'.~'}.~ from this answer; the extra 5 chars are needed to stringify and reverse the output.

Ps. Note that GolfScript automatically appends a newline to the end of the output. If this is counted as part of the output, a corresponding newline can be prepended to either version of the code without affecting the output, for a cost of one extra char.

\$\endgroup\$
11
\$\begingroup\$

Befunge 98 - 10 chars

"8k,'!1+,@

This works if your interpreter does not interpret wrapped lines after " as adding an extra space. If your interpreter does interpret wrapped lines like that, then this 11 char solution works (because duplicate spaces in a string literal are interpreted as one):

"9k,'!1+,@ 

If I can use g without penalty, then these also work (7 and 8 chars respectively):

"5k,g,@

and

"6k,g,@ 
\$\endgroup\$
11
\$\begingroup\$

Fission, 6 bytes

A rare case of a generalised quine that is the same length as the normal quine:

"LO+!'

The idea is the same as that of the normal quine, but we're using a left-going atom (starting at the L) so that print mode traverses the code in the opposite order.

\$\endgroup\$
0
10
\$\begingroup\$

Ruby, 60

puts(2,s=<<2.chop.reverse,s)
puts(2,s=<<2.chop.reverse,s)
2

Based on a classic Ruby quine.

\$\endgroup\$
1
  • \$\begingroup\$ Nice use of heredocs. \$\endgroup\$
    – Jon Purdy
    Commented Dec 23, 2013 at 19:25
9
\$\begingroup\$

Perl, 41

$_=q{print~~reverse"\$_=q{$_};eval"};eval

Old 52 character answer (27+25 penalty)

open+0;print ~~ reverse <0>

Reads its own source, stores the reverse in a scalar, and prints that.

\$\endgroup\$
6
  • 1
    \$\begingroup\$ The scalar operator can be replaced by ~~. However, you need to add +25 to your score for reading your own source code. \$\endgroup\$
    – breadbox
    Commented Dec 18, 2013 at 19:26
  • \$\begingroup\$ @breadbox noted \$\endgroup\$
    – smcg
    Commented Dec 18, 2013 at 19:39
  • \$\begingroup\$ +1. I was about to post something like my shell solution: $_='say"lave;\047",~~reverse,"\047=_\$"';eval, but your solution is shorter :-) Note that you can golf it down to 39 characters using say. Hope you will beat all the esoteric weirdness :-) \$\endgroup\$
    – Tomas
    Commented Feb 1, 2014 at 20:26
  • \$\begingroup\$ @Tomas are you suggesting replacing print with say? That ends up not printing anything. \$\endgroup\$
    – smcg
    Commented Feb 3, 2014 at 14:58
  • \$\begingroup\$ Did you run perl with -Mfeature=say option? \$\endgroup\$
    – Tomas
    Commented Feb 3, 2014 at 15:19
8
\$\begingroup\$

J: 26

Standard quining (26 chars): by defining a function and passing it its own definition, in quotes:

|.(,],2#{:)'|.(,],2#{:)'''

Could probably be made shorter.

J-specific (33 chars): by defining a variable and asking what file the variable was defined in, i.e. this one, then printing out the contents of that file:

1!:2&2|.1!:1(4!:4 a=:<'a'){4!:3''

Must be saved & run from a script (i.e. not in the REPL, because then the answer to the question is "your argument wasn't defined in a file", so there's no file to read).

\$\endgroup\$
3
  • 2
    \$\begingroup\$ The second one should get the + 25 bonus to read the own file. \$\endgroup\$ Commented Dec 18, 2013 at 20:04
  • 2
    \$\begingroup\$ @JohannesKuhn: Penalty, but yeah. \$\endgroup\$
    – jazzpi
    Commented Dec 19, 2013 at 10:08
  • 1
    \$\begingroup\$ "Bonus" sounds nicer. \$\endgroup\$ Commented Dec 19, 2013 at 10:15
8
\$\begingroup\$

><>, 25 bytes

I was surprised to find this hadn't been done yet. :)

...yhsif sllems gnihtemoS

Paste code here and run it.

. is the Jump command, popping x and y off the stack, and moving the IP to (x, y) in the code box. In this case, the stack is empty, so the language's only error message is printed:

Something smells fishy...
\$\endgroup\$
1
  • 1
    \$\begingroup\$ The best answer \$\endgroup\$
    – Insane
    Commented Apr 24, 2016 at 18:28
8
\$\begingroup\$

Microscript, 11 bytes

I kind of had to do this.

0"Caxq"Caxq

Surprisingly, this is actually shorter than the language's shortest known true quine. q and a are otherwise equivalent, except q adds wrapping quotes while a does not.

\$\endgroup\$
0
5
\$\begingroup\$

PHP, 41 characters (+25)

Don't know if I understood the assignment correctly. But here's a PHP try:

while(!isset($s) || $s) echo isset($s) ? array_pop($s) : ($s = str_split(file_get_contents(__FILE__)) and null);

edit: this can be much shorter:

echo strrev(file_get_contents(__FILE__));

But since it can be that simple, this is probably not what is being asked...

\$\endgroup\$
7
  • \$\begingroup\$ phpFiddle: phpfiddle.org/main/code/fuy-mv0 \$\endgroup\$
    – nl-x
    Commented Dec 18, 2013 at 20:24
  • \$\begingroup\$ When I click run, I get a whole bunch of useless nonsense (here is a short snippet of it: >? ;)llun dna ))__ELIF__(f$(tilps_rts = s$( : )s$(pop_yarra ? )s$(tessi ohce )s$ || )s$(tessi!(elihw ;"stnetnoc_"=.f$ ;'teg_elif'=f$ php?<>?}};ESLAF nruter;"ec6x\i66x\02x\e47x\96x\rw ; there is much much more). Also, include your character count; this is a code golf. Also, it seems that you are reading your source file, so add 25 to your character count and that is your score. Lowest score wins. \$\endgroup\$
    – Justin
    Commented Dec 18, 2013 at 21:30
  • \$\begingroup\$ @Quincunx First off, it is backwards ... but secondly, this is the source code that phpfiddle generates! (but backwards...) They seem to escape a lot of thing, trying to keep things safe. Replace array_pop with array_shift to see the source code not backwards... \$\endgroup\$
    – nl-x
    Commented Dec 18, 2013 at 21:33
  • \$\begingroup\$ Yes I can see the reversed source code, but what is with all the extraneous text? There are a lot of escape sequences, but there are some that aren't (eg: ESLAF nruter ie return FALSE). \$\endgroup\$
    – Justin
    Commented Dec 18, 2013 at 21:36
  • \$\begingroup\$ @Quincunx Sorry, I'm not catching if you are showing interest in the way phpFiddle works, or if you are criticizing my code. If it's the latter, then in my defense, put my code in a .php file and run it in a browser, and it'll work cleanly. I just thought phpfiddle was a nice thing to let you see, so you can see a bit of it's inner workings. \$\endgroup\$
    – nl-x
    Commented Dec 18, 2013 at 21:42
5
\$\begingroup\$

UNIX shell, 31

Real solution at 52 characters:

A='printf "A$ lave;\047`echo $A|rev`\047=A"';eval $A

But beware! Honesty doesn't pay off in today's world! Penalty is too low!!

6 chars + 25 = 31:

rev $0
\$\endgroup\$
1
  • \$\begingroup\$ On OSX rev $0 generates the error: rev: illegal option -- b. \$\endgroup\$
    – kenorb
    Commented Jul 21, 2014 at 13:21
5
\$\begingroup\$

Windows 10 .EXE, 98 bytes

.rehsilbup erawtfos eht htiw kcehc ,CP ruoy htiw noisrev a dnif oT

.CP ruoy no nur t'nac ppa sihT

enter image description here

\$\endgroup\$
1
4
\$\begingroup\$

MATLAB, 78 characters:

 
|
.snoisserpxe ro stnemetats BALTAM ni dilav ton si retcarahc tupni ehT :rorrE

Note that the solution requires you to begin with a special character (alt+0160) and that it prints exactly the reversed message. (Unlike the python solution)

\$\endgroup\$
4
\$\begingroup\$

JavaScript jQuery 119 92 74 70 characters

alert($("#answer-16051 pre code").text().split("").reverse().join(""))

Now using jQuery, as minitech suggested in the comments, and manually wrapping with <pre><code> so I can use text() without fear of other code blocks in this post interfering. Manually wrapping with <h4> was incompatible with chromeium when I tested it, so now it should work in most browsers.

This program, if run from this page, finds the code block directly above, reverses its contents, and puts it in an alertbox.

Its easy enough to verify, just paste it into the dev console.

\$\endgroup\$
4
  • \$\begingroup\$ This is way longer than just using a function. And you should use jQuery (on this page) or at least querySelector anyways… \$\endgroup\$
    – Ry-
    Commented Dec 19, 2013 at 17:58
  • \$\begingroup\$ @minitech thanks for the tip, I swapped it for a querySelector now. I would like to look into the jQuery possibility, but it looks like it will take a little longer for me to figure out. \$\endgroup\$ Commented Dec 19, 2013 at 18:37
  • \$\begingroup\$ @minitech ok, thanks for the jQuery tip. (I only started learning javascript yesterday.) \$\endgroup\$ Commented Dec 19, 2013 at 18:45
  • \$\begingroup\$ I like this solution; thinking outside the box. \$\endgroup\$
    – user36219
    Commented Apr 13, 2015 at 17:35
4
\$\begingroup\$

MS-DOS, 24 bytes

eman elif ro dnammoc daB

Output:

Bad command or file name
\$\endgroup\$
3
\$\begingroup\$

JavaScript, 62

function f(){alert((f+'f()').split('').reverse().join(''))}f()

Works for me on latest Chrome (v 31.0.1650.63). Some other browsers may give a different output. (If you reverse that output, then it would work :P)

\$\endgroup\$
3
\$\begingroup\$

SmileBASIC, 118 102 bytes

FOR I=-101TO.?MID$(("+CHR$(34))*3,30,102)[-I];:NEXTFOR I=-100TO.?MID$(("+CHR$(34))*3,30,102)[-I];:NEXT
\$\endgroup\$
3
+200
\$\begingroup\$

Japt, 12 bytes

"iQ ²w"iQ ²w

Try it online!

Based off the standard Japt quine

Explanation

"iQ ²w"      // Take this string.        iQ ²w
       iQ    // Insert a quote.          "iQ ²w
          ²  // Double.                  "iQ ²w"iQ ²w
           w // Reverse.                 w² Qi"w² Qi"
             // Implicitly output.
\$\endgroup\$
3
  • \$\begingroup\$ Congrats on your 5th Japt solution; bounty on its way. \$\endgroup\$
    – Shaggy
    Commented Feb 26, 2019 at 13:30
  • 2
    \$\begingroup\$ @Shaggy wait >_> I wasn't doing this for the bounty \$\endgroup\$
    – ASCII-only
    Commented Feb 26, 2019 at 21:32
  • 1
    \$\begingroup\$ Happy coincidentally for you, so, that there's one going :) \$\endgroup\$
    – Shaggy
    Commented Feb 26, 2019 at 22:20
3
\$\begingroup\$

Windows command prompt, 93 bytes

.elif hctab ro margorp elbarepo ,dnammoc lanretxe ro lanretni na sa dezingocer ton si 'file.'

enter image description here

\$\endgroup\$
2
\$\begingroup\$

JavaScript, 56

($=_=>_!=$._?_?$(_.slice(1))+_[0]:')':$('($='+$+')('))()
\$\endgroup\$
2
  • \$\begingroup\$ Please state your environment because this does not work in Chrome. Is this Rhino or what? \$\endgroup\$ Commented Dec 20, 2013 at 13:39
  • \$\begingroup\$ @GeorgeReith: Anything with ES6 arrow function support. All SpiderMonkeys should work fine, for example (Rhino included). \$\endgroup\$
    – Ry-
    Commented Dec 20, 2013 at 14:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.