Indexable quine

14

1

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.

Input

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

Output

The nth character (not byte) of your program.

Winning

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

Bonuses

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

Leaderboards

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>

TheNumberOne

Posted 2016-02-01T22:16:32.807

Reputation: 10 855

Are quine builtins forbidden? – Mego – 2016-02-01T22:19:06.940

@Mego yes, they are. – TheNumberOne – 2016-02-01T22:21:40.797

Do bonuses stack (100% - 20% - 5% = 75%) or multiply (100% * 80% * 95% = 76%)? – ETHproductions – 2016-02-01T23:18:06.607

Do programs that don't actually read their input count? – Neil – 2016-02-02T00:03:18.187

@ETHproductions Stack. – TheNumberOne – 2016-02-02T00:13:21.663

@Neil Yes, it is already too late in my opinion to change that. – TheNumberOne – 2016-02-02T00:14:26.787

Is Piet throwing an error applicable? – user3819867 – 2016-02-02T08:49:52.420

Do you have to support mixed positive and negative ranges, e.g. 0..-1 (entire program), -1..0 (last character followed by first character)? – ThisSuitIsBlackNot – 2016-02-02T18:55:06.937

@ThisSuitIsBlackNot If you want to go for both bonuses, you do have to support mixed positive and negative ranges. How you interpret that is up to you. – TheNumberOne – 2016-02-02T21:03:58.633

Answers

12

Pyth, 0.75

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

0

Expects input on STDIN:

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

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

Doorknob

Posted 2016-02-01T22:16:32.807

Reputation: 68 138

1It happens to be a polyglot in many other languages, too. – Mama Fun Roll – 2016-02-01T22:21:53.933

works in PlatyPar too – Cyoce – 2016-02-01T22:51:17.447

1and Japt, and Jolf, and almost every language with implicit output – ETHproductions – 2016-02-01T23:21:47.177

9And PHP, which is clearly the best language for golfing. – user253751 – 2016-02-02T04:21:55.517

8

Javascript ES6, 31 bytes

$=_=>`$=${$};$()`[prompt()];$()

Explanation

The standard quine framework:

$=_=>`$=${$};$()`;$()

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

Mama Fun Roll

Posted 2016-02-01T22:16:32.807

Reputation: 7 234

6

, 9 chars / 19 bytes

⟮ɕṡ+ᶈ0)⎖ï

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.

Explanation

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

⟮ᵖ…ɕṡ+ᶈ0;ôᵍï

Try it here (Firefox only).

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

Explanation

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.

Mama Fun Roll

Posted 2016-02-01T22:16:32.807

Reputation: 7 234

Why haven't you made an encoding for this yet? – Addison Crump – 2016-02-02T08:54:06.147

Updates are coming too fast! Can't keep up! – Mama Fun Roll – 2016-02-02T14:17:56.283

5

CJam, 12.35 bytes

{s"_~"+ri=}_~

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.

Dennis

Posted 2016-02-01T22:16:32.807

Reputation: 196 637

4Of course, 0 would have been slightly shorter... – Dennis – 2016-02-02T05:13:58.023

4

Ruby, 53 * 0.75 = 39.75

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

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

histocrat

Posted 2016-02-01T22:16:32.807

Reputation: 20 600

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 – Fund Monica's Lawsuit – 2016-02-02T20:09:55.050

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 – 2016-02-02T20:48:08.913

Ah, I missed that. My bad. – Fund Monica's Lawsuit – 2016-02-02T20:48:33.190

3

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.

Lynn

Posted 2016-02-01T22:16:32.807

Reputation: 55 648

1

Python 2, 46.55 bytes

a="a=%r;print(a%%a)[input()]";print(a%a)[input()]

Supports negative indices.

Lynn

Posted 2016-02-01T22:16:32.807

Reputation: 55 648

Yes, this supports negative indicies. – cat – 2016-02-02T02:58:38.150

1

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="

Ungolfed:

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

HEGX64

Posted 2016-02-01T22:16:32.807

Reputation: 313

1

Befunge 93, 5 bytes

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

&0g,@

Daniel

Posted 2016-02-01T22:16:32.807

Reputation: 6 425

1This 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. – None – 2016-11-17T20:53:33.180