Tantangan
Tulis program yang menampilkan Hello World, from line X!
, di mana X
nomor 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 ke
stdout
- 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
sumber
Jawaban:
Sinclair Basic
Ini akan bekerja untuk semua baris
PEEK
memasukkan alamat yang menyimpan nomor baris saat ini, sehingga yang berikut ini juga akan berfungsi:sumber
STR$
jika Anda mengganti+
tanda dengan tanda titik koma?+
dari kebiasaan.DASAR
Saya pikir ini melakukan semua yang diminta:
sumber
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.Jawa
sumber
Thread.currentThread().getStackTrace()
getLineNumber()
metode pada jejak tumpukan, sedangkan jawaban yang Anda tautkan digunakantoString()
di atasnya untuk menemukan nomor baris.Perl
Tidak sesingkat menggunakan
__LINE__
, tapi mungkin lebih menarik.sumber
C ++
contoh hidup
sumber
Lua
sumber
C #
C # 5.0
[CallerLineNumber]
melakukan trik:Keluaran
sumber
X
dalam angka romawi adalah10
.C
sumber
Python
Contoh (10 baris, 213 karakter):
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:
Contoh lain (coba online di sini) untuk menunjukkan bahwa ia berfungsi ketika kode / spasi ditambahkan. Output yang diharapkan:
sumber
Javascript
Catatan: Ekspresi, yang dievaluasi dari dalam konsol dev krom akan dibungkus dengan
with
pernyataan. Jadi kita perlu mengurangi garis satu per satu jika itu masalahnyasumber
with
klausa.Python 3
Kode bacaan mandiri ini berisi hash referensi-sendiri. Jumlah SHA256 dari baris terakhir (dengan spasi awal dan tanpa spasi tambahan) dimulai dengan
cc46f7...
. Ketika hashprint
baris, itu menemukan bahwa hash cocok dengan nilai ajaib yang dicari.sumber
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:
Setiap jumlah barang dapat dimasukkan sebelum tiga
DISPLAY
s yang menyebabkan awal output, dan apa-apa setelah ituDISPLAY
s akan "mengganggu aliran kode", sehingga itu OK.COBOL digunakan untuk memiliki
TRACE
kata 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.Outputnya adalah
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 aSECTION
, secara ketat dalam paragraf dalam aSECTION
, dari deklaratif demikian Anda memiliki akses ke register khususDEBUG-LINE
. Ini berisi nomor baris sumber dari kata kerja (pernyataan) yang menyebabkan transfer kontrol ke nama-prosedur tertentu (paragraf atauSECTION
).Jadi, dengan
PERFORM
, atauGO 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
DISPLAY
menjadi 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, dariDEBUG-LINE
, setelah di dalam prosedur debugging.Bit rumit terakhir adalah untuk "fall through" ("prosedur" dapat
PERFORM
diedit, dapat menjadi targetGO TO
, atau dapat dimasukkan hanya dengan menjadi baris berikutnya). Dalam hal ini, letakkanDISPLAY
pada baris yang mendefinisikan prosedur, tetapi di depan definisi .Nama-nama "prosedur" (
a
danb
) telah sangat singkat untuk memungkinkan mereka untuk masuk pada baris sumber yang sama denganDISPLAY
. 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:
Untuk mengeksekusi (linux):
Akhirnya, kembalinya TRACE (tanpa SIAP / RESET).
Output adalah:
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).
sumber
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
sumber
Python
sumber
Perl
sumber
Jawa
sumber
Python
Keluaran
sumber
Dibalik
Dilakukan hanya untuk bersenang-senang.
Bersyarat: kiri atas kode harus 0 <x <20 dan 0 <= y <62; dan dua sel pertama harus kosong.
contoh:
Akan menghasilkan:
Halo, dari baris 10
sumber
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:
output:
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.
sumber
Pesta
Keluaran
sumber
D
sumber
C atau C ++, dan AWK
lineno.c:
Pemakaian:
Keluaran:
Halo, Dunia, dari baris 3
Catatan:
sumber
Agak membosankan di Ruby:
Ini tidak curang, kan?
sumber
Javascript
One line using stack trace.
sumber
Cobra
sumber
Ruby
sumber
PowerShell
Cheap Move
sumber
Powershell
And:
Both work like this:
sumber
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]
Python
Short and sweet.
sumber
Perl
Another Perl one:
sumber