Numéro d'entrée; Numéro de ligne de sortie

18

Code Golf

Backstory totalement réel : je suis un entrepreneur travaillant sur un site Web www. Sky.Net et l'une de nos tâches pour créer un programme conscient de soi ou quelque chose, je ne sais pas que je n'écoutais pas vraiment le patron. Quoi qu'il en soit, dans un effort pour rendre notre code plus conscient de nous-mêmes, nous avons besoin de l' informatique pour pouvoir savoir quel code est sur chaque numéro de ligne.


Défi

Créez un programme ou une fonction qui prend une entrée net renvoie le code dudit programme ou fonction en ligne n.


Règles

➊ Votre programme ou fonction doit comporter au moins 4 lignes. Chaque ligne doit être unique.

➋ Vous pouvez supposer que l'entrée sera toujours un entier positif supérieur ou égal à 1 et inférieur ou égal au nombre de lignes de votre programme / fonction.

➌ La première ligne de votre programme / fonction est la ligne 1, pas la ligne 0.

➍ Vous ne pouvez pas accéder au fichier sur lequel se trouve votre programme. (Si quelqu'un doit demander "N'est-ce pas une violation technique de la règle n ° 4"; c'est probablement le cas)

➎ Les lignes ne peuvent pas être vides (cela inclut un espace si les espaces ne font rien dans votre langue)

➏ Les lignes ne peuvent pas être // des commentaires (/ * de tout <! - style)


C'est un défi de type
C'est , donc la soumission avec le moins d'octets gagne!

Albert Renshaw
la source
Continuons cette discussion dans le chat .
Conor O'Brien
1
J'aimerais que cela se fasse en 99 :)
Jonathan Allan
2
@JonathanAllan Vous pourriez rencontrer le problème où toutes les lignes ne sont pas uniques
MildlyMilquetoast
"Les lignes ne peuvent pas être des commentaires, mais je suppose que les no-op efficaces sont OK" (mais honnêtement, il est parfois difficile de dire si une ligne doit être considérée comme non-op ou non; par exemple, ma réponse Ruby a la dernière ligne être seulement un crochet pour terminer la lambda)
Value Ink
Le titre pourrait être meilleur "Numéro d'entrée; Ligne de sortie avec ce numéro de ligne"? Ou même "Sortie ligne par numéro".
Paŭlo Ebermann

Réponses:

16

Vim, 7 octets

1
2
3
4

Essayez-le en ligne!

Pour autant que je sache, cela est conforme à toutes les règles. Dans vim par défaut, le programme vide imprime toutes les entrées. Puisque

<N><CR>

Est un noop, rien ne change le texte d'entrée, et puisque chaque entrée correspond à la sortie souhaitée, cette même approche fonctionne avec n'importe quel nombre de lignes.

DJMcMayhem
la source
2
Fonctionnera
Jonathan Allan
Attendez, octets? Vim est mesuré en frappes.
Pavel
@JonathanAllan Il semble que Pyth soit mal configuré sur TIO. Si vous regardez la sortie de débogage, vous pouvez voir que le code qui est réellement exécuté est la chose dans le champ d'argument, pas la chose dans le champ de code. Voici à quoi ressemble réellement l'exécution de ce code.
isaacg
2
Cela fonctionne également dans Brachylog
Fatalize
9

Rubis, 71 70 66 octets

Essayez-le en ligne!

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

Mode "Triche": 7 + 1 = 8 octets

Nécessite le -pdrapeau pour +1 octet. Littéralement une copie de la réponse V . Imprime le nombre entré; l'ensemble du programme est en fait juste sans opération.

1
2
3
4
Encre de valeur
la source
Que fait -p-il?
Pavel
@Pavel Il amène le programme à lire chaque ligne de STDIN $_, exécute le contenu du programme, puis imprime le contenu de $_à l'écran (répétition par ligne de STDIN). Étant donné que le programme ne fait rien, il est pratiquement uniquement Unix cat, mais cela signifie que chaque entrée de 1 à 4 affichera le contenu de la ligne, car chaque ligne est littéralement son numéro de ligne.
Value Ink
@Pavel pour plus d'informations, voir robm.me.uk/ruby/2013/11/20/ruby-enp.html
Value Ink
J'aime votre réponse "tricherie". Perl a également -p, mais 1\n2\n3\n4n'est pas un programme Perl valide.
ThisSuitIsBlackNot
7

Haskell, 69 59 octets

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

Basé sur le quine Haskell standard. La première expression (répartie sur les trois premières lignes) est une fonction sans nom qui sélectionne la nième ligne de la chaîne quinifiée s( s++show s). +2 octets pour rendre l'indexation basée sur 1 (à mon humble avis, une règle inutile).

Pour l' essayer en ligne! version je dois nommer la fonction qui ajoute 4 octets.

nimi
la source
Est-ce que cela enfreint la règle 6? :)
Albert Renshaw
L'indexation de ligne n'est pas censée être basée sur 0, les règles nécessitent explicitement une indexation 1.
Value Ink
@AlbertRenshaw: corrigé
nimi
@ValueInk: fixe
nimi
@nimi lol, des " solutions " comme celle-ci sont la raison pour laquelle j'ai été tenté d'en faire un concours de popularité haha. Bon travail néanmoins!
Albert Renshaw
5

PowerShell , 184 172 octets

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

Essayez-le en ligne!

Explication

Commence par créer un tableau $vsur la première ligne. Sur cette même ligne, le premier ( 0e) élément est défini sur 0et une virgule ,continue sa définition.

La ligne suivante définit l'élément suivant ( 1) du tableau sur une chaîne représentant le contenu de la première ligne du script, ce qui $v[1]renvoie la première ligne.

La 3e ligne définit d'abord le 3e élément du tableau (index 2) sur une chaîne représentant la 2e ligne du script, puis sur la même ligne définit le 4e élément (index 3) à l'aide d'un extrait de quine qui utilise l'opérateur de format ( -f) pour remplacer certaines instances de guillemets simples ( [char]39) et la chaîne de modèle de format, en elle-même, pour reproduire l'intégralité de la 3e ligne.

La ligne 4 fait essentiellement la même chose, mais termine également la création du tableau, puis l'indexe à l'aide de l'argument fourni.

briantiste
la source
4

Python 2, 104 73 67 octets

Merci à Jonathan Allan d'avoir économisé 6 octets!

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

Edit: même nombre d'octets, mais j'aime mieux cette solution

Essayez-le en ligne!

Version Python de la réponse Ruby de Value Ink .

Ancienne réponse (67 octets):

1
s=\
['print s[-input()]or s', 0, 's=\\', 1]
print s[-input()]or s
accro aux mathématiques
la source
Économisez 6 en vous débarrassant de n: TIO
Jonathan Allan
@ovs l'exigence de défi nécessite cependant 4 lignes minimum de code source: V
Value Ink
2

CJam , 19 18 17 octets

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

Essayez-le en ligne!

Basé sur le CJam-quine standard. Le {...}_~exécute le ...avec le bloc lui-même sur la pile (et dans ce cas, également en 1dessous). Ensuite, nous faisons:

'_'~  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
la source
C'est beau. Aussi comme la fin du visage souriant de la logique (= haha
Albert Renshaw
1

PHP, 261 octets

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

Essayez-le en ligne !!

La chaîne encodée est:

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
la source
Intéressant! Quelles sont les chaînes encodées?
Albert Renshaw
1
@Albert Renshaw Je l'ai édité pour ajouter une version décodée de la chaîne.
Divcy
0

Perl, 52 octets

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

Ceci est une variation simple de la quine classique

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

La "charge utile" est splitsur les sauts de ligne et la ligne correcte est sélectionnée par indexation dans la liste résultante.

Perl, 49 48 octets (non concurrent)

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

38 octets pour le code (excluant le shebang mais y compris -d:A) plus 10 octets pour le nom de fichier, qui doit être Devel/A.pm. Le Develrépertoire doit être dans @INC.

Techniquement, cela viole la règle n ° 4 car -d:Ale fichier est analysé deux fois, il s'agit donc d'une solution non concurrente.

Il utilise un hook de débogueur pour accéder aux lignes du fichier, que perl stocke dans le @{"_<$filename"}tableau au moment de la compilation.

ThisSuitIsBlackNot
la source