Input number; Output line number

18

5

Code Golf

Totally real backstory: I'm a contractor working on a website www.Sky.Net and one of our tasks it to create some self-aware program or something, I don't know I wasn't really listening to the boss. Anyways in an effort to make our code more self-aware we need IT to be able to know what code is on each line-number.


Challenge

Create a program or function that takes an input n and returns the code of said program or function on line n.


Rules

➊ Your program or function must be at least 4 lines long. Each line must be unique.

➋ You may assume the input will always be a positive integer greater than or equal to 1 and less than or equal to the number of lines in your program/function.

➌ The first line in your program/function is line 1, not line 0.

➍ You can not access the file that your program is on. (If someone has to ask "Isn't this technically breaking rule #4"; it probably is)

➎ Lines can-not be empty (this includes a space if spaces don't do anything in your language)

➏ Lines can-not be //comments (/* of any <!--style)


This is a -like challenge
This is , so the submission with the fewest bytes wins!

Albert Renshaw

Posted 2017-02-27T00:03:09.780

Reputation: 2 955

Let us continue this discussion in chat.

– Conor O'Brien – 2017-02-27T00:17:08.193

1

I'd like to see this done in 99 :)

– Jonathan Allan – 2017-02-27T01:14:16.337

2@JonathanAllan You might run into the issue where not every line is unique – MildlyMilquetoast – 2017-02-27T01:15:19.157

"Lines cannot be comments, but I guess effective no-ops are OK" (but honestly, sometimes it's hard to say whether a line should count as a no-op or not; for example my Ruby answer has the last line be only a curly bracket to end the lambda) – Value Ink – 2017-02-27T01:26:18.030

The title might be better "Input number; Output line with that line number"? Or even "Output line by number". – Paŭlo Ebermann – 2017-02-27T21:50:18.483

@PaŭloEbermann That's more accurate but I'm a minimalist – Albert Renshaw – 2017-02-27T23:16:56.430

@AlbertRenshaw the point is that the title sounds more like searching for the input number in some text and returning the line number where it is found. – Paŭlo Ebermann – 2017-02-27T23:34:17.270

Answers

16

Vim, 7 bytes

1
2
3
4

Try it online!

As far as I can tell, this complies with all of the rules. In vim by default, the empty program prints out all of the input. Since

<N><CR>

Is a noop, nothing changes the input text, and since each input matches the desired output, this same approach works with any number of lines.

James

Posted 2017-02-27T00:03:09.780

Reputation: 54 537

2

Will work in other languages - first addition: Pyth

– Jonathan Allan – 2017-02-27T01:12:07.740

Wait, bytes? Vim is measured in keystrokes. – Pavel – 2017-02-27T04:57:47.877

@JonathanAllan It looks like Pyth is configured wrong on TIO. If you look at the debug output, you can see that the code that is actually being run is the thing in the argument field, not the thing in the code field. This is what actually running that code looks like.

– isaacg – 2017-02-27T06:00:31.317

@isaacg Oh, OK posting in TIO room... – Jonathan Allan – 2017-02-27T06:46:34.637

1

@Pavel only in editor golf challenges

– Martin Ender – 2017-02-27T07:29:49.933

2This also works in Brachylog – Fatalize – 2017-02-27T07:35:52.407

9

Ruby, 71 70 66 bytes

Try it online!

->n{
k=["}", "k[-n]%%k.inspect", "k=%s", "->n{"]
k[-n]%k.inspect
}

"Cheating" Mode: 7+1 = 8 bytes

Requires the -p flag for +1 byte. Literally a copy of the V answer. Prints the number that is inputted; the entire program is effectively just no-ops.

1
2
3
4

Value Ink

Posted 2017-02-27T00:03:09.780

Reputation: 10 608

What does -p do? – Pavel – 2017-02-27T01:25:44.143

@Pavel It causes the program to read each line of STDIN into $_, runs the program contents, and then prints the contents of $_ to screen (repeating per line of STDIN). Since the program does nothing, it's practically just Unix cat, but that means that every input from 1-4 will output the contents of the line, because each line is literally its line number. – Value Ink – 2017-02-27T01:30:05.820

@Pavel for more information see https://robm.me.uk/ruby/2013/11/20/ruby-enp.html

– Value Ink – 2017-02-27T01:31:36.317

I like your "cheating" answer. Perl also has -p, but 1\n2\n3\n4 is not a valid Perl program. – ThisSuitIsBlackNot – 2017-02-27T18:54:11.153

7

Haskell, 69 59 bytes

(lines(s++show
 s)
 !!)
s="\n(lines(s++show\n s)\n !!)\ns="

Based on the standard Haskell quine. The first expression (spread over the first three lines) is an unnamed function that picks the nth line from the quinified string s (s++show s). +2 bytes for making indexing 1-based (imho an unnecessary rule).

For a Try it online! version I have to name the function which adds 4 bytes.

nimi

Posted 2017-02-27T00:03:09.780

Reputation: 34 639

Does this break rule 6? :) – Albert Renshaw – 2017-02-27T01:11:42.197

Line indexing is not supposed to be 0-based, the rules explicitly require 1-indexing. – Value Ink – 2017-02-27T01:14:54.487

@AlbertRenshaw: fixed – nimi – 2017-02-27T01:24:19.530

@ValueInk: fixed – nimi – 2017-02-27T01:24:33.383

@nimi lol, "solutions" like this are why I was tempted to make this a popularity contest haha. Nevertheless, good work! – Albert Renshaw – 2017-02-27T01:28:24.777

5

PowerShell, 184 172 bytes

$v=0,
'$v=0,',
"'`$v=0',",(($q='"{0}`$v=0{0},",(($q={0}{1}{0})-f([char]39),$q)')-f([char]39),$q),
(($z='(($z={0}{1}{0})-f([char]39),$z;$v[$args]')-f([char]39),$z);$v[$args]

Try it online!

Explanation

Starts by creating an array $v on the first line. On that same line, the first (0th) element is set to 0, and a comma , continues its definition.

The next line sets the next element (1) of the array to a string representing the content of the first line of the script, so that $v[1] returns the first line.

The 3rd line first sets the 3rd element of the array (index 2) to a string representing the 2nd line of the script, then on the same line sets the 4th element (index 3) using a quine snippet that uses the format operator (-f) to replace certain instances of single quotes ([char]39) and the format template string, into itself, to reproduce the entirety of the 3rd line.

Line 4 basically does the same thing, but also ends the creation of the array and then indexes into it using the supplied argument.

briantist

Posted 2017-02-27T00:03:09.780

Reputation: 3 110

4

Python 2, 104 73 67 bytes

Thanks to Jonathan Allan for saving 6 bytes!

s=\
['print s[input()]or s', 's=\\', 0, 'exec s[', '0]']
exec s[
0]

Edit: Same byte count, but I like this solution better

Try it online!

Python version of Value Ink's Ruby answer.

Older answer (67 bytes):

1
s=\
['print s[-input()]or s', 0, 's=\\', 1]
print s[-input()]or s

math junkie

Posted 2017-02-27T00:03:09.780

Reputation: 2 490

Save 6 by getting rid of n: TIO

– Jonathan Allan – 2017-02-27T03:52:12.547

@ovs the challenge requirement requires 4 lines minimum of source code though :V – Value Ink – 2017-02-27T07:14:40.293

2

CJam, 19 18 17 bytes

1
{'_'~]ri(=}
_
~

Try it online!

Based on the standard CJam-quine. The {...}_~ runs the ... with the block itself on the stack (and in this case, also 1 below that). Then we do:

'_'~  e# Push the third and fourth line.
]     e# Wrap all four lines in a list.
ri    e# Read input and convert to integer.
(=    e# Use as index into the lines.

Martin Ender

Posted 2017-02-27T00:03:09.780

Reputation: 184 808

This is beautiful. Also like the logic's smiley face ending (= haha – Albert Renshaw – 2017-02-27T20:57:00.973

1

PHP, 261 bytes

<?php function f($l){
$a="aWYoJGw9PTEpJG09Ijw/cGhwIGZ1bmN0aW9uIGYoXCRsKXsiO2lmKCRsPT0yKSRtPSJcJGE9XCIkYVwiOyI7aWYoJGw9PTMpJG09IlwkYj1cIiR";
$b="iXCI7IjtpZigkbD09NCkkbT0iZXZhbChiYXNlNjRfZGVjb2RlKFwkYS5cJGIpKTt9Pz4iO2VjaG8gJG07";
eval(base64_decode($a.$b));}?>

Try it online !!

The encoded string is:

if($l==1)$m="<?php function f(\$l){";
if($l==2)$m="\$a=\"$a\";
if($l==3)$m="\$b=\"$b\";
if($l==4)$m="eval(base64_decode(\$a.\$b));}?>";
echo $m;

Divcy

Posted 2017-02-27T00:03:09.780

Reputation: 501

Interesting! What are the encoded strings? – Albert Renshaw – 2017-02-28T06:47:03.237

1@Albert Renshaw I have edited it to add decoded version of the string. – Divcy – 2017-02-28T09:33:12.090

0

Perl, 52 bytes

$_=q{print+(split/
/,"\$_=q{$_};
eval")[<>-1]};
eval

This is a simple variation on the classic quine

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

The "payload" is split on newlines and the correct line is selected by indexing into the resulting list.

Perl, 49 48 bytes (non-competing)

#!/usr/bin/perl -d:A
sub DB'DB{
print${"_<$0"}[<>]}
1

38 bytes for the code (excluding the shebang but including -d:A) plus 10 bytes for the filename, which must be Devel/A.pm. The Devel directory must be in @INC.

Technically, this violates Rule #4 because -d:A causes the file to be parsed twice, so it's a non-competing solution.

It uses a debugger hook to access the lines of the file, which perl stores in the @{"_<$filename"} array at compile time.

ThisSuitIsBlackNot

Posted 2017-02-27T00:03:09.780

Reputation: 1 050