The goal of this challenge is to make a program that outputs the nth letter of its source code where n is given as input to the program. Like most quine challenges, you are not allowed to read your source code as a file or use any builtin quine functions.


An integer 0 <= n < len(program).


The nth character (not byte) of your program.


Like most codegolf questions, you win the challenge by using the lowest number of bytes to solve the challenge.


-5% If your program supports negative indices python style (e.g. -1 would be the last character of your program). If used with the below bonus, your ranges must support negative indices.
-20% If your program supports ranges as input (any format) in addition to the above requirements.
-25% If your program complete both bonuses.


Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.

To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:

# Language Name, N bytes

where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

# Ruby, <s>104</s> <s>101</s> 96 bytes

If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

# Perl, 43 + 2 (-p flag) = 45 bytes

You can also make the language name a link which will then show up in the leaderboard snippet:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=70727,OVERRIDE_USER=32700;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&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(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.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(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d\.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;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="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <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><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><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

  • \$\begingroup\$ Are quine builtins forbidden? \$\endgroup\$
    – user45941
    Feb 1, 2016 at 22:19
  • \$\begingroup\$ @Mego yes, they are. \$\endgroup\$ Feb 1, 2016 at 22:21
  • \$\begingroup\$ Do bonuses stack (100% - 20% - 5% = 75%) or multiply (100% * 80% * 95% = 76%)? \$\endgroup\$ Feb 1, 2016 at 23:18
  • \$\begingroup\$ Do programs that don't actually read their input count? \$\endgroup\$
    – Neil
    Feb 2, 2016 at 0:03
  • \$\begingroup\$ @ETHproductions Stack. \$\endgroup\$ Feb 2, 2016 at 0:13

9 Answers 9


Pyth, 0.75

(Also happens to be a CJam polyglot, and probably many other languages.)


Expects input on STDIN:

llama@llama:~$ echo 0..0 | pyth -c '0'

Any single digit works, of course. Not exactly the most interesting challenge in Pyth.

  • 1
    \$\begingroup\$ It happens to be a polyglot in many other languages, too. \$\endgroup\$ Feb 1, 2016 at 22:21
  • \$\begingroup\$ works in PlatyPar too \$\endgroup\$
    – Cyoce
    Feb 1, 2016 at 22:51
  • 1
    \$\begingroup\$ and Japt, and Jolf, and almost every language with implicit output \$\endgroup\$ Feb 1, 2016 at 23:21
  • 9
    \$\begingroup\$ And PHP, which is clearly the best language for golfing. \$\endgroup\$
    – user253751
    Feb 2, 2016 at 4:21

Javascript ES6, 31 bytes



The standard quine framework:


[prompt()], which is the addon, gets the value at the input index of the resulting quine string.


𝔼𝕊𝕄𝕚𝕟, 9 chars / 19 bytes


Try it here (Firefox only).

Ay, 19th byte!

0 works too (and is much better), but it's way too trivial for my liking.

In addition, ℹ ï,⧺ï would also work, but quine functions aren't allowed.


The standard quine framework is ⟮ɕṡ+ᶈ0.

)⎖ï takes the resulting quine string and gets the character at the input index.

Bonus solution, 11.4 chars / 25.65 bytes


Try it here (Firefox only).

This one qualifies for the 5% bonus, but still does not beat my original submission.


This one uses the stack. ᵖ…ɕṡ+ᶈ0; just pushes the quine string's individual characters to the stack, and ôᵍï directly outputs the character at the input index (positive or negative) in the stack.

  • \$\begingroup\$ Why haven't you made an encoding for this yet? \$\endgroup\$ Feb 2, 2016 at 8:54
  • \$\begingroup\$ Updates are coming too fast! Can't keep up! \$\endgroup\$ Feb 2, 2016 at 14:17

CJam, 12.35 bytes


The program is 13 bytes long and qualifies for the × 0.95 bonus. Try it online!

How it works

{         }      Define a code block.
           _~    Push a copy and execute the copy.
 s               Cast the original code block to string.
  "_~"+          Append "_~".
       ri        Read an integer from STDIN.
         =       Retrieve the character at that index.
  • 4
    \$\begingroup\$ Of course, 0 would have been slightly shorter... \$\endgroup\$
    – Dennis
    Feb 2, 2016 at 5:13

Ruby, 53 * 0.75 = 39.75

$><<(<<2*2+?2)[eval gets]
$><<(<<2*2+?2)[eval gets]

Generates a HEREDOC string delimited by a 2 on its own line, concatenates it (*2) and then adds in the final 2 via a character literal. Slices into it using Ruby's built in String#[], which supports positive integers, negative integers, and ranges (input in the form m..n). $><< is output. (puts would require an extra space here).

  • \$\begingroup\$ I think gets.to_i would do the same thing as eval gets, and be clearer. It wouldn't handle non-integer input, but that's not necessary anyway \$\endgroup\$
    – Nic
    Feb 2, 2016 at 20:09
  • \$\begingroup\$ That's normally what I'd do, but this gets the bonus for handling Ranges. (Also the non-existent bonus for being turing complete). \$\endgroup\$
    – histocrat
    Feb 2, 2016 at 20:48
  • \$\begingroup\$ Ah, I missed that. My bad. \$\endgroup\$
    – Nic
    Feb 2, 2016 at 20:48

Ruby, 38.25 bytes

a="a=%p;$><<(a%%a)[eval gets]";$><<(a%a)[eval gets]

Support negative indices and ranges. I blatantly picked up both $><< and the eval trick from histocrat, and the quine trick was someone else's to begin with, so I'll make this CW.


Python 2, 46.55 bytes


Supports negative indices.

  • \$\begingroup\$ Yes, this supports negative indicies. \$\endgroup\$
    – cat
    Feb 2, 2016 at 2:58

Haskell, 122 bytes

main=getLine>>= \i->putChar$(!!(read i))$p++show p where p="main=getLine>>= \\i->putChar$(!!(read i))$p++show p where p="


main=getLine>>= \i->putChar$(!!(read i))$p++show p
 where p="main=getLine>>= \\i->putChar$(!!(read i))$p++show p\n where p="

Befunge 93, 5 bytes

This is pretty (very) late but I'll post it anyway:

  • 1
    \$\begingroup\$ This is on the edge of being legal IMO. It doesn't read its own source code as a file, but it does read its own source code. \$\endgroup\$
    – user62131
    Nov 17, 2016 at 20:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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