Соревнование
Напишите программу, которая выводит Hello World, from line X!
, где X
номер строки в исходном коде, самого фактического оператора печати.
Правила
- В этом контексте мы хотим, чтобы номер первой строки оператора, который выводит строку , отображался в
stdout
- Вы должны избегать простого поиска по вашему исходному коду в виде строки (файла или quine), чтобы найти номер строки
- Если какие-либо дополнительные пробелы или операторы (которые не прерывают поток кода) добавляются в исходный код, это должно быть отражено во время выполнения (после компиляции, если применимо)
рекомендации
Если это предусмотрено языком, вы можете использовать исключения / трассировки стека для достижения этой цели. Старайтесь изо всех сил использовать код, переносимый между различными системами / реализациями, но учтите, что это не является обязательным требованием. Использование определенных переменных, таких как __LINE__
, хотя и разрешено правилами, не рекомендуется.
Победитель
Это конкурс популярности (завершился 10 июня 2014 г.), в котором ответ, набранный сообществом за наибольшее количество голосов, будет объявлен победителем на основе текущих голосов на момент голосования.
При голосовании учитывайте креативность чьего-либо ответа, насколько он сложен или интересен . и трудности / ограничения используемого языка программирования
источник
Ответы:
Синклер Базовый
Это будет работать для любой строки по
PEEK
адресу, в котором хранится номер текущей строки, поэтому также будет работать следующее:источник
STR$
если вы замените+
знаки точкой с запятой?+
s по привычке.Бейсик
Я думаю, что это делает все, что просили:
источник
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)
, Намерение здесь. Кроме того, это первая строка источника, а не 10-я.Джава
источник
Thread.currentThread().getStackTrace()
getLineNumber()
методе используется метод трассировки стека, а в ответе, на который вы ссылаетесь, используетсяtoString()
номер строки.Perl
Не такой короткий, как использование
__LINE__
, но, возможно, более интересный.источник
C ++
живой пример
источник
Lua
источник
C #
C # 5.0
[CallerLineNumber]
делает свое дело:Выход
источник
X
в римских цифрах есть10
.С
источник
питон
Пример (10 строк, 213 символов):
Попробуйте онлайн здесь . Можно добавить не изменяющий поток код и пробел, и программа отобразит обновленный счетчик строк, а также этот фрагмент кода можно также использовать в любом месте существующей программы. Ожидаемый результат:
Другой пример (попробуйте онлайн здесь), чтобы показать, что он работает при добавлении кода / пробелов. Ожидаемый результат:
источник
Javascript
Примечание. Выражения, вычисленные в консоли разработчика Chrome, будут заключены в
with
оператор. Таким образом, нам нужно уменьшить строку на единицу, если это такисточник
with
предложении.Python 3
Этот код для самостоятельного чтения содержит хеш, ссылающийся на себя. Сумма SHA256 последней строки (с начальным пробелом и без конечного пробела) начинается с
cc46f7...
. Когда он хешируетprint
строку, он обнаруживает, что хеш соответствует магическому значению, которое он ищет.источник
GNU COBOL
Ну, они сказали, что это невозможно сделать. На самом деле, это я сказал, что это невозможно сделать. Теперь все готово, и устаревшая языковая функция повторно реализована с использованием примененного метода.
Вопрос гласит:
Любое количество материала может быть вставлено до трех
DISPLAY
секунд , которые вызывают начало вывода, и все , что после того, какDISPLAY
с будет «прерывание потока кода», так что это нормально.В языке COBOL был
TRACE
глагол (оператор), который просто перечислял исходные номера строк по мере их выполнения (нет доступа к номеру строки в программе). Несмотря на ограниченное использование, я включил реализацию TRACE.Выход
В качестве демонстрации силы и гибкости написания языка в этом примере используются смешанные, полностью строчные и полностью прописные буквы одновременно. Неважно, как при обработке все «складывается» в верхний регистр.
Единственный стандартный способ получения COBOL исходного номера строки в запущенной программе, из запущенной программы, - с помощью
DEBUGGING
DECLARATIVE
. В пределахSECTION
, строго в пределах параграфаSECTION
, такого декларативного документа, у вас есть доступ к специальному рееструDEBUG-LINE
. Он содержит номер строки источника глагола (оператора), который вызвал передачу управления определенному имени процедуры (параграф илиSECTION
).Таким образом, с
PERFORM
, илиGO TO
, или «провалиться» параграф в декларациях отладкиSECTION
выполняется.Да, но
DISPLAY
не вызывает передачу контроля.Нет проблем. Поместите это в ту же самую линию как передача контроля.
Проблема, поскольку, если «любые дополнительные пробелы или операторы (которые не прерывают поток кода) добавляются в исходный код, это должно быть отражено во время выполнения (после компиляции, если применимо)».
Итак, поместите его в ту же строку, но перед передачей управления, разделите содержимое элемента
DISPLAY
на две части (помните: «В этом контексте мы хотим, чтобы номер первой строки оператора, который выводит строку, отображался») ) и вывести первую часть до передачи управления, а вторую часть изDEBUG-LINE
один раз внутри процедуры отладки.Последний хитрый бит предназначен для «провала» («процедуры» могут быть
PERFORM
отредактированы, могут быть цельюGO TO
или могут быть введены просто следующей строкой). В этом случае поместите вDISPLAY
строку, которая определяет процедуру, но перед определением .Имена «процедур» (
a
иb
) были значительно сокращены, чтобы позволить им поместиться в той же исходной строке, что иDISPLAY
. Строго говоря, имя процедуры на языке COBOL должно начинаться где-то с восьмого столбца до столбца 11. Однако синтаксис в наши дни гораздо более расслаблен. В той степени, в которой я могу определить имя процедуры в той же строке, что и некоторый код. Даже встроенный в код. Требуется осторожность, а иногда и полная остановка.в
PROCEDURE DIVISION
каждой показанной полной остановке требуется, и не более того.Скомпилировать:
Выполнить (Linux):
Наконец, возврат TRACE (без READY / RESET).
Выход:
Где 1, 2 и 3 выводятся из трех операторов DISPLAY, а 17, 18, 19 и 20 - номера строк «исполняемых» (не отладочных) строк.
источник
Джава
Использование поведения трассировки стека исключений для получения текущей строки. до тех пор, пока Printstatement не искажается в несколько строк или не искажается файл класса, он должен работать
источник
питон
источник
Perl
источник
Джава
источник
питон
Выход
источник
Befunge
Сделано просто для удовольствия.
Условно: верхний левый угол кода должен быть 0 <x <20 и 0 <= y <62; и две первые ячейки должны быть пустыми.
пример:
Будет вывод:
Здравствуйте, из строки 10
источник
С
Используя переменный макрос, мы можем создать функцию печати, которая автоматически добавляет номер строки в конец произвольного оператора printf и всегда печатает в стандартный вывод.
test.c:
выходы:
Примечание: я отклонился от шаблона, чтобы продемонстрировать, что printfl все еще является допустимой функцией с переменным числом аргументов; если вы действительно заботитесь о формате вывода, вы всегда можете изменить литералы, которые я использую.
источник
удар
Выход
источник
D
источник
C или C ++ и AWK
lineno.c:
Использование:
Выход:
Привет, Мир, из строки 3
Заметки:
источник
Вид скучного в Ruby:
Это не обман, верно?
источник
Javascript
Одна строка с использованием трассировки стека.
источник
кобра
источник
Рубин
источник
PowerShell
Дешевое движение
источник
Powershell
А также:
Оба работают так:
источник
Write-Host
не пишет в стандартный вывод. Простая передача строки отправит ее на стандартный вывод. Например"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
питон
Коротко и сладко.
источник
Perl
Еще один Perl один:
источник