Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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:

# [><>](, 121 bytes

var QUESTION_ID=70727,OVERRIDE_USER=32700;function answersUrl(e){return""+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return""+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}}",,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,}});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}}",,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=""></script> <link rel="stylesheet" type="text/css" href="//"> <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>

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

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.

share|improve this answer
It happens to be a polyglot in many other languages, too. – Mama Fun Roll Feb 1 at 22:21
works in PlatyPar too – Cyoce Feb 1 at 22:51
and Japt, and Jolf, and almost every language with implicit output – ETHproductions Feb 1 at 23:21
And PHP, which is clearly the best language for golfing. – immibis Feb 2 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.

share|improve this answer

𝔼𝕊𝕄𝕚𝕟, 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.

share|improve this answer
Why haven't you made an encoding for this yet? – VTCAKAVSMoACE Feb 2 at 8:54
Updates are coming too fast! Can't keep up! – Mama Fun Roll Feb 2 at 14:17

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).

share|improve this answer
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 – QPaysTaxes Feb 2 at 20:09
That's normally what I'd do, but this gets the bonus for handling Ranges. (Also the non-existent bonus for being turing complete). – histocrat Feb 2 at 20:48
Ah, I missed that. My bad. – QPaysTaxes Feb 2 at 20:48

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.
share|improve this answer
Of course, 0 would have been slightly shorter... – Dennis Feb 2 at 5:13

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.

share|improve this answer

Python 2, 46.55 bytes


Supports negative indices.

share|improve this answer
Yes, this supports negative indicies. – cat Feb 2 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="
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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