Tulis sepotong kode untuk menampilkan nomor baris dari pernyataan cetak / keluaran itu sendiri (dalam bentuk “Hello World, from line X!”)

25

Tantangan

Tulis program yang menampilkan Hello World, from line X!, di mana Xnomor baris, dalam kode sumber, dari pernyataan cetak itu sendiri.

Aturan

  • Dalam konteks ini, kita ingin yang pertama nomor baris dari pernyataan yang output string yang akan ditampilkan kestdout
  • Anda harus menghindari hanya mencari melalui kode sumber Anda sebagai string (baik file atau quine) untuk menemukan nomor baris
  • Jika spasi atau pernyataan tambahan apa pun (yang tidak mengganggu aliran kode) ditambahkan ke kode sumber, itu harus tercermin pada run-time (setelah dikompilasi jika berlaku)

Rekomendasi

Jika disediakan oleh bahasa, Anda dapat menggunakan pengecualian / tumpukan jejak untuk mencapai tujuan ini. Cobalah yang terbaik untuk menggunakan kode yang portabel di berbagai sistem / implementasi, tetapi perhatikan bahwa ini bukan keharusan. Menggunakan variabel yang didefinisikan seperti __LINE__, meskipun diizinkan oleh aturan, tidak disarankan.

Pemenang

  • Ini adalah kontes popularitas (berakhir pada 10 Juni 2014), di mana jawaban yang dipilih oleh komunitas tertinggi akan dinyatakan sebagai pemenang berdasarkan suara saat ini pada saat itu

  • Saat memilih, pertimbangkan kreativitas jawaban seseorang, seberapa rumit atau menariknya itu. dan kesulitan / kendala bahasa pemrograman yang digunakan

Penerobosan
sumber
Apa yang Anda maksud dengan "nomor baris pertama"? Apakah Anda berbicara tentang apa yang harus terjadi jika pernyataan tersebut mencakup beberapa baris?
user2357112 mendukung Monica
@ user2357112 ya, hanya untuk menyelesaikan ambiguitas jika ada yang perlu menggunakan pernyataan milti-line.
Terobosan
Judulnya sangat eksplisit, tapi mungkin agak panjang.
Primo
1
Jawaban atas semua ini membosankan karena ini adalah pertanyaan yang sangat buruk. Sepertinya penanya tidak tahu keberadaan LINE . Bahkan saya mendaftar secara khusus untuk memilih ini saya pikir itu sangat buruk.
dave
1
@Markasoftware jika suatu baris ditambahkan sebelumnya, output tidak akan berubah untuk mencerminkannya.
Primo

Jawaban:

48

Sinclair Basic

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

Halo dunia, dari saluran 10!

Ini akan bekerja untuk semua baris PEEK memasukkan alamat yang menyimpan nomor baris saat ini, sehingga yang berikut ini juga akan berfungsi:

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

Halo dunia, dari baris 341!

kitcar2000
sumber
Dan dengan cara yang sama, Timex / Sinclair BASIC!
Gabe
Saya tidak berpura-pura tahu bahasa ini, tetapi tidak bisakah Anda mengabaikannya STR$jika Anda mengganti +tanda dengan tanda titik koma?
Tuan Lister
@ Tuan Tuan Ya, itu pasti akan berhasil, tetapi saya selalu menggunakan +dari kebiasaan.
kitcar2000
40

DASAR

Saya pikir ini melakukan semua yang diminta:

10 PRINT "Hello World, from line 10!"
osifrque melengking
sumber
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). Tujuannya ada di sana. Juga, itu adalah baris pertama dari sumber, bukan yang ke-10.
Bill Woodger
30
Ini mungkin baris pertama dalam kode sumber, tetapi masih baris 10 .
squeamish ossifrage
13
Saya percaya ini termasuk dalam kategori tidak lucu lagi . Ini benar-benar tidak imajinatif dan tidak menarik, meskipun secara harfiah memenuhi persyaratan. Mengapa ini memiliki begitu banyak upvotes? (Saya telah menurunkan suara)
Tim S.
18
Ini adalah jawaban yang bagus karena mengambil keuntungan konyol tetapi spesifik dari aspek bahasa BASIC yang tidak umum ditemukan dalam bahasa lain (terutama yang modern). Ini mungkin bukan yang paling populer (waktu akan memberi tahu), tapi saya hampir tidak bisa melihat bagaimana itu kurang menarik daripada menggunakan konstanta seperti __LINE__ atau mendapatkan info debug dari frame stack saat ini (seperti yang dilakukan sebagian besar jawaban lain saat ini).
Nick
2
Pintar, tetapi saya akan kecewa jika tidak ada yang berakhir dengan lebih banyak suara daripada yang ini.
agweber
35

Jawa

public class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World, from line "+new Exception().getStackTrace()[0].getLineNumber()+"!");
    }
}
Bayi
sumber
1
Saya lebih sukaThread.currentThread().getStackTrace()
Cruncher
3
Thread.getStackTrace () memanggil (Pengecualian baru ()). GetStackTrace () jika dipanggil pada utas saat ini, jadi itu adalah hal yang sama
DHall
1
aneh .... 2x jawaban yang sama dan 2 jumlah upvote berbeda ... (dapat digunakan sebagai sumber RNG ...) (sama di sini: codegolf.stackexchange.com/a/30058/10801 )
masterX244
@ masterX244 kedua jawaban itu tidak persis sama; yang ini menggunakan getLineNumber()metode pada jejak tumpukan, sedangkan jawaban yang Anda tautkan digunakan toString()di atasnya untuk menemukan nomor baris.
Terobosan
9
@ masterX244 perlu juga dicatat bahwa jawaban ini muncul 2 jam sebelumnya. Kali kedua saya melihat jawaban, itu tidak semenarik yang pertama.
Primo
30

Perl

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


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

Tidak sesingkat menggunakan __LINE__, tapi mungkin lebih menarik.

warnadalah alat debugging, yang mengeluarkan pernyataan untuk STDERR, menunjukkan di file mana, dan pada baris mana peringatan itu dikeluarkan ... kecuali STDERR sebelumnya telah ditutup atau tidak dapat diakses, dalam hal ini peringatan dikeluarkan untuk file yang paling baru dibuka menangani - ini adalah perilaku tidak berdokumen. Saya tidak yakin apakah itu akan lebih baik diklasifikasikan sebagai fitur atau bug.

Di sini, STDERRditutup, dan pegangan file baru diidentifikasi sebagai FOOBARdibuka, dan dialihkan ke variabel $_. Ini kemudian diuraikan untuk mengambil nomor baris peringatan, yang tertanam dalam pernyataan cetak.

primo
sumber
3
Ya, itu pasti lebih menarik :)
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";
}

contoh hidup

Yakk
sumber
2
Ini ... sihir
Paladine
1
Butuh waktu lama bagi saya untuk melihat bagaimana ini bekerja. Soo banyak ikan haring merah! Sangat lezat.
lihat
1
Jadi bagaimana cara kerjanya?
0x499602D2
16

Lua

print("Hello world, from line "..debug.getinfo(1).currentline.."!")
mniip
sumber
16

C #

C # 5.0 [CallerLineNumber]melakukan trik:

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

Keluaran

Hello World, from line X!
Thomas Weller
sumber
Adakah alasan khusus untuk menggunakan angka romawi?
Cole Johnson
4
Ketika garis pencetakan adalah garis 10, pertanyaannya ditafsirkan secara harfiah. Xdalam angka romawi adalah 10.
Kamis
Angka Romawi adalah sentuhan yang bagus!
NPSF3000
15

C

#include <stdio.h>
main(){
printf("Hello World, from line %d!", __LINE__);
}
gnibbler
sumber
Menggunakan variabel yang ditentukan seperti LINE , meskipun diizinkan oleh aturan, tidak disarankan.
vaxquis
@vaxquis, ya tapi jawaban saya mendahului edit untuk pertanyaan itu
gnibbler
itu masih solusi IMO buruk dan terlalu jelas . Saya bertanya-tanya mengapa orang memposting semua jenis variasi solusi ini dalam semua bahasa di dunia (termasuk PHP, D, Perl) alih-alih bahkan mencoba melakukan sesuatu yang lucu atau menarik?
vaxquis
14

Python

Contoh (10 baris, 213 karakter):

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

Coba online di sini . Kode pengubah non-aliran dan spasi dapat ditambahkan dan program akan menampilkan jumlah baris yang diperbarui, dan juga, potongan kode ini juga dapat digunakan di mana saja dalam program yang ada. Output yang diharapkan:

Hello World, from line 6!

Contoh lain (coba online di sini) untuk menunjukkan bahwa ia berfungsi ketika kode / spasi ditambahkan. Output yang diharapkan:

Down we go...
Gotta catch 'em all.
Down we go...
Hello World, from line 11!
Awesome!
Penerobosan
sumber
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) + ' !')

Catatan: Ekspresi, yang dievaluasi dari dalam konsol dev krom akan dibungkus dengan withpernyataan. Jadi kita perlu mengurangi garis satu per satu jika itu masalahnya

C5H8NNaO4
sumber
2
tumpukan data , hehe. Diverifikasi bekerja di Firefox.
Terobosan
1
@Breakthrough :) Ya itu bekerja lintas-browser (hanya diuji dengan Chrome, FF, IE terbaru). Chrome membutuhkan perlakuan khusus ketika dievaluasi dari dalam konsol, karena ia membungkus setiap pernyataan dalam withklausa.
C5H8NNaO4
2
Nama pengguna yang menarik tetapi tidak jelas. Monosodium glutamat, mungkin? (BTW, saya berpikir untuk mengajukan pertanyaan tentang DNA dan asam amino, yang salah satunya adalah asam glutamat.)
Level River St
@steveverrill Menurut google, Anda benar !
kitcar2000
@ kitcar2000 Mungkin. Tetapi ada senyawa lain yang kurang dikenal dengan formula ini: Sodium methylaspartate atau nitropentanoate, misalnya.
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

Halo dunia, dari saluran 8!

Kode bacaan mandiri ini berisi hash referensi-sendiri. Jumlah SHA256 dari baris terakhir (dengan spasi awal dan tanpa spasi tambahan) dimulai dengan cc46f7... . Ketika hash printbaris, itu menemukan bahwa hash cocok dengan nilai ajaib yang dicari.

Tim S.
sumber
tidak bisakah Anda mengatur line_num = ke -1 dan mencetak di luar lingkaran dan mendapatkan hash ajaib?
dave
1
@tidak yakin saya mengikuti Anda. Hash ajaib inilah yang membuat solusi ini pintar.
Tim S.
+1 untuk interpretasi literal dari aturan saya :) Sangat cerdas.
Terobosan
5
@Stefan Situs ini adalah tentang praktik terburuk. ;)
Tim S.
1
@ Sehe Kemungkinan besar, ini karena masalah ruang putih. Saya tidak memiliki baris baru di akhir file ketika saya membuatnya. Saya telah menambahkan baris untuk menghapus spasi dari ujung baris sebelum hashing. Itu harus bekerja lebih konsisten sekarang. (juga pastikan Anda tidak mengonversi spasi menjadi tab) Saya mencoba mengunggahnya ke ideone untuk menunjukkan kepada Anda versi live, tetapi tidak dapat membaca file sendiri di sana.
Tim S.
9

GNU COBOL

Yah, mereka bilang itu tidak bisa dilakukan. Sebenarnya, akulah yang mengatakan itu tidak bisa dilakukan. Sekarang sudah selesai, dan fitur bahasa usang diimplementasikan kembali menggunakan metode yang diterapkan.

Pertanyaannya menyatakan:

Jika spasi atau pernyataan tambahan apa pun (yang tidak mengganggu aliran kode) ditambahkan ke kode sumber, itu harus tercermin pada run-time (setelah dikompilasi jika berlaku).

Setiap jumlah barang dapat dimasukkan sebelum tiga DISPLAYs yang menyebabkan awal output, dan apa-apa setelah itu DISPLAYs akan "mengganggu aliran kode", sehingga itu OK.

COBOL digunakan untuk memiliki TRACEkata kerja (pernyataan) yang hanya mencantumkan nomor baris sumber saat dieksekusi (tidak ada akses ke nomor baris dalam program). Meskipun penggunaannya terbatas, saya sudah memasukkan implementasi 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
       .

Outputnya adalah

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

Sebagai pameran kekuatan dan fleksibilitas penulisan bahasa, contoh ini menggunakan huruf besar, huruf kecil, dan huruf besar semua, pada saat bersamaan. Tidak masalah, seperti saat diproses, semuanya "dilipat" ke UPPERCASE.

Satu-satunya cara COBOL standar untuk mendapatkan nomor baris sumber dalam program yang sedang berjalan, dari program yang sedang berjalan, adalah dengan a DEBUGGING DECLARATIVE. Dalam a SECTION, secara ketat dalam paragraf dalam a SECTION, dari deklaratif demikian Anda memiliki akses ke register khusus DEBUG-LINE. Ini berisi nomor baris sumber dari kata kerja (pernyataan) yang menyebabkan transfer kontrol ke nama-prosedur tertentu (paragraf atau SECTION).

Jadi, dengan PERFORM, atau GO TO, atau "melewati" paragraf di deklaratif debuggingSECTION dieksekusi.

OKE, tapi DISPLAY tidak menyebabkan transfer kontrol.

Tidak masalah. Letakkan di baris yang sama dengan transfer kontrol.

Masalah, karena jika "spasi atau pernyataan tambahan apa pun (yang tidak mengganggu aliran kode) ditambahkan ke kode sumber, itu harus tercermin pada run-time (setelah kompilasi jika berlaku)".

Jadi, letakkan di baris yang sama tetapi di depan transfer kontrol, bagi konten DISPLAYmenjadi dua bagian (ingat, "Dalam konteks ini, kami ingin nomor baris pertama dari pernyataan yang menampilkan string yang akan ditampilkan" ) dan output bagian pertama sebelum transfer kontrol, dan bagian kedua, dari DEBUG-LINE, setelah di dalam prosedur debugging.

Bit rumit terakhir adalah untuk "fall through" ("prosedur" dapat PERFORMdiedit, dapat menjadi target GO TO, atau dapat dimasukkan hanya dengan menjadi baris berikutnya). Dalam hal ini, letakkan DISPLAY pada baris yang mendefinisikan prosedur, tetapi di depan definisi .

Nama-nama "prosedur" ( adan b) telah sangat singkat untuk memungkinkan mereka untuk masuk pada baris sumber yang sama dengan DISPLAY. Sebenarnya nama prosedur COBOL harus dimulai dari kolom delapan hingga kolom 11. Namun, sintaksisnya, belakangan ini, jauh lebih santai tentang hal itu. Sejauh saya bisa mendefinisikan nama prosedur pada baris yang sama dengan beberapa kode. Bahkan tertanam dalam kode. Kehati-hatian, dan sesekali berhenti, diperlukan.

Dalam PROCEDURE DIVISION setiap titik yang ditunjukkan diperlukan, dan tidak ada lagi.

Untuk mengkompilasi:

cobc -x -g hiwhere.cbl

Untuk mengeksekusi (linux):

COB_SET_DEBUG=Y ./hiwhere

Akhirnya, kembalinya TRACE (tanpa SIAP / 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
       .

Output adalah:

1
    17
2
    18
3
    19
    20

Di mana 1, 2 dan 3 adalah output dari tiga pernyataan DISPLAY, dan 17, 18, 19 dan 20 adalah nomor baris dari baris "executable" (non-debugging).

Bill Woodger
sumber
8

Jawa

Menggunakan perilaku jejak tumpukan Exception untuk mendapatkan baris saat ini. selama Printstatement tidak hancur menjadi beberapa baris atau classfile menjadi hancur itu harus bekerja

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

Python

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

Perl

print 'Hello World, from line '.__LINE__.'!';
Tal
sumber
13
Ini juga merupakan solusi PHP yang valid.
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
sumber
secara teknis sama seperti yang saya lakukan ( codegolf.stackexchange.com/a/30058/10801 )
masterX244
2
Semacam, kecuali menggunakan Thread saat ini daripada membuat Kesalahan baru untuk mendapatkan jejak stack. Tidak ada kesalahan;)
Cineris
6

Python

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

Keluaran

Hello World from line 2!
Ricardo A
sumber
1
Python terbaik sejauh ini!
kirbyfan64sos
6

Dibalik

Dilakukan hanya untuk bersenang-senang.

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

Bersyarat: kiri atas kode harus 0 <x <20 dan 0 <= y <62; dan dua sel pertama harus kosong.

contoh:

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

Akan menghasilkan:

Halo, dari baris 10

AndoDaan
sumber
Tidak tahu apa ini, tapi saya percaya klaim output Anda, jadi +1 ;-)
ysap
1
Bagi mereka yang mempertanyakan kekuatan Befunge yang perkasa, coba di sini: quirkster.com/iano/js/befunge.html
Justin
6

C

Dengan menggunakan makro variadik, kita dapat membuat fungsi cetak yang secara otomatis menambahkan nomor baris ke akhir pernyataan printf sewenang-wenang, dan selalu mencetak ke stdout.

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

output:

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

Catatan: Saya menyimpang dari pola untuk menunjukkan bahwa printfl masih merupakan fungsi variadic yang valid; jika Anda benar-benar peduli dengan format output, Anda selalu dapat mengubah literal yang saya gunakan.

Walker Mills
sumber
Ini hanya berfungsi jika Anda menggunakan string format konstan. Gagal jika Anda memasukkan ekspresi lain untuk string format.
Snowbody
5

Pesta

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

Keluaran

Hello World, from line 4!
kitcar2000
sumber
@profesional ... apa yang salah dengan gaya SAYA untuk menunjukkan jawaban SAYA? Setidaknya Anda harus menjelaskan mengapa Anda memanipulasi karya seni saya ... :-P
2
apakah saya mengubah kode? jika saya melakukannya, saya minta maaf. Saya hanya khawatir bahwa pengguna non-bash tidak akan dapat mengetahui apa kode sumber dan apa outputnya
1
Dan evryone selain saya suka melihat barang-barangnya diubah tanpa berkomentar mengapa? Tempat aneh ...
3
Itu pada dasarnya perbaikan pemformatan. Tidak ada yang salah dengan AFAIK tersebut
Menggunakan variabel yang ditentukan seperti LINE , meskipun diizinkan oleh aturan, tidak disarankan.
vaxquis
5

D

void main ()
{
    import std.stdio;
    writefln("Hello World, from line %d", __LINE__);
}
Hugo Dubé
sumber
Menggunakan variabel yang ditentukan seperti LINE , meskipun diizinkan oleh aturan, tidak disarankan.
vaxquis
5

C atau C ++, dan AWK

lineno.c:

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

Pemakaian:

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

Keluaran:

Halo, Dunia, dari baris 3

Catatan:

  • Tidak ada kode tertulis pengguna yang mencari file.
  • g ++ akan bekerja pada file c ++.
Ken A
sumber
4

Agak membosankan di Ruby:

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

Ini tidak curang, kan?

Ajedi32
sumber
Nope, this isn't cheating! This challenge will obviously be a lot easier in some languages and more difficult in others, however, which was why I posted it :) (I see now why the inclusion of a scoring criteria is so important)
Breakthrough
Using defined variables like LINE, although allowed by the rules, are discouraged.
vaxquis
1
@vaxquis Yeah, that statement was added after this answer.
Ajedi32
4

Javascript

One line using stack trace.

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

Cobra

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

Ruby

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"
afuous
sumber
3

PowerShell

Cheap Move

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
sumber
3

Powershell

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

And:

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

Both work like this:

PS C:\MyFolder> .\helloworld.ps1
Hello World, from line 1!
DarkAjax
sumber
+1, but Write-Host doesn't write to stdout. Simply passing the string will send it to stdout. E.g. "Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Rynant
@Rynant Good point! I'll update my answers to consider that...
DarkAjax
3

Python

import traceback

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

Short and sweet.

Hoons
sumber
3

Perl

Another Perl one:

use warnings;

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

$x=$x+1; print "Hello World, form line $line!\n";
DarkAjax
sumber