17
\$\begingroup\$

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>

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

14 Answers 14

13
\$\begingroup\$

Pyth, 0.75 bytes

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

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

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.

\$\endgroup\$
0
6
\$\begingroup\$

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

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

Polyglot, 0 bytes


Try It Online! (you'll have to select a language yourself)

The challenge specifies taking an integer \$ 0 \le n \lt \text{len}(\text{program}) \$, but with a 0-byte program there is no integer that is both ≥ 0 and < 0. This means the program can do whatever it wants - think of running this program as undefined behaviour.

When I say polyglot, I mean that it works in any language whatsoever.

\$\endgroup\$
7
  • 2
    \$\begingroup\$ This feels like abuse of a loophole to me. \$\endgroup\$
    – Shaggy
    Commented Mar 15, 2023 at 12:19
  • 1
    \$\begingroup\$ Empty quine is improper \$\endgroup\$
    – l4m2
    Commented Mar 16, 2023 at 1:59
  • 1
    \$\begingroup\$ It isn't a program that outputs itself by virtue of being empty and doing nothing, it's a program that never has to output anything :P \$\endgroup\$ Commented Mar 17, 2023 at 23:34
  • \$\begingroup\$ When I say polyglot, I mean that it works in any language whatsoever. There are in fact many programming languages that consider an empty source code file as a syntax error. \$\endgroup\$ Commented Mar 19, 2023 at 12:55
  • 1
    \$\begingroup\$ Yeah, I would consider this a loophole through triviality. It is funny though, since it is technically correct. \$\endgroup\$ Commented Mar 31, 2023 at 21:23
5
\$\begingroup\$

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.
\$\endgroup\$
1
  • 6
    \$\begingroup\$ Of course, 0 would have been slightly shorter... \$\endgroup\$
    – Dennis
    Commented Feb 2, 2016 at 5:13
4
\$\begingroup\$

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

\$\endgroup\$
3
  • \$\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\$
    – anon
    Commented 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
    Commented Feb 2, 2016 at 20:48
  • \$\begingroup\$ Ah, I missed that. My bad. \$\endgroup\$
    – anon
    Commented Feb 2, 2016 at 20:48
3
\$\begingroup\$

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.

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

Japt, 11 2 bytes

All of the following use 0-based, modular indexing and support negative indexing.

gg

Try it

gg     :Implicit input of integer
g      :Index into
 g     :Literal "g"

Original, 11 bytes

Based on one of ETH's standard Japt quines.

gBîQi"gBîQi

Try it (Includes full test suite)

gBîQi"gBîQi     :Implicit input of integer
g               :Index into
 B              :  11
  î             :  Repeat to length B
   Q            :    Quotation mark
    i           :    Prepend
     "gBîQi     :      String literal

Array input, 13 bytes

Same as above with the m at the start being map and the D being 13, in place of 11.

mgDîQi"mgDîQi

Try it

\$\endgroup\$
2
  • \$\begingroup\$ You can multiply by \$ 0.95 \$ if you support negative inputs \$\endgroup\$
    – The Thonnu
    Commented Mar 15, 2023 at 9:43
  • 1
    \$\begingroup\$ I don't like bonuses, @TheThonnu; I don't think they should be allowed. \$\endgroup\$
    – Shaggy
    Commented Mar 15, 2023 at 9:51
2
\$\begingroup\$

Python 2, 46.55 bytes

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

Supports negative indices.

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

RProgN 2, 6 bytes

«•.\ü 

Includes a trailing space.

Explaination

«•.\ü 
«      # Push the remainer of the code as a function and continue execution
 •.    # Append a space to the end of the function as a string
   \   # Swap the string under the input value
    ü  # Get the character at that index
       # A trailing space is included to ensure quine validity.

Try it online!

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

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="
\$\endgroup\$
1
\$\begingroup\$

Befunge 93, 5 bytes

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

&0g,@
\$\endgroup\$
1
  • 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
    Commented Nov 17, 2016 at 20:53
1
\$\begingroup\$

Thunno, \$ 32 \log_{256}(96) \approx \$ 26.34 * 0.75 \$ \approx \$ 19.75 bytes

"D34CXx+xs+s+sAI"D34CXx+xs+s+sAI

Attempt This Online!

Based on @lyxal's Thunno quine. Supports negative indices and ranges.

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

Lenguage, 4 x 0.75 = 3 bytes

00 00 00 00

Equivalent to Brainfuck ., outputting byte 0

\$\endgroup\$

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.