print / outputステートメント自体の行番号を出力するコードを記述します(「Hello World、from line X!」の形式で)


25

チャレンジ

を出力するプログラムを作成しますHello World, from line X!。ここXで、は実際の印刷ステートメント自体のソースコードの行番号です。

ルール

  • このコンテキストでは表示する文字列出力するステートメントの最初の行番号が必要ですstdout
  • ソースコードを文字列(ファイルまたはクイン)として単純に検索して行番号を見つけることは避けてください
  • いずれの場合は、追加の空白やステートメント(コードの流れを中断していない)のソースコードに追加され、それはする必要があり、実行時に反映(該当する場合コンパイルした後)

推奨事項

言語で提供されている場合、例外/スタックトレースを使用してこの目標を達成できます。異なるシステム/実装間で移植可能なコードを使用するために最善を尽くしますが、これは要件ではないことに注意してください。のような定義済みの変数を使用する__LINE__ことは、ルールで許可されていますが、推奨されません。

勝者

  • これは人気のあるコンテスト(2014年6月10日に終了)であり、コミュニティ最も高く投票し回答がその時点での現在の投票に基づいて勝者として宣言されます。

  • 投票するときは、誰かの答えの創造性、それがどれほど精巧で面白いかを考えてください。使用されているプログラミング言語の難しさ/制約


「最初の行番号」とはどういう意味ですか?ステートメントが複数行にわたる場合に何が起こるかについて話しているのですか?
user2357112は、2014

@ user2357112はい、誰もがmilti-lineステートメントを使用する必要がある場合にあいまいさを解決するためです。
ブレークスルー14年

タイトルは非常に明確ですが、おそらく少し長いです。
プリモ14年

1
これに対する答えはすべて退屈です。なぜなら、それはとても悪い質問だからです。質問者がLINEの存在を知らなかったようです。実際、私はこれに特に賛成票を投じましたが、これはとても悪いと思いました。
デイブ

1
@Markasoftwareの前に行が追加された場合、出力はそれを反映して変更されません。
プリモ14

回答:


48

シンクレアベーシック

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

Hello world、10行目から!

これはPEEK、現在の行番号を格納しているアドレスでingを実行することにより、どの行でも機能します。したがって、以下も同様に機能します。

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

Hello world、341行目から!


そして同じトークンで、Timex / Sinclair BASIC!
ゲイブ14年

私はこの言語を知っているふりはしませんがSTR$+記号をセミコロンに置き換えた場合は除外できませんか?
ミスターリスター14年

@MrListerはい、それは間違いなく動作しますが、私はいつも+習慣からsを使用します。
kitcar2000 14年

40

ベーシック

私はこれが求められたすべてを行うと思います:

10 PRINT "Hello World, from line 10!"

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)。意図はそこにあります。また、これはソースの最初の行であり、10行目ではありません。
ビル・ウッドジャー

30
ソースコードの最初の行かもしれませんが、まだ10行目です。
squeamish ossifrage 14年

13
これはもはや面白くないカテゴリにしっかりと分類されると思います。文字通りそれは要件を満たしますが、それは本当に想像力に欠け、面白くありません。なぜこれに多くの賛成票があるのですか?(私は投票)
ティムS.

18
これは、他の言語(特に現代の言語)には一般に見られないBASIC言語の側面の愚かであるが特定の利点を利用するため、素晴らしい答えです。最も一般的ではないかもしれませんが(時間が経てばわかります)、__ LINE__などの定数を使用したり、現在のスタックフレームからデバッグ情報を取得する(他のほとんどの回答と同様)ことほど面白くないことがわかりません。
ニック14年

2
賢いですが、これ以上の賛成票が他にない場合は失望します。
agweber

35

Java

public class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World, from line "+new Exception().getStackTrace()[0].getLineNumber()+"!");
    }
}

1
私が好むThread.currentThread().getStackTrace()
たけた

3
Thread.getStackTrace()の呼び出し(新しい例外())getStackTraceメソッド()、それは同じことですので、現在のスレッドで呼び出された場合。
DHall

1
奇妙な.... 2x同じ答えと2つの異なるupvote金額...(RNGソースとして使用できます...)(同じ:codegolf.stackexchange.com/a/30058/10801
masterX244 14年

@ masterX244これらの2つの答えはまったく同じではありません。これgetLineNumber()はスタックトレースのメソッドを使用し、リンクした回答はそのメソッドを使用toString()して行番号を検索します。
ブレークスルー14年

9
@ masterX244この回答が2時間前に表示されたことも注目に値します。2回目に答えを見ると、最初ほどは面白くありません。
primo 14年

30

Perl

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


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

を使用するほど短くはありません__LINE__が、おそらくもっと面白いでしょう。

warn文を発行するデバッグツールですSTDERRどのファイルに指示すると、その行に警告が発行されました... しない限り、 STDERR以前に閉じたか、そうでなければアクセスできないされた、警告が最近開いたファイルに対して発行された場合にはハンドル-これは文書化されていない動作です。機能とバグのどちらに分類するのが良いのかわかりません。

ここで、STDERRは閉じられ、新しいファイルハンドルFOOBARが開かれたと識別され、変数にルーティングされます$_。次に、これを解析して、警告の行番号を取得します。この行番号は、printステートメントに埋め込まれています。


3
はい、間違いなくもっと面白いです:)
タル14年

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";
}

ライブ例


2
これは...魔法
パラディン14年

1
これがどのように機能するかを見るのに長い時間がかかりました。たくさんのニシン それはおいしいです。
sehe 14

1
それでは、どのように機能しますか?
-0x499602D2


16

C#

C#5.0 [CallerLineNumber]はトリックを行います:

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();
        }
    }
}

出力

Hello World, from line X!

ローマ数字を使用する特別な理由はありますか?
コールジョンソン14年

4
印刷行が10行の場合、質問は文字通り解釈されます。Xローマ数字です10
Οurous

ローマ数字はいい感じです!
NPSF3000 14年

15

C

#include <stdio.h>
main(){
printf("Hello World, from line %d!", __LINE__);
}

LINEのような定義済み変数を使用することは、ルールで許可されていますが、推奨されていません。
vaxquis

@vaxquis、はい、しかし私の答えは質問を編集する前の
日付です

それはいまだにひどく明白なソリューションIMOです。リモートで面白いことや興味をそそるようなことをしようとするのではなく、なぜ世界中のすべての言語(PHP、D、Perlを含む)でこのソリューションのあらゆる種類のバリエーションを投稿したのでしょうか?
vaxquis 14年

14

Python

例(10行、213文字):

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

こちらからオンラインでお試しください。非フロー変更コードと空白を追加すると、プログラムは更新された行数を表示します。同様に、このコードスニペットは既存のプログラムのどこでも使用できます。期待される出力:

Hello World, from line 6!

コード/空白が追加されたときに機能することを示す別の例(ここでオンラインで試してください)。期待される出力:

Down we go...
Gotta catch 'em all.
Down we go...
Hello World, from line 11!
Awesome!

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) + ' !')

注:chrome devコンソール内から評価される式は、withステートメントにラップされます。したがって、その場合は、行を1つ減らす必要があります


2
dat stack、hehe。Firefoxでの動作確認済み。
ブレークスルー14年

1
@Breakthrough :)はい、クロスブラウザで動作します(ただし、最新のChrome、FF、IEでのみテストされています)。Chromeは、with句内のすべてのステートメントをラップするため、コンソール内から評価する場合は特別な処理が必要です。
C5H8NNaO4

2
面白いがあいまいなユーザー名。おそらくグルタミン酸ナトリウム?(ところで、私はグルタミン酸が1つであるDNAとアミノ酸に関する質問をすることを考えています。)
Level River St 14年

@steveverrillグーグルによると、あなたは正しいです!
kitcar2000 14年

@ kitcar2000おそらく。しかし、この式を持つ他のあまり知られていない化合物があります:例えば、メチルアスパラギン酸ナトリウムまたはニトロペンタン酸ナトリウム。
レベルリバーセント14年

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

Hello world、8行目から!

この自己読み取りコードには、自己参照ハッシュが含まれています。(最初の空白を持つと末尾の空白をせずに)最後の行のSHA256の合計はで始まります cc46f7...print行をハッシュすると、ハッシュが検索対象のマジック値と一致することがわかります。


line_num = -1に設定し、ループの外側に印刷して魔法のハッシュに乗ることはできませんか?
デイブ

1
@daveは私があなたをフォローしているかどうかわからない。魔法のハッシュは、このソリューションを賢くするものです。
ティムS. 14年

私のルールを文字通り解釈するための+1 :)非常に賢い。
ブレークスルー14年

5
@Stefanしかし、このサイトは最悪の慣行に関するものです。;)
ティムS.

1
@seheおそらく、これは空白の問題が原因でした。ファイルを作成したときに、ファイルの最後に改行がありませんでした。ハッシュする前に、行の末尾から空白を削除する行を追加しました。これで、より一貫して機能するはずです。(スペースをタブに変換していないことも確認してください)ライブバージョンを表示するためにideoneにアップロードしようとしましたが、そこにある独自のファイルを読み取ることができません。
ティムS. 14

9

GNU COBOL

まあ、彼らはそれができないと言った。実際、それができないと言ったのは私でした。これで完了です。廃止された言語機能は、適用されたメソッドを使用して再実装されました。

質問の状態:

ソースコードに追加の空白またはステートメント(コードのフローを中断しない)が追加された場合、実行時に反映されます(該当する場合はコンパイル後)。

ものの任意の量は、前3に挿入することができDISPLAY、出力の開始を引き起こし、S、および何もDISPLAYそれではOKという、s「は、コードの流れを中断」でしょう。

COBOLは、TRACE実行時にソース行番号を単純にリストした動詞(ステートメント)を使用していました(プログラムの行番号にアクセスできません)。用途は限られていますが、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
       .

出力は

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

言語を記述する力と柔軟性を示すために、この例では大文字と小文字が混在し、完全に小文字、完全に大文字を使用しています。処理されると、すべてが大文字に「折り畳まれる」ので問題ではありません。

実行中のプログラムから実行中のプログラムのソース行番号を取得する唯一の標準COBOL方法は、を使用することDEBUGGING DECLARATIVEです。内SECTION、厳密には内の段落内、SECTIONそのような宣言の中で、special-registerにアクセスできますDEBUG-LINE。これには、特定の手続き名(段落またはSECTION)に制御を移した動詞(文)のソース行番号が含まれます。

そのため、、PERFORMまたはGO TO、または「フォールスルー」を使用して、デバッグ宣言の段落SECTIONが実行されます。

わかりましたが、DISPLAYコントロールの転送は発生しません。

問題ない。それを上に置くと同じライン制御の転送など。

問題は、「コードのフローを中断しない追加の空白またはステートメントがソースコードに追加された場合、実行時に反映される必要があるためです(該当する場合はコンパイル後)」。

したがって、同じ行に配置しますが、コントロールの転送の前に、コンテンツDISPLAYを2つに分割します(「このコンテキストでは、表示する文字列を出力するステートメントの最初の行番号が必要です」 )制御の転送前に最初の部分を出力しDEBUG-LINE、デバッグ手順の内部で、から2番目の部分を出力します。

最後のトリッキーなビットは「フォールスルー」用です(「手順」をPERFORM編集するか、aのターゲットにするGO TOか、単に次の行を入力するだけで入力できます)。この例DISPLAY では、プロシージャを定義する行で、定義の前にを配置します

「プロシージャ」(aおよびb)の名前は、と同じソース行に収まるように大幅に短縮されていDISPLAYます。厳密には、COBOLプロシージャー名は8桁目から11桁目までのどこかに開始する必要があります。しかし、最近では、構文ははるかに緩和されています。あるコードと同じ行にプロシージャ名を定義できる範囲で。コードに埋め込まれていても。ケアと、たまにフルストップが必要です。

PROCEDURE DIVISION示されている各フルストップでは必須であり、これ以上はありません。

コンパイルします:

cobc -x -g hiwhere.cbl

実行するには(Linux):

COB_SET_DEBUG=Y ./hiwhere

最後に、TRACEの戻り(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
       .

出力は次のとおりです。

1
    17
2
    18
3
    19
    20

ここで、1、2、および3は3つのDISPLAYステートメントから出力され、17、18、19、および20は「実行可能」(デバッグなし)行の行番号です。


8

Java

例外のスタックトレースの動作を使用して現在の行を取得します。Printstatementが複数行にマングルされていないか、クラスファイルがマングルされている限り、動作するはずです

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



6

Java

public class HelloFrom {
    public static void main(String[] args) {
        System.out.println("Hello World, from line " + Thread.currentThread().getStackTrace()[1].getLineNumber() + "!");
    }
}

私は(同じように技術的には同じcodegolf.stackexchange.com/a/30058/10801
masterX244

2
スタックトレースを取得するために新しいエラーを作成する代わりに現在のスレッドを使用することを除いて、並べ替えます。エラーはありません;)
シネリス14年

6

Python

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

出力

Hello World from line 2!

1
これまでで最高のPython 1つ!
kirbyfan64sos

6

ベファンジ

ただ楽しみのために行われます。

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

条件付き:コードの左上は0 <x <20および0 <= y <62でなければなりません。そして最初の2つのセルは空でなければなりません。

例:

                         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"<

出力します:

こんにちは、10行目から


これが何であるかは分かりませんが、あなたのアウトプットはそうだと思うので、+ 1 ;-)
ysap 14年

1
強力なBefungeの力に疑問を持っている人のために、ここで試してみてください:quirkster.com/iano/js/befunge.html-
ジャスティン

6

C

可変長マクロを使用することにより、任意のprintfステートメントの最後に行番号を自動的に追加し、常に標準出力に出力する印刷関数を作成できます。

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;
}

出力:

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

注:printflが依然として有効な可変長関数であることを示すために、パターンから逸脱しました。出力の形式に本当に関心がある場合は、使用するリテラルをいつでも変更できます。


これは、一定のフォーマット文字列を使用する場合にのみ機能します。書式文字列に他の式を渡すと失敗します。
スノーボディ14年

5

バッシュ

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

出力

Hello World, from line 4!

@professorfish ...私の答えを表示する私のスタイルの何が問題になっていますか?少なくとも私のアートワークを操作する理由を説明する必要があります... :-P

2
コードを変更しましたか?もしそうなら、すみません。私はちょうど非bashのユーザーがソースコードとどのような出力であったものを伝えることができないだろうと心配していた

1
そして、私以外の誰も、なぜコメントせずに彼のものが変更されるのを見るのが好きですか?奇妙な場所...

3
基本的にフォーマットの修正でした。それらのAFAIK

LINEのような定義済み変数を使用することは、ルールで許可されていますが、推奨されていません。
vaxquis 14年

5

D

void main ()
{
    import std.stdio;
    writefln("Hello World, from line %d", __LINE__);
}

LINEのような定義済み変数を使用することは、ルールで許可されていますが、推奨されていません。
vaxquis 14年

5

CまたはC ++、およびAWK

lineno.c:

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

使用法:

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

出力:

こんにちは、World、3行目から

ノート:

  • ユーザーが作成したコードはファイルを検索しません。
  • g ++はc ++ファイルで動作します。

4

Rubyの退屈な種類:

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

これは不正行為ではありませんよね?


いいえ、これは不正行為ではありません!この課題は明らかになります多く、私はそれを掲載する理由:)(採点基準を含めることは非常に重要である理由私は今参照)であった、しかし、他にいくつかの言語で簡単に、より困難
画期的

LINEのような定義済み変数を使用することは、ルールで許可されていますが、推奨されていません。
vaxquis

1
@vaxquisええ、その答えはこの答えのに追加されまし
Ajedi32 14年

4

Javascript

スタックトレースを使用する1行。

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

3

コブラ

class Program
    def main
        print 'Hello World, from line [System.Diagnostics.StackFrame(true).getFileLineNumber]!'

3

ルビー

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"

3

パワーシェル

チープムーブ

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

3

パワーシェル

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

そして:

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

どちらも次のように機能します。

PS C:\MyFolder> .\helloworld.ps1
Hello World, from line 1!

+1。ただしWrite-Host、stdoutには書き込みません。文字列を渡すだけで、標準出力に送信されます。例"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
リナント14年

@Rynant良い点!それを考慮するために回答を更新します
...-DarkAjax

3

Python

import traceback

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

短くて甘い。


3

Perl

別のPerlのもの:

use warnings;

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

$x=$x+1; print "Hello World, form line $line!\n";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.