El reto
Escriba un programa que muestre Hello World, from line X!
, donde X
está el número de línea, en el código fuente, de la declaración de impresión en sí.
Las normas
- En este contexto, queremos que el primer número de línea de la declaración que emite la cadena que se muestra a
stdout
- Debe evitar simplemente buscar a través de su código fuente como una cadena (ya sea archivo o quine) para encontrar el número de línea
- Si se agrega un espacio en blanco adicional o declaraciones (que no interrumpan el flujo del código) al código fuente, debe reflejarse en tiempo de ejecución (después de la compilación, si corresponde)
Recomendaciones
Si lo proporciona el idioma, puede usar excepciones / seguimientos de pila para lograr este objetivo. Haga todo lo posible para usar código que sea portátil en diferentes sistemas / implementaciones, pero tenga en cuenta que esto no es un requisito. __LINE__
Se desaconseja el uso de variables definidas como , aunque lo permiten las reglas.
El ganador
Este es un concurso de popularidad (finalizado el 10 de junio de 2014), donde la respuesta más votada por la comunidad será declarada ganadora según los votos actuales en ese momento.
Al votar, considere la creatividad de la respuesta de alguien, cuán elaborada o interesante es. y las dificultades / limitaciones del lenguaje de programación utilizado
fuente
Respuestas:
Sinclair Basic
Esto funcionará para cualquier línea
PEEK
ingresando a la dirección que almacena el número de línea actual, por lo que lo siguiente también funcionará:fuente
STR$
si reemplazas los+
signos por punto y coma?+
s por hábito.BASIC
Creo que esto hace todo lo que se le pidió:
fuente
If any additional whitespace or statements (which do not interrupt the flow of the code) is added to the source code, it should be reflected at run-time (after compiling if applicable)
. La intención está ahí. Además, esa es la primera línea de la fuente, no la décima.Java
fuente
Thread.currentThread().getStackTrace()
getLineNumber()
método en el seguimiento de la pila, mientras que la respuesta que vinculaste usatoString()
para encontrar el número de línea.Perl
No es tan corto como usarlo
__LINE__
, pero quizás sea más interesante.fuente
C ++
ejemplo en vivo
fuente
Lua
fuente
DO#
C # 5.0
[CallerLineNumber]
hace el truco:Salida
fuente
X
en números romanos es10
.do
fuente
Pitón
Ejemplo (10 líneas, 213 caracteres):
Prueba en línea aquí . Se pueden agregar códigos y espacios en blanco que no alteren el flujo y el programa mostrará el recuento de líneas actualizado, y de la misma manera, este fragmento de código también se puede usar en cualquier parte de un programa existente. Rendimiento esperado:
Otro ejemplo (intente en línea aquí) para mostrar que funciona cuando se agrega código / espacio en blanco. Rendimiento esperado:
fuente
Javascript
Nota: Las expresiones evaluadas desde la consola de desarrollo de Chrome se incluirán en una
with
declaración. Por lo tanto, debemos disminuir la línea en uno si ese es el casofuente
with
cláusula.Python 3
Este código de lectura automática contiene un hash de referencia automática. La suma SHA256 de la última línea (con el espacio en blanco inicial y sin espacio en blanco final) comienza con
cc46f7...
. Cuandoprint
aplica el hash a la línea, descubre que el hash coincide con el valor mágico que está buscando.fuente
GNU COBOL
Bueno, dijeron que no se podía hacer. En realidad, fui yo quien dijo que no se podía hacer. Ahora está hecho, y una característica de lenguaje obsoleta se volvió a implementar utilizando el método aplicado.
La pregunta dice:
Se puede insertar cualquier cantidad de cosas antes de los tres
DISPLAY
s que causan el inicio de la salida, y cualquier cosa después de losDISPLAY
s "interrumpiría el flujo del código", entonces está bien.COBOL solía tener un
TRACE
verbo (enunciado) que simplemente enumeraba los números de línea de origen a medida que se ejecutaban (sin acceso al número de línea en el programa). Aunque de uso limitado, he incluido una implementación de TRACE.La salida es
Como una muestra del poder y la flexibilidad de escribir el lenguaje, este ejemplo utiliza mayúsculas y minúsculas y mayúsculas, todo al mismo tiempo. No importa, ya que cuando se procesa, todo se "dobla" a MAYÚSCULAS.
La única forma estándar de COBOL de obtener un número de línea de origen en el programa en ejecución, desde el programa en ejecución, es con un
DEBUGGING
DECLARATIVE
. Dentro de unSECTION
, estrictamente dentro de un párrafo dentro de unSECTION
, de tal declaración tiene acceso al registro especialDEBUG-LINE
. Contiene el número de línea de origen del verbo (instrucción) que causó la transferencia del control a un nombre de procedimiento particular (párrafo oSECTION
).Entonces, con
PERFORM
, oGO TO
, o "caer" el párrafo en las declaraciones de depuraciónSECTION
se ejecuta.Bien pero
DISPLAY
no causa transferencia de control.No hay problema. Ponlo en la misma línea que la transferencia de control.
Problema, ya que si "cualquier espacio en blanco adicional o declaraciones (que no interrumpan el flujo del código) se agrega al código fuente, debe reflejarse en tiempo de ejecución (después de compilar si corresponde)".
Por lo tanto, colóquelo en la misma línea pero frente a una transferencia de control, divida el contenido de la misma
DISPLAY
en dos partes (recuerde: "En este contexto, queremos que se muestre el primer número de línea de la instrucción que genera la cadena" ) y muestra la primera parte antes de la transferencia de control, y la segunda parte, desdeDEBUG-LINE
, una vez dentro del procedimiento de depuración.El último truco difícil es para la "caída" (los "procedimientos" pueden ser
PERFORM
editados, pueden ser el objetivo de unGO TO
, o pueden ingresarse simplemente siendo la siguiente línea). En este caso, pon elDISPLAY
en la línea que define el procedimiento, pero delante de la definición .Los nombres de los "procedimientos" (
a
yb
) se han acortado severamente para permitir que quepan en la misma línea de origen que elDISPLAY
. Estrictamente, un nombre de procedimiento COBOL debe comenzar en algún lugar de la columna ocho a la columna 11. Sin embargo, la sintaxis es, en estos días, mucho más relajada al respecto. En la medida en que pueda definir un nombre de procedimiento en la misma línea que algún código. Incluso incrustado en el código. Se requiere cuidado y, ocasionalmente, una parada completa.En el
PROCEDURE DIVISION
cada punto completo que se muestra se requiere, y no más.Compilar:
Para ejecutar (linux):
Finalmente, el retorno de TRACE (sin READY / RESET).
Salida es:
Donde 1, 2 y 3 salen de las tres declaraciones DISPLAY, y 17, 18, 19 y 20 son los números de línea de las líneas "ejecutables" (sin depuración).
fuente
Java
Usar el comportamiento del seguimiento de pila de Exception para obtener la línea actual. siempre y cuando Printstatement no esté destrozado en varias líneas o el archivo de clase se destruya, debería funcionar
fuente
Pitón
fuente
Perl
fuente
Java
fuente
Pitón
Salida
fuente
Befunge
Hecho solo por diversión.
Condicional: la parte superior izquierda del código debe ser 0 <x <20 y 0 <= y <62; y las dos primeras celdas deben estar vacías.
ejemplo:
Daría salida:
Hola desde la linea 10
fuente
do
Mediante el uso de una macro variable, podemos hacer una función de impresión que agrega automáticamente el número de línea al final de una declaración de impresión arbitraria, y siempre imprime en stdout.
prueba.c:
salidas:
Nota: Me desvié del patrón para demostrar que printfl sigue siendo una función variable válida; Si realmente te importa el formato de la salida, siempre puedes cambiar los literales que uso.
fuente
Golpetazo
Salida
fuente
re
fuente
C o C ++ y AWK
lineno.c:
Uso:
Salida:
Hola mundo, desde la línea 3
Notas:
fuente
Tipo de aburrido en Ruby:
Esto no es trampa, ¿verdad?
fuente
Javascript
Una línea usando el seguimiento de pila.
fuente
Cobra
fuente
Rubí
fuente
Potencia Shell
Movimiento barato
fuente
Potencia Shell
Y:
Ambos funcionan así:
fuente
Write-Host
no escribe en stdout. Simplemente pasando la cadena lo enviará a stdout. Por ejemplo"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Pitón
Corto y dulce.
fuente
Perl
Otro Perl:
fuente