Napisz fragment kodu, aby wypisać numer wiersza samej instrukcji print / output (w formie „Witaj świecie, z linii X!”)

25

Wyzwanie

Napisz program, który wyjścia Hello World, from line X!, gdzie Xjest numer linii, w kodzie źródłowym, rzeczywistego samej instrukcji print.

Zasady

  • W tym kontekście chcemy, aby numer pierwszego wiersza instrukcji, która wyświetla łańcuch znaków do wyświetleniastdout
  • Należy unikać po prostu przeszukiwania kodu źródłowego jako ciągu (pliku lub quine) w celu znalezienia numeru wiersza
  • Jeśli do kodu źródłowego zostaną dodane dodatkowe białe znaki lub instrukcje (które nie zakłócają przepływu kodu), należy je odzwierciedlić w czasie wykonywania (po kompilacji, jeśli dotyczy)

Rekomendacje

Jeżeli przewidziane przez język, to może użyć wyjątki / stos ślady, aby osiągnąć ten cel. Staraj się używać kodu, który jest przenośny w różnych systemach / implementacjach, ale pamiętaj, że nie jest to wymagane. Odradzane jest używanie zdefiniowanych zmiennych __LINE__, chociaż dozwolone przez reguły.

Zwycięzca

  • To konkurs popularności (zakończony 10 czerwca 2014 r.), W którym odpowiedź wybrana przez społeczność jako najwyższa zostanie ogłoszona zwycięzcą na podstawie aktualnych głosów w danym czasie

  • Podczas głosowania weź pod uwagę kreatywność czyjejś odpowiedzi, jak skomplikowana lub interesująca . oraz trudności / ograniczenia w używanym języku programowania

Przełom
źródło
Co rozumiesz przez „numer pierwszego wiersza”? Czy mówisz o tym, co powinno się stać, jeśli instrukcja obejmuje wiele wierszy?
user2357112 obsługuje Monikę
@ user2357112 tak, aby rozwiązać wszelkie niejednoznaczności, jeśli ktoś musiałby użyć instrukcji milti-line.
Przełom
Tytuł jest bardzo wyraźny, ale może nieco długi.
primo
1
Odpowiedzi na to wszystko są nudne, ponieważ to takie złe pytanie. To tak, jakby pytający nie wiedział o istnieniu LINE . W rzeczywistości zapisałem się specjalnie, aby głosować w dół, ale myślałem, że to takie złe.
dave
1
@ Markasoftware, jeśli linia została dodana przed nim, wynik nie zmieniłby się, aby to odzwierciedlić.
primo

Odpowiedzi:

48

Sinclair Basic

10 PRINT "Hello world, from line ";PEEK 23621;"!"

Witaj świecie, z linii 10!

Będzie to działać dla dowolnej linii, PEEKwprowadzając adres przechowujący bieżący numer linii, więc będą działać również:

341 PRINT "Hello world, from line ";PEEK 23621;"!"

Witaj świecie, z linii 341!

kitcar2000
źródło
I tym samym, Timex / Sinclair BASIC!
Gabe
Nie udaję, że znam ten język, ale czy nie możesz pominąć, STR$jeśli zastąpisz +znaki średnikami?
Pan Lister
@MrLister Tak, to na pewno zadziała, ale zawsze używam +s z przyzwyczajenia.
kitcar2000
40

PODSTAWOWY

Myślę, że to robi wszystko, o co poproszono:

10 PRINT "Hello World, from line 10!"
piskliwy kostuch
źródło
5
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). Cel jest tam. Jest to także pierwsza linia źródła, a nie 10..
Bill Woodger
30
Może to być pierwszy wiersz w kodzie źródłowym, ale nadal jest to wiersz 10 .
piskliwy ossifrage
13
Uważam, że należy to zdecydowanie do kategorii, która nie jest już śmieszna . To naprawdę niewyobrażalne i nieciekawe, choć dosłownie spełnia to wymaganie. Dlaczego to ma tak wiele pozytywnych opinii? (Głosowałem poniżej)
Tim S.
18
To świetna odpowiedź, ponieważ korzysta z głupiej, ale konkretnej przewagi nad aspektem języka BASIC, który nie jest powszechnie spotykany w innych językach (szczególnie tych współczesnych). Być może nie jest najpopularniejszy (czas pokaże), ale ledwo widzę, jak to jest mniej interesujące niż użycie stałej, takiej jak __LINE__ lub uzyskanie informacji debugowania z bieżącej ramki stosu (jak robi to większość innych odpowiedzi).
Nick
2
Sprytne, ale byłbym rozczarowany, gdyby nic więcej nie uzyskało więcej głosów pozytywnych niż ten.
agweber
35

Jawa

public class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World, from line "+new Exception().getStackTrace()[0].getLineNumber()+"!");
    }
}
Niemowlę
źródło
1
WolałbymThread.currentThread().getStackTrace()
Cruncher
3
Wywołania Thread.getStackTrace () (new Exception ()). GetStackTrace () jeśli są wywoływane w bieżącym wątku, więc jest to to samo
DHall
1
dziwne .... 2x ta sama odpowiedź i 2 różne kwoty upvote ... (może być użyty jako źródło RNG ...) (to samo tutaj: codegolf.stackexchange.com/a/30058/10801 )
masterX244
@ masterX244 te dwie odpowiedzi nie są dokładnie identyczne; ten używa getLineNumber()metody śledzenia stosu, podczas gdy odpowiedź, którą podłączyłeś, używa toString()jej do znalezienia numeru linii.
Przełom
9
@ masterX244 warto również zauważyć, że ta odpowiedź pojawiła się 2 godziny wcześniej. Po raz drugi widzę odpowiedź, nie jest tak interesująca jak pierwsza.
primo
30

Perl

close STDERR;
open FOOBAR,">",\$_;


print!warn,'Hello World, from line ',/(\d+)\.$/,'!';

Nie tak krótki jak używanie __LINE__, ale może bardziej interesujący.

warnto narzędzie do debugowania, które wydaje polecenie STDERRwskazujące, w którym pliku i w jakiej linii wydano ostrzeżenie ... chyba STDERR że zostało wcześniej zamknięte lub w inny sposób niedostępne, w którym to przypadku ostrzeżenie jest wysyłane do ostatnio otwieranego pliku uchwyt - jest to zachowanie nieudokumentowane. Nie jestem pewien, czy lepiej byłoby go zaklasyfikować jako cechę czy błąd.

Tutaj STDERRjest zamknięty, a nowy uchwyt pliku zidentyfikowany jako FOOBARotwarty i skierowany do zmiennej $_. Jest to następnie analizowane w celu pobrania numeru wiersza ostrzeżenia, które jest osadzone w instrukcji print.

primo
źródło
3
Tak, to zdecydowanie bardziej interesujące :)
Tal
27

C ++

#include <iostream>
#include <utility>
#include <type_traits>

#define __(A,B,C,...) B##C##A
#define _(A,...) __(__VA_ARGS__, A)
template<unsigned...Is> struct v;
template<unsigned I0, unsigned... Is> struct v<I0, Is...>:v<I0-1,I0-1, Is...> {};
template<unsigned...Is> struct v<0,Is...>:std::integral_constant<unsigned, sizeof...(Is)> {};

int main() {
  std::cout << "Hello world from line " << v<_(EXTRACT,_(Q,_,E,_,$$main$$,),_(@22,,_,_),_(Z,N,L,I,_,,L),__STACK_TRACE__)>::value << "\n";
}

przykład na żywo

Jak
źródło
2
To jest ... czarodziejstwo
Paladine
1
Zajęło mi ... dużo czasu, aby zobaczyć, jak to działa. Soo wiele czerwonych śledzi! To jest pyszne.
patrz
1
Jak to działa?
0x499602D2
16

Lua

print("Hello world, from line "..debug.getinfo(1).currentline.."!")
mniip
źródło
16

DO#

C # 5.0 [CallerLineNumber]robi lewę:

using System;
using System.Linq;
using System.Runtime.CompilerServices;
namespace LineNumberConsole
{
    class Program
    {
        public static void Main()
        {
            Console.WriteLine("Hello World, from line {0}!", ToRoman(GetLineNumber()));
            Console.ReadLine();
        }

        private static int GetLineNumber([CallerLineNumber] int sourceLineNumber = 0)
        {
            return sourceLineNumber;
        }

        private static string ToRoman(int number)
        {
            // TODO: Copy some source code from http://pastebin.com/w0hm9n5W
            // Skipped here for brevity
            return number.ToString();
        }
    }
}

Wydajność

Hello World, from line X!
Thomas Weller
źródło
Czy jest jakiś konkretny powód, aby używać cyfr rzymskich?
Cole Johnson
4
Kiedy linia drukująca jest w linii 10, pytanie jest interpretowane dosłownie. Xcyframi rzymskimi jest 10.
Οurous
Cyfry rzymskie to miły akcent!
NPSF3000
15

do

#include <stdio.h>
main(){
printf("Hello World, from line %d!", __LINE__);
}
gnibbler
źródło
Odradzane jest używanie zdefiniowanych zmiennych, takich jak LINE , chociaż dozwolone przez reguły.
vaxquis
@vaxquis, tak, ale moja odpowiedź poprzedza edycję tego pytania
gnibbler
to wciąż kiepskie i zbyt oczywiste rozwiązanie IMO. Zastanawiam się, dlaczego ludzie publikowali wszelkiego rodzaju odmiany tego rozwiązania we wszystkich językach świata (w tym PHP, D, Perl) zamiast nawet próbować zrobić coś zdalnie śmiesznego lub intrygującego?
vaxquis
14

Pyton

Przykład (10 linii, 213 znaków):

import sys
import traceback
lineno = None
while True:
    try:
        print 'Hello World, from line %d!' % lineno
        break
    except:
        lineno = traceback.tb_lineno(sys.exc_info()[2])
        continue

Spróbuj online tutaj . Można dodać kod zmieniający przepływ i białe znaki, a program wyświetli zaktualizowaną liczbę wierszy, a także tego fragmentu kodu można również użyć w dowolnym miejscu istniejącego programu. Oczekiwany wynik:

Hello World, from line 6!

Kolejny przykład (spróbuj online tutaj) aby pokazać, że działa po dodaniu kodu / białych znaków. Oczekiwany wynik:

Down we go...
Gotta catch 'em all.
Down we go...
Hello World, from line 11!
Awesome!
Przełom
źródło
12

JavaScript

function getLine(n) {
   try {
      to
   } catch (dat) {
      var stack = dat.stack.split('\n');
       for (var i = 0; i < stack.length; i++) {
           if (~stack[i].indexOf ('getLine')) break;          
       }
      return dat.stack.split ('\n')[i + ~~n].match (/:(\d+)/)[1] - ~~window.hasOwnProperty ('__commandLineAPI')
   }
}
//Line 12
console.log ('Hello World, from line ' + getLine(1) + ' !')

Uwaga: Wyrażenia analizowane z poziomu konsoli dewelopera chrome zostaną umieszczone w withinstrukcji. Dlatego musimy zmniejszyć linię o jeden, jeśli tak jest

C5H8NNaO4
źródło
2
stos danych , hehe. Zweryfikowano działanie w przeglądarce Firefox.
Przełom
1
@Breakthrough :) Tak, działa w różnych przeglądarkach (testowane tylko z najnowszymi Chrome, FF, IE). Chrome wymaga specjalnego traktowania, gdy jest oceniany z poziomu konsoli, ponieważ otacza każdą instrukcję withklauzulą.
C5H8NNaO4
2
Ciekawa, ale niejednoznaczna nazwa użytkownika. Może glutaminian monosodowy? (BTW, myślę o zrobieniu pytania na temat DNA i aminokwasów, w tym kwasu glutaminowego.)
Level River St
@steveverrill Według Google masz rację !
kitcar2000
@ Kitcar2000 Prawdopodobnie. Ale istnieją inne mniej znane związki o tym wzorze: na przykład metyloaspartan sodu lub nitropentanian.
Level River St
11

Python 3

import hashlib
with open(__file__) as f:
    line_num = 0
    for line in f.readlines():
        line = line.rstrip() # make it work with or without newline at the end
        line_num += 1
        if hashlib.sha256(bytes(line, "UTF-8")).hexdigest()[0:6] == 'cc46f7':
            print('Hello world, from line {}!'.format(line_num)) # cc46f7

Witaj świecie, z linii 8!

Ten samoczyszczący kod zawiera skrót, do którego odwołuje się sam. Suma SHA256 ostatniej linii (z początkową białą spacją i bez końcowej białej spacji) zaczyna się od cc46f7... . Kiedy haszy printlinię, stwierdza, że ​​hash odpowiada magicznej wartości, której szuka.

Tim S.
źródło
czy nie możesz po prostu ustawić line_num = na -1 i mieć wydruk poza pętlą i rozpocząć magiczny hasz?
dave
1
@dave nie jestem pewien, czy cię śledzę. Magiczny hasz sprawia, że ​​to rozwiązanie jest sprytne.
Tim S.
+1 za dosłowną interpretację moich zasad :) Bardzo sprytny.
Przełom
5
@Stefan Ta strona dotyczy jednak najgorszych praktyk. ;)
Tim S.
1
@sehe Najprawdopodobniej było to spowodowane problemami z białymi znakami. Kiedy go utworzyłem, nie miałem nowego wiersza na końcu pliku. Dodałem linię do usuwania białych znaków z końca linii przed mieszaniem. Teraz powinno działać bardziej konsekwentnie. (upewnij się również, że nie konwertujesz spacji na tabulatory) Próbowałem przesłać go do ideone, aby pokazać Ci wersję na żywo, ale nie można tam odczytać własnego pliku.
Tim S.
9

GNU COBOL

Powiedzieli, że nie da się tego zrobić. Właściwie to ja powiedziałem, że nie da się tego zrobić. Teraz zostało to zrobione, a przestarzała funkcja języka została ponownie zaimplementowana przy użyciu zastosowanej metody.

Pytanie brzmi:

Jeśli do kodu źródłowego zostaną dodane dodatkowe białe znaki lub instrukcje (które nie zakłócają przepływu kodu), należy je odzwierciedlić w czasie wykonywania (po kompilacji, jeśli dotyczy).

Każda ilość materiału może być wprowadzony przed trzech DISPLAYsekund, które powodują rozpoczęcie produkcji, w zasadzie poDISPLAY s będzie „przerwania przepływu kodu”, a więc to jest OK.

COBOL miał TRACEczasownik (instrukcję), który po prostu wyświetlał źródłowe numery wierszy podczas ich wykonywania (brak dostępu do numeru wiersza w programie). Mimo ograniczonego użycia zamieściłem implementację TRACE.

   ID Division.
   Program-ID. HIWHERE.
   ENVIRONMENT DIVISION.
   configuration section.
          source-computer. TinkerToy with debugging mode.
   Procedure Division.
   Declaratives.
   Debug-Declaratives Section.
       Use For Debugging on a b
       .
   Debug-Declaratives-Paragraph.
       Display Debug-Line "!"
       .
   End Declaratives
       .
   Main-Program Section.
       DISPLAY "Perform"
       Display "Hello World, from line " no advancing Perform b
       display "GO TO"
       Display "Hello World, from line " no advancing GO TO a
       .
   a.
       dISPLay "Fall through"
       Display "Hello World, from line " no advancing. b.
   The-Last-bit-OF-the-PROGRAM.
       GOBACK
       .

Dane wyjściowe to

Perform
Hello World, from line     18!
GO TO
Hello World, from line     20!
Fall through
Hello World, from line     23!

Jako przykład potęgi i elastyczności pisania języka, w tym przykładzie zastosowano jednocześnie małe i wielkie litery oraz całkowicie wielkie litery. Nie ma znaczenia, ponieważ podczas przetwarzania wszystko jest „składane” do WIELKIEGO LITERY.

Jedynym standardowym sposobem COBOL-a na uzyskanie źródłowego numeru wiersza w uruchomionym programie z uruchomionego programu jest użycie znaku DEBUGGING DECLARATIVE. Masz dostęp do rejestru specjalnego w obrębie SECTION, ściśle w obrębie jednego akapitu SECTION, oświadczenia takiego DEBUG-LINE. Zawiera on źródłowy numer wiersza czasownika (instrukcji), który spowodował przekazanie kontroli do określonej nazwy procedury (akapit lub SECTION).

Tak więc z PERFORM, lub GO TO, lub „przewiń” akapit w deklaratywnych deklaracjach SECTIONjest wykonywany.

OK, ale DISPLAYnie powoduje przeniesienia kontroli.

Nie ma problemu. Połóż to na tej samej linii co przeniesienie kontroli.

Problem, ponieważ jeśli do kodu źródłowego zostanie dodana „dowolna biała spacja lub instrukcje (które nie zakłócają przepływu kodu), należy to odzwierciedlić w czasie wykonywania (po skompilowaniu, jeśli dotyczy)”.

Tak więc, umieść go w tym samym wierszu, ale przed przekazaniem kontroli podziel zawartość DISPLAYna dwie części (pamiętaj: „W tym kontekście chcemy, aby numer pierwszego wiersza instrukcji, który wyświetla łańcuch” ) i wyprowadzają pierwszą część przed przekazaniem kontroli, a drugą część - od DEBUG-LINErazu po zakończeniu procedury debugowania.

Ostatni trudny bit dotyczy „upadku” („procedury” mogą być PERFORMedytowane, mogą być celem GO TOlub mogą być wprowadzane po prostu jako następny wiersz). W tym przypadku wstaw DISPLAY linię, która definiuje procedurę, ale przed definicją .

Nazwy „procedur” ( ai b) zostały znacznie skrócone, aby umożliwić ich dopasowanie do tej samej linii źródłowej co DISPLAY. Ściśle nazwa procedury w języku COBOL powinna zaczynać się gdzieś od kolumny ósmej do kolumny 11. Jednak składnia jest obecnie znacznie bardziej swobodna. Do tego stopnia, że ​​mogę zdefiniować nazwę procedury w tym samym wierszu, co jakiś kod. Nawet osadzony w kodzie. Wymagana jest ostrożność i okazjonalne kropki.

W PROCEDURE DIVISIONkażdym pokazanym kropce jest wymagany i nie jest już więcej.

Kompilować:

cobc -x -g hiwhere.cbl

Aby wykonać (linux):

COB_SET_DEBUG=Y ./hiwhere

Wreszcie zwrot TRACE (bez READY / RESET).

   ID Division.
   Program-ID. tRacE.
   ENVIRONMENT DIVISION.
   configuration section.
          source-computer. TinkerToy with debugging mode.
   Procedure Division.
   Declaratives.
   Debug-Declaratives Section.
       Use For Debugging on a
       .
   Debug-Declaratives-Paragraph.
       Display Debug-Line
       .
   End Declaratives
       .
   Main-Program Section.
  *    Just append "perform a" to a single-line statement.
       DISPLAY "1" . perform a
       Display "2" . perform a
       display "3" . perform a
  *    Or prepend "perform a." for a multi-line statement, or a
  *    statement which won't "come back". 
       perform a. GOBACK
       .
   a.
       CONTINUE
       .

Dane wyjściowe to:

1
    17
2
    18
3
    19
    20

Gdzie 1, 2 i 3 są wyprowadzane z trzech instrukcji DISPLAY, a 17, 18, 19 i 20 są numerami linii „wykonywalnych” (nie debugujących) linii.

Bill Woodger
źródło
8

Jawa

Korzystanie z zachowania śledzenia stosu wyjątku w celu uzyskania bieżącej linii. tak długo, jak Printstatement nie jest zniekształcony w wiele linii lub plik klas jest zniekształcony, powinien działać

public class PrittLnbr
{
    public static void main(String[] args)
    {
        System.out.println("Hello World, from line "+new Error().getStackTrace()[0].toString().split(":")[1]+"!");
    }
}
masterX244
źródło
8

Pyton

import traceback, inspect
frame = inspect.currentframe()
print("Hello World, from line "+traceback.format_stack(frame)[0].split()[3][:-1]+"!")  
Hannes Karppila
źródło
6

Perl

print 'Hello World, from line '.__LINE__.'!';
Tal
źródło
13
Jest to również prawidłowe rozwiązanie PHP.
MrLore
6

Jawa

public class HelloFrom {
    public static void main(String[] args) {
        System.out.println("Hello World, from line " + Thread.currentThread().getStackTrace()[1].getLineNumber() + "!");
    }
}
Cineris
źródło
technicznie takie same jak ja ( codegolf.stackexchange.com/a/30058/10801 )
masterX244
2
Sortuj, z wyjątkiem użycia bieżącego wątku zamiast tworzenia nowego błędu, aby uzyskać ślad stosu. Nie ma żadnego błędu;)
Cineris
6

Pyton

import inspect
print ("Hello world from line %d!" % (inspect.getlineno(inspect.currentframe())))

Wydajność

Hello World from line 2!
Ricardo A.
źródło
1
Jak dotąd najlepszy Python!
kirbyfan64sos
6

Befunge

Zrobione dla zabawy.

>00g1+:00p"v"\10v  
    v-*45g00p\g <  
#v+1_$10g1vv,,,,<  
^<p000p01+<#>,,,^  
>" enil morf ,oll"v
@.,,,,,,,,,<^,"He"<

Warunkowo: lewy górny róg kodu musi wynosić 0 <x <20 i 0 <= y <62; i dwie pierwsze komórki muszą być puste.

przykład:

                         v                  

                         0                  
                         0                  
                         0                  
                         p                  
                         0                  
                         1                  
                         0                  
                         p                  
                         >00g1+:00p"v"\10v  
                             v-*45g00p\g <  
                         #v+1_$10g1vv,,,,<  
                         ^<p000p01+<#>,,,^  
                         >" enil morf ,oll"v
                         @.,,,,,,,,,<^,"He"<

Wyprowadziłby:

Cześć, z linii 10

AndoDaan
źródło
Nie mam pojęcia, co to było, ale wierzę, że twój wynik produkcji, więc +1 ;-)
ysap
1
Dla tych, którzy kwestionują moc potężnego Befunge, wypróbuj ją tutaj: quirkster.com/iano/js/befunge.html
Justin
6

do

Używając makra variadic, możemy wykonać funkcję drukowania, która automatycznie dodaje numer linii na końcu dowolnej instrukcji printf i zawsze drukuje na standardowe wyjście.

test.c:

#include <stdio.h>

#define printfl(format, ...) fprintf(stdout, format " From line %d\n", ##__VA_ARGS__, __LINE__)

int main() {
    printfl("Hello World! I have %d argument(s).", 1);
    return 0;
}

wyjścia:

% ./test
Hello World! I have 1 argument(s). From line 6

Uwaga: Odszedłem od wzorca, aby wykazać, że printfl jest nadal prawidłową funkcją wariadyczną; jeśli naprawdę zależy ci na formacie wyjściowym, zawsze możesz zmienić używane przeze mnie literały.

Walker Mills
źródło
Działa to tylko wtedy, gdy używasz łańcucha o stałym formacie. Nie powiedzie się, jeśli podasz inne wyrażenie dla ciągu formatu.
Snowbody
5

Grzmotnąć

#
# some comments to fill some lines...
#
echo "Hello World, from line $LINENO!"

Wydajność

Hello World, from line 4!
kitcar2000
źródło
@professorfish ... co jest nie tak z MOIM stylem, aby pokazać MOJĄ odpowiedź? Powinieneś przynajmniej wyjaśnić, dlaczego manipulujesz moją grafiką ... :-P
2
czy zmieniłem kod? jeśli tak, przepraszam. Martwiłem się tylko, że użytkownicy niebędący bashami nie będą w stanie powiedzieć, jaki jest kod źródłowy i jakie dane wyjściowe
1
I każdy poza mną uwielbia patrzeć, jak zmienia się jego rzeczy bez komentowania dlaczego? Dziwne miejsce ...
3
To była po prostu poprawka formatowania. Nie ma nic złego w tych AFAIK
Odradzane jest używanie zdefiniowanych zmiennych, takich jak LINE , chociaż dozwolone przez reguły.
vaxquis
5

re

void main ()
{
    import std.stdio;
    writefln("Hello World, from line %d", __LINE__);
}
Hugo Dubé
źródło
Odradzane jest używanie zdefiniowanych zmiennych, takich jak LINE , chociaż dozwolone przez reguły.
vaxquis
5

C lub C ++ oraz AWK

lineno.c:

// code or comments
// ....
#error Hello World, from line
// other code or comments

Stosowanie:

gcc lineno.c 2>&1 | awk '{ split($0,a,":"); ; printf("%s %s!\n", gensub(".*#error ","",1), a[2]); exit; }'

Wydajność:

Witaj, świecie, z linii 3

Uwagi:

  • Żaden kod napisany przez użytkownika nie przeszukuje pliku.
  • g ++ będzie działać na pliku c ++.
Ken A.
źródło
4

Nudne w Ruby:

puts "Hello World, from line #{__LINE__}!"

To nie jest oszustwo, prawda?

Ajedi32
źródło
Nie, to nie oszustwo! Wyzwanie to będzie oczywiście dużo łatwiejsze w niektórych językach i trudniejsze w innych, jednak, co było dlaczego napisałem go :) (teraz widzę dlaczego włączenie kryteriów punktacji jest tak ważna)
Przełom
Odradzane jest używanie zdefiniowanych zmiennych, takich jak LINE , chociaż dozwolone przez reguły.
vaxquis
1
@vaxquis Tak, to oświadczenie zostało dodane po tej odpowiedzi.
Ajedi32
4

JavaScript

Jedna linia za pomocą śledzenia stosu.

(function (o) { console.log("Hello World, from line " + (Error.captureStackTrace(o) || o.stack.match(/\d+/)[0] - !!__commandLineAPI) + "!"); })({});
joelrobichaud
źródło
3

Kobra

class Program
    def main
        print 'Hello World, from line [System.Diagnostics.StackFrame(true).getFileLineNumber]!'
Obrzydliwe
źródło
3

Rubin

File.write "hello.rb", "x=2\n"+"x+=1\n"*rand(rand(100))+'puts "Hello World, from line #{x}!"'
system "ruby hello.rb"
File.delete "hello.rb"
obolały
źródło
3

PowerShell

Tani ruch

Function LemmeGetDatError() {
    "Too busy chuggin along"
    "Then all of a sudden, I meet a new programmer"
    "And he's all like"
    Write-Output "$(Try {"Hello World from"; Throw "error" } Catch {$_.ScriptStackTrace.Split(":")[1]})"
}

LemmeGetDatError
SomeShinyMonica
źródło
3

PowerShell

$l=(Get-PSCallStack | ForEach{$_.Location})[0].split(' ')[-1]; "Hello World, from line $l!"

I:

try{ I AM ERROR. } catch { $l=$error[0].InvocationInfo.ScriptLineNumber; "Hello World, from line $l!" }

Oba działają w ten sposób:

PS C:\MyFolder> .\helloworld.ps1
Hello World, from line 1!
DarkAjax
źródło
+1, ale Write-Hostnie pisze na standardowe wyjście. Po prostu przekazanie ciągu wyśle ​​go na standardowe wyjście. Np."Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Rynant
@Rynant Dobra uwaga! Zaktualizuję moje odpowiedzi, aby uznać, że ...
DarkAjax
3

Pyton

import traceback

print 'Hello World, from line %i!' % traceback.extract_stack()[0][1]

Krótkie i słodkie.

Hoons
źródło
3

Perl

Kolejny Perl:

use warnings;

$SIG{__WARN__} = sub { ($line = shift) =~ s/\D//g; };

$x=$x+1; print "Hello World, form line $line!\n";
DarkAjax
źródło