Wyzwanie
Napisz program, który wyjścia Hello World, from line X!
, gdzie X
jest 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świetlenia
stdout
- 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
źródło
Odpowiedzi:
Sinclair Basic
Będzie to działać dla dowolnej linii,
PEEK
wprowadzając adres przechowujący bieżący numer linii, więc będą działać również:źródło
STR$
jeśli zastąpisz+
znaki średnikami?+
s z przyzwyczajenia.PODSTAWOWY
Myślę, że to robi wszystko, o co poproszono:
źródło
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..Jawa
źródło
Thread.currentThread().getStackTrace()
getLineNumber()
metody śledzenia stosu, podczas gdy odpowiedź, którą podłączyłeś, używatoString()
jej do znalezienia numeru linii.Perl
Nie tak krótki jak używanie
__LINE__
, ale może bardziej interesujący.źródło
C ++
przykład na żywo
źródło
Lua
źródło
DO#
C # 5.0
[CallerLineNumber]
robi lewę:Wydajność
źródło
X
cyframi rzymskimi jest10
.do
źródło
Pyton
Przykład (10 linii, 213 znaków):
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:
Kolejny przykład (spróbuj online tutaj) aby pokazać, że działa po dodaniu kodu / białych znaków. Oczekiwany wynik:
źródło
JavaScript
Uwaga: Wyrażenia analizowane z poziomu konsoli dewelopera chrome zostaną umieszczone w
with
instrukcji. Dlatego musimy zmniejszyć linię o jeden, jeśli tak jestźródło
with
klauzulą.Python 3
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 haszyprint
linię, stwierdza, że hash odpowiada magicznej wartości, której szuka.źródło
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:
Każda ilość materiału może być wprowadzony przed trzech
DISPLAY
sekund, które powodują rozpoczęcie produkcji, w zasadzie poDISPLAY
s będzie „przerwania przepływu kodu”, a więc to jest OK.COBOL miał
TRACE
czasownik (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.Dane wyjściowe to
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ębieSECTION
, ściśle w obrębie jednego akapituSECTION
, oświadczenia takiegoDEBUG-LINE
. Zawiera on źródłowy numer wiersza czasownika (instrukcji), który spowodował przekazanie kontroli do określonej nazwy procedury (akapit lubSECTION
).Tak więc z
PERFORM
, lubGO TO
, lub „przewiń” akapit w deklaratywnych deklaracjachSECTION
jest wykonywany.OK, ale
DISPLAY
nie 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ść
DISPLAY
na 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ęść - odDEBUG-LINE
razu po zakończeniu procedury debugowania.Ostatni trudny bit dotyczy „upadku” („procedury” mogą być
PERFORM
edytowane, mogą być celemGO TO
lub mogą być wprowadzane po prostu jako następny wiersz). W tym przypadku wstawDISPLAY
linię, która definiuje procedurę, ale przed definicją .Nazwy „procedur” (
a
ib
) zostały znacznie skrócone, aby umożliwić ich dopasowanie do tej samej linii źródłowej coDISPLAY
. Ś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 DIVISION
każdym pokazanym kropce jest wymagany i nie jest już więcej.Kompilować:
Aby wykonać (linux):
Wreszcie zwrot TRACE (bez READY / RESET).
Dane wyjściowe to:
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.
źródło
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ć
źródło
Pyton
źródło
Perl
źródło
Jawa
źródło
Pyton
Wydajność
źródło
Befunge
Zrobione dla zabawy.
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:
Wyprowadziłby:
Cześć, z linii 10
źródło
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:
wyjścia:
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.
źródło
Grzmotnąć
Wydajność
źródło
re
źródło
C lub C ++ oraz AWK
lineno.c:
Stosowanie:
Wydajność:
Witaj, świecie, z linii 3
Uwagi:
źródło
Nudne w Ruby:
To nie jest oszustwo, prawda?
źródło
JavaScript
Jedna linia za pomocą śledzenia stosu.
źródło
Kobra
źródło
Rubin
źródło
PowerShell
Tani ruch
źródło
PowerShell
I:
Oba działają w ten sposób:
źródło
Write-Host
nie 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]
Pyton
Krótkie i słodkie.
źródło
Perl
Kolejny Perl:
źródło