O desafio
Escreva um programa que produz Hello World, from line X!
, onde X
está o número da linha, no código-fonte, da própria declaração de impressão.
As regras
- Nesse contexto, queremos que o primeiro número da linha da instrução que gera a string seja exibido para
stdout
- Você deve evitar simplesmente pesquisar seu código-fonte como uma string (arquivo ou quine) para encontrar o número da linha
- Se qualquer espaço em branco ou instrução adicional (que não interrompa o fluxo do código) for adicionado ao código-fonte, ele deverá ser refletido no tempo de execução (após a compilação, se aplicável)
Recomendações
Se fornecido pelo idioma, você poderá usar exceções / rastreamentos de pilha para atingir esse objetivo. Tente o seu melhor para usar um código portátil em diferentes sistemas / implementações, mas observe que isso não é um requisito. O uso de variáveis definidas como __LINE__
, embora permitido pelas regras, é desencorajado.
O vencedor
Este é um concurso de popularidade (encerrado em 10 de junho de 2014), em que a resposta mais votada pela comunidade será declarada vencedora com base nos votos atuais no momento
Ao votar, considere a criatividade da resposta de alguém, quão elaborada ou interessante é. e as dificuldades / restrições da linguagem de programação que está sendo usada
fonte
Respostas:
Sinclair Basic
Isso funcionará para qualquer linha
PEEK
inserindo o endereço que armazena o número da linha atual; portanto, o seguinte também funcionará:fonte
STR$
que substitui os+
sinais por ponto e vírgula?+
s por hábito.BASIC
Eu acho que isso faz tudo o que foi solicitado:
fonte
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)
. A intenção está lá. Além disso, essa é a primeira linha da fonte, não a 10ª.Java
fonte
Thread.currentThread().getStackTrace()
getLineNumber()
método no rastreamento de pilha, enquanto a resposta que você vinculou usatoString()
para encontrar o número da linha.Perl
Não é tão curto quanto usar
__LINE__
, mas talvez mais interessante.fonte
C ++
exemplo ao vivo
fonte
Lua
fonte
C #
O C # 5.0
[CallerLineNumber]
faz o truque:Saída
fonte
X
em algarismos romanos é10
.C
fonte
Python
Exemplo (10 linhas, 213 caracteres):
Experimente online aqui . Código e espaço em branco que não alteram o fluxo podem ser adicionados e o programa exibirá a contagem de linhas atualizada e, da mesma forma, esse trecho de código também pode ser usado em qualquer lugar de um programa existente. Saída esperada:
Outro exemplo (tente online aqui) para mostrar que funciona quando código / espaço em branco é adicionado. Saída esperada:
fonte
Javascript
Nota: As expressões avaliadas no console do desenvolvedor do chrome serão agrupadas em uma
with
instrução Portanto, precisamos diminuir a linha por um, se for esse o casofonte
with
cláusula.Python 3
Esse código de leitura automática contém um hash de referência própria. A soma SHA256 da última linha (com o espaço em branco inicial e sem espaço em branco à direita) começa com
cc46f7...
. Quando faz o hash daprint
linha, descobre que o hash corresponde ao valor mágico que está procurando.fonte
GNU COBOL
Bem, eles disseram que não poderia ser feito. Na verdade, fui eu quem disse que não poderia ser feito. Agora está pronto e um recurso de linguagem obsoleta reimplementado usando o método aplicado.
A pergunta afirma:
Qualquer quantidade de material pode ser inserida antes dos três
DISPLAY
s que causam o início da saída e qualquer coisa após osDISPLAY
"interromperia o fluxo do código", então tudo bem.O COBOL costumava ter um
TRACE
verbo (instrução) que simplesmente listava os números das linhas de origem conforme eram executados (sem acesso ao número da linha no programa). Embora de uso limitado, incluí uma implementação do TRACE.A saída é
Como uma demonstração do poder e da flexibilidade de escrever a linguagem, este exemplo usa letras maiúsculas, minúsculas e totalmente maiúsculas, tudo ao mesmo tempo. Não importa, pois quando processado, tudo é "dobrado" para MAIÚSCULAS.
A única maneira padrão de COBOL de obter um número de linha de origem no programa em execução, a partir do programa em execução, é com a
DEBUGGING
DECLARATIVE
. Dentro deSECTION
, estritamente dentro de um parágrafo dentro deSECTION
, de um declarativo, você tem acesso ao registro especialDEBUG-LINE
. Contém o número da linha de origem do verbo (instrução) que causou a transferência do controle para um nome de procedimento específico (parágrafo ouSECTION
).Portanto, com
PERFORM
, ouGO TO
, ou "falha", o parágrafo nos declarativos de depuraçãoSECTION
é executado.OK, mas
DISPLAY
não causa transferência de controle.Sem problemas. Coloque-o na mesma linha da transferência de controle.
Problema, pois se "qualquer espaço em branco ou instrução adicional (que não interrompa o fluxo do código) for adicionado ao código-fonte, ele deverá ser refletido no tempo de execução (após a compilação, se aplicável)".
Portanto, coloque-o na mesma linha, mas na frente de uma transferência de controle, divida o conteúdo do arquivo
DISPLAY
em duas partes (lembre-se: "Nesse contexto, queremos o primeiro número da linha da instrução que gera a string a ser exibida" ) e produza a primeira parte antes da transferência do controle e a segunda parte doDEBUG-LINE
, uma vez dentro do procedimento de depuração.O truque final é para o "fall through" ("procedures" podem ser
PERFORM
editados, podem ser o alvo de umGO TO
ou podem ser inseridos simplesmente sendo a próxima linha). Nesse caso, coloque oDISPLAY
na linha que define o procedimento, mas na frente da definição .Os nomes dos "procedimentos" (
a
eb
) foram severamente abreviados para permitir que eles se ajustem à mesma linha de origem que aDISPLAY
. Estritamente, um nome de procedimento COBOL deve começar em algum lugar da coluna oito à coluna 11. No entanto, atualmente, a sintaxe é muito mais tranqüila quanto a isso. Na medida em que eu possa definir um nome de procedimento na mesma linha que algum código. Inclusive incorporado no código. É necessário cuidado e um ponto final ocasional.Em
PROCEDURE DIVISION
cada ponto final mostrado é necessário, e não mais.Compilar:
Para executar (linux):
Finalmente, o retorno do TRACE (sem READY / RESET).
A saída é:
Onde 1, 2 e 3 são emitidos pelas três instruções DISPLAY, e 17, 18, 19 e 20 são os números de linha das linhas "executáveis" (sem depuração).
fonte
Java
Usando o comportamento do rastreamento de pilha do Exception para obter a linha atual. contanto que a declaração de impressão não seja mutilada em várias linhas ou o arquivo de classe seja mutilado, deve funcionar
fonte
Python
fonte
Perl
fonte
Java
fonte
Python
Saída
fonte
Befunge
Feito apenas por diversão.
Condicional: o canto superior esquerdo do código deve ser 0 <x <20 e 0 <= y <62; e as duas primeiras células precisam estar vazias.
exemplo:
Saída:
Olá, da linha 10
fonte
C
Usando uma macro variável, podemos criar uma função de impressão que adiciona automaticamente o número da linha ao final de uma instrução arbitrária printf, e sempre imprime no stdout.
test.c:
saídas:
Nota: Eu me desviei do padrão para demonstrar que printfl ainda é uma função variável válida; se você realmente se importa com o formato da saída, sempre pode alterar os literais que eu uso.
fonte
Bater
Saída
fonte
D
fonte
C ou C ++ e AWK
lineno.c:
Uso:
Saída:
Olá Mundo, da linha 3
Notas:
fonte
Tipo de chato em Ruby:
Isso não é trapaça, certo?
fonte
Javascript
Uma linha usando rastreamento de pilha.
fonte
Cobra
fonte
Rubi
fonte
PowerShell
Movimento barato
fonte
Powershell
E:
Ambos funcionam assim:
fonte
Write-Host
não escreve para stdout. Basta passar a string para enviá-la ao stdout. Exemplo"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Python
Curto e grosso.
fonte
Perl
Outro Perl:
fonte