Número de entrada; Número de línea de salida

18

Code Golf

Historia de fondo totalmente real : soy un contratista que trabaja en un sitio web www. Sky.Net y una de nuestras tareas es crear un programa autoconsciente o algo así, no sé si realmente no estaba escuchando al jefe. De todos modos, en un esfuerzo por hacer que nuestro código sea más consciente de sí mismo, necesitamos que TI pueda saber qué código hay en cada número de línea.


Desafío

Cree un programa o función que tome una entrada ny devuelva el código de dicho programa o función en línea n.


Reglas

➊ Su programa o función debe tener al menos 4 líneas de largo. Cada línea debe ser única.

➋ Puede suponer que la entrada siempre será un número entero positivo mayor o igual que 1 y menor o igual que el número de líneas en su programa / función.

➌ La primera línea en su programa / función es la línea 1, no la línea 0.

➍ No puede acceder al archivo en el que se encuentra su programa. (Si alguien tiene que preguntar "¿No está técnicamente rompiendo la regla # 4"; probablemente lo sea)

➎ Las líneas no pueden estar vacías (esto incluye un espacio si los espacios no hacen nada en su idioma)

➏ Las líneas no pueden ser // comentarios (/ * de cualquier estilo <! -)


Este es un desafío parecido a una
Este es el , por lo que gana la presentación con la menor cantidad de bytes.

Albert Renshaw
fuente
Continuemos esta discusión en el chat .
Conor O'Brien
1
Me gustaría ver esto hecho en 99 :)
Jonathan Allan
2
@JonathanAllan Puede que te encuentres con el problema de que no todas las líneas son únicas
MildlyMilquetoast
"Las líneas no pueden ser comentarios, pero supongo que las no-operaciones efectivas están bien" (pero honestamente, a veces es difícil decir si una línea debe contar como una no-operación o no; por ejemplo, mi respuesta de Ruby tiene la última línea solo como un rizado para terminar la lambda)
Value Ink
El título podría ser mejor "Número de entrada; línea de salida con ese número de línea"? O incluso "Línea de salida por número".
Paŭlo Ebermann

Respuestas:

16

Vim, 7 bytes

1
2
3
4

Pruébalo en línea!

Por lo que puedo decir, esto cumple con todas las reglas. En vim por defecto, el programa vacío imprime toda la entrada. Ya que

<N><CR>

Es un noop, nada cambia el texto de entrada, y dado que cada entrada coincide con la salida deseada, este mismo enfoque funciona con cualquier número de líneas.

DJMcMayhem
fuente
2
Trabajará en otros idiomas - primera adición: Pyth
Jonathan Allan
Espera, bytes? Vim se mide en pulsaciones de teclas.
Pavel
@ JonathanAllan Parece que Pyth está mal configurado en TIO. Si observa la salida de depuración, puede ver que el código que realmente se está ejecutando es lo que está en el campo de argumento, no lo que está en el campo de código. Así es como se ve realmente ejecutar ese código.
isaacg
1
@Pavel solo en desafíos de editor de golf
Martin Ender
2
Esto también funciona en Brachylog
Fatalize
9

Ruby, 71 70 66 bytes

Pruébalo en línea!

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

Modo "trampa": 7 + 1 = 8 bytes

Requiere la -pbandera para +1 byte. Literalmente una copia de la respuesta V . Imprime el número que se ingresa; todo el programa es efectivamente sin operaciones.

1
2
3
4
Tinta de valor
fuente
¿Qué -phacer?
Pavel
@Pavel Hace que el programa lea cada línea de STDIN $_, ejecuta el contenido del programa y luego imprime el contenido de la $_pantalla (repitiendo por línea de STDIN). Como el programa no hace nada, es prácticamente solo Unix cat, pero eso significa que cada entrada de 1-4 generará el contenido de la línea, porque cada línea es literalmente su número de línea.
Value Ink
@Pavel para obtener más información, consulte robm.me.uk/ruby/2013/11/20/ruby-enp.html
Value Ink
Me gusta tu respuesta de "trampa". Perl también tiene -p, pero 1\n2\n3\n4no es un programa válido de Perl.
ThisSuitIsBlackNot
7

Haskell, 69 59 bytes

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

Basado en el estándar Haskell quine. La primera expresión (extendida sobre las primeras tres líneas) es una función sin nombre que selecciona la enésima línea de la cadena quinificada s( s++show s). +2 bytes para hacer que la indexación se base en 1 (en mi opinión, una regla innecesaria).

Para probarlo en línea! versión tengo que nombrar la función que agrega 4 bytes.

nimi
fuente
¿Esto rompe la regla 6? :)
Albert Renshaw
No se supone que la indexación de línea esté basada en 0, las reglas requieren explícitamente la indexación de 1.
Value Ink
@AlbertRenshaw: corregido
nimi
@ValueInk: fijo
nimi
@nimi lol, " soluciones " como esta es la razón por la que tuve la tentación de hacer de este un concurso de popularidad jaja. Sin embargo, buen trabajo!
Albert Renshaw
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]

Pruébalo en línea!

Explicación

Comienza creando una matriz $ven la primera línea. En esa misma línea, el primer 0elemento ( th) se establece en 0y una coma ,continúa su definición.

La siguiente línea establece el siguiente elemento ( 1) de la matriz en una cadena que representa el contenido de la primera línea del script, de modo que $v[1]devuelve la primera línea.

La tercera línea establece primero el tercer elemento de la matriz (índice 2) en una cadena que representa la segunda línea del script, luego en la misma línea establece el cuarto elemento (índice 3) usando un fragmento de quine que usa el operador de formato ( -f) para reemplazar ciertas instancias de comillas simples ( [char]39) y la cadena de plantilla de formato, en sí misma, para reproducir la totalidad de la tercera línea.

La línea 4 básicamente hace lo mismo, pero también finaliza la creación de la matriz y luego la indexa utilizando el argumento proporcionado.

briantista
fuente
4

Python 2, 104 73 67 bytes

¡Gracias a Jonathan Allan por guardar 6 bytes!

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

Editar: mismo recuento de bytes, pero me gusta más esta solución

Pruébalo en línea!

Versión de Python de la respuesta Ruby de Value Ink .

Respuesta anterior (67 bytes):

1
s=\
['print s[-input()]or s', 0, 's=\\', 1]
print s[-input()]or s
adicto a las matemáticas
fuente
Ahorre 6 al deshacerse de n: TIO
Jonathan Allan
@ovs, el requisito de desafío requiere un mínimo de 4 líneas de código fuente: V
Value Ink
2

CJam , 19 18 17 bytes

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

Pruébalo en línea!

Basado en el estándar CJam-quine. El {...}_~ejecuta el ...bloque en sí mismo en la pila (y en este caso, también 1debajo de eso). Entonces hacemos:

'_'~  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
fuente
Esto es hermoso. También como el final de la cara sonriente de la lógica (= jaja
Albert Renshaw
1

PHP, 261 bytes

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

Pruébalo en línea !!

La cadena codificada es:

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
fuente
¡Interesante! ¿Cuáles son las cadenas codificadas?
Albert Renshaw
1
@ Albert Renshaw Lo he editado para agregar una versión decodificada de la cadena.
Divcy
0

Perl, 52 bytes

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

Esta es una variación simple del quine clásico.

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

La "carga útil" está spliten las nuevas líneas y la línea correcta se selecciona indexando en la lista resultante.

Perl, 49 48 bytes (no competidor)

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

38 bytes para el código (excluyendo el shebang pero incluido -d:A) más 10 bytes para el nombre de archivo, que debe ser Devel/A.pm. El Develdirectorio debe estar en @INC.

Técnicamente, esto viola la Regla # 4 porque -d:Ahace que el archivo se analice dos veces, por lo que es una solución no competitiva.

Utiliza un gancho de depuración para acceder a las líneas del archivo, que Perl almacena en la @{"_<$filename"}matriz en tiempo de compilación.

ThisSuitIsBlackNot
fuente