Nummer eingeben; Ausgabezeilennummer

18

Code Golf

Völlig echte Hintergrundgeschichte: Ich arbeite als Auftragnehmer an einer Website www. Sky.Net und eine unserer Aufgaben ist es, ein selbstbewusstes Programm oder so etwas zu erstellen. Ich weiß nicht, dass ich dem Chef nicht wirklich zugehört habe. Um unseren Code selbstbewusster zu machen, muss die IT wissen, welcher Code in jeder Zeilennummer enthalten ist.


Herausforderung

Erstellen Sie ein Programm oder eine Funktion, die eine Eingabe akzeptiert nund den Code des Programms oder der Funktion online zurückgibt n.


Regeln

➊ Ihr Programm oder Ihre Funktion muss mindestens 4 Zeilen lang sein. Jede Zeile muss eindeutig sein.

➋ Sie können davon ausgehen, dass die Eingabe immer eine positive Ganzzahl größer oder gleich 1 und kleiner oder gleich der Anzahl der Zeilen in Ihrem Programm / Ihrer Funktion ist.

➌ Die erste Zeile in Ihrem Programm / Ihrer Funktion ist Zeile 1, nicht Zeile 0.

➍ Sie können nicht auf die Datei zugreifen, auf der sich Ihr Programm befindet. (Wenn jemand fragen muss: "Ist das nicht die Regel Nr. 4, die technisch bricht?", Ist es wahrscheinlich.)

➎ Zeilen können nicht leer sein (dies schließt ein Leerzeichen ein, wenn Leerzeichen in Ihrer Sprache nichts bewirken )

➏ Zeilen können keine // Kommentare sein (/ * eines beliebigen <! - Stils)


Dies ist eine ähnliche Herausforderung.
Dies ist , also gewinnt die Einsendung mit den wenigsten Bytes!

Albert Renshaw
quelle
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Conor O'Brien
1
Ich würde es gerne in 99 sehen :)
Jonathan Allan
2
@ JonathanAllan Möglicherweise stoßen Sie auf ein Problem, bei dem nicht jede Zeile eindeutig ist
MildlyMilquetoast
"Zeilen können keine Kommentare sein, aber effektive No-Ops sind in Ordnung" (aber ehrlich gesagt ist es manchmal schwer zu sagen, ob eine Zeile als No-Op gelten soll oder nicht; meine Ruby-Antwort lautet beispielsweise, dass die letzte Zeile nur a ist geschweifte Klammer, um das Lambda zu beenden)
Value Ink
Der Titel könnte besser sein "Eingabe Nummer; Ausgabe Zeile mit dieser Zeilennummer"? Oder auch "Zeile nach Nummer ausgeben".
Paŭlo Ebermann

Antworten:

16

Vim, 7 Bytes

1
2
3
4

Probieren Sie es online!

Soweit ich das beurteilen kann, entspricht dies allen Regeln. In vim druckt das leere Programm standardmäßig alle Eingaben aus. Schon seit

<N><CR>

Ist ein Noop, ändert sich der Eingabetext nicht, und da jede Eingabe mit der gewünschten Ausgabe übereinstimmt, funktioniert derselbe Ansatz mit einer beliebigen Anzahl von Zeilen.

DJMcMayhem
quelle
2
Wird in anderen Sprachen funktionieren - erste Ergänzung: Pyth
Jonathan Allan
Warten Sie, Bytes? Vim wird in Tastenanschlägen gemessen.
Pavel
@ JonathanAllan Es sieht so aus, als ob Pyth auf TIO falsch konfiguriert ist. Wenn Sie sich die Debug-Ausgabe ansehen, können Sie feststellen, dass der tatsächlich ausgeführte Code das Objekt im Argumentfeld und nicht das Objekt im Codefeld ist. So sieht es eigentlich aus, wenn dieser Code ausgeführt wird.
Isaacg
1
@Pavel nur in Editor Golf Herausforderungen
Martin Ender
2
Dies funktioniert auch in Brachylog
Fatalize
9

Ruby, 71 70 66 Bytes

Probieren Sie es online!

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

"Cheating" -Modus: 7 + 1 = 8 Bytes

Benötigt das -pFlag für +1 Byte. Buchstäblich eine Kopie der V-Antwort . Gibt die eingegebene Nummer aus. Das gesamte Programm ist praktisch nur No-Ops.

1
2
3
4
Wert Tinte
quelle
Was macht -pdas?
Pavel
@Pavel Das Programm liest jede STDIN-Zeile ein $_, führt den Programminhalt aus und druckt dann den Inhalt $_auf dem Bildschirm aus (Wiederholung pro STDIN-Zeile). Da das Programm nichts tut, ist es praktisch nur Unix cat, aber das bedeutet, dass jede Eingabe von 1-4 den Inhalt der Zeile ausgibt, da jede Zeile buchstäblich ihre Zeilennummer ist.
Value Ink
@Pavel für weitere Informationen siehe robm.me.uk/ruby/2013/11/20/ruby-enp.html
Value Ink
Ich mag deine "betrügerische" Antwort. Perl hat auch -p, ist aber 1\n2\n3\n4kein gültiges Perl-Programm.
ThisSuitIsBlackNot
7

Haskell, 69-59 Bytes

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

Basierend auf dem Standard Haskell Quine. Der erste Ausdruck (über die ersten drei Zeilen verteilt) ist eine unbenannte Funktion, die die n-te Zeile aus der quinifizierten Zeichenfolge s( s++show s) auswählt . +2 Bytes für die Indizierung auf 1-Basis (imho eine unnötige Regel).

Für eine Online ausprobieren! version Ich muss die Funktion benennen, die 4 Bytes hinzufügt.

nimi
quelle
Verstößt diese Regel gegen 6? :)
Albert Renshaw
Die Zeilenindizierung sollte nicht 0-basiert sein, da die Regeln explizit eine 1-Indizierung erfordern.
Value Ink
@ AlbertRenshaw: behoben
nimi
@ValueInk: behoben
nimi
@nimi lol, " Lösungen " wie diese sind, warum ich versucht war, dies zu einem Beliebtheitswettbewerb zu machen, haha. Trotzdem gute Arbeit!
Albert Renshaw
5

PowerShell , 184 172 Byte

$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]

Probieren Sie es online!

Erläuterung

Beginnt mit dem Erstellen eines Arrays $vin der ersten Zeile. In derselben Zeile wird das erste ( 0th) Element auf gesetzt 0, und ein Komma ,setzt seine Definition fort.

Die nächste Zeile setzt das nächste Element ( 1) des Arrays auf eine Zeichenfolge, die den Inhalt der ersten Zeile des Skripts darstellt, sodass $v[1]die erste Zeile zurückgegeben wird.

Die 3. Zeile setzt zuerst das 3. Element des Arrays (Index 2) auf einen String, der die 2. Zeile des Skripts darstellt, und setzt dann in derselben Zeile das 4. Element (Index 3) unter Verwendung eines Quine-Snippets, das den Formatoperator ( -f) zum Ersetzen verwendet bestimmte Instanzen von einfachen Anführungszeichen ( [char]39) und der Formatvorlagenzeichenfolge in sich selbst, um die gesamte dritte Zeile zu reproduzieren.

Zeile 4 macht im Grunde das Gleiche, beendet aber auch die Erstellung des Arrays und indiziert es dann mit dem angegebenen Argument.

Briantist
quelle
4

Python 2, 104 73 67 Bytes

Vielen Dank an Jonathan Allan für das Speichern von 6 Bytes!

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

Edit: Gleiche Byteanzahl, aber mir gefällt diese Lösung besser

Probieren Sie es online!

Python-Version der Ruby-Antwort von Value Ink .

Ältere Antwort (67 Bytes):

1
s=\
['print s[-input()]or s', 0, 's=\\', 1]
print s[-input()]or s
Mathe-Junkie
quelle
Speichern Sie 6, indem Sie Folgendes entfernen n: TIO
Jonathan Allan
@ovs die Herausforderungsanforderung erfordert jedoch mindestens 4 Zeilen Quellcode: V
Value Ink
2

CJam , 19 18 17 Bytes

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

Probieren Sie es online!

Basierend auf dem Standard CJam-Quine. Das {...}_~läuft ...mit dem Block selbst auf dem Stack (und in diesem Fall auch 1darunter). Dann machen wir:

'_'~  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
quelle
Das ist schön. Auch wie das Smiley-Ende der Logik (= haha
Albert Renshaw
1

PHP, 261 Bytes

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

Probieren Sie es online!

Die codierte Zeichenfolge lautet:

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
quelle
Interessant! Was sind die codierten Zeichenfolgen?
Albert Renshaw
1
@ Albert Renshaw Ich habe es bearbeitet, um eine dekodierte Version der Zeichenfolge hinzuzufügen.
Divcy
0

Perl, 52 Bytes

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

Dies ist eine einfache Variante des klassischen Quines

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

Die "Nutzlast" befindet sich splitin Zeilenumbrüchen und die richtige Zeile wird durch Indizieren in die resultierende Liste ausgewählt.

Perl, 49 48 Bytes (nicht konkurrierend)

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

38 Bytes für den Code (ohne den Shebang, aber einschließlich -d:A) plus 10 Bytes für den Dateinamen, der sein muss Devel/A.pm. Das DevelVerzeichnis muss sich in befinden @INC.

Technisch gesehen verstößt dies gegen Regel 4, da -d:Adie Datei zweimal analysiert wird und es sich somit um eine nicht konkurrierende Lösung handelt.

Es verwendet einen Debugger-Hook, um auf die Zeilen der Datei zuzugreifen, die Perl @{"_<$filename"}zur Kompilierungszeit im Array speichert .

ThisSuitIsBlackNot
quelle