Viết một đoạn mã để xuất số dòng của chính câu lệnh in / đầu ra (dưới dạng phiên bản Hello Hello World, từ dòng X!


25

Các thách thức

Viết chương trình xuất ra Hello World, from line X!, trong đó Xlà số dòng, trong mã nguồn, của chính câu lệnh in thực tế.

Những quy định

  • Trong bối cảnh này, chúng tôi muốn các đầu số dòng của báo cáo kết quả mà kết quả đầu ra chuỗi sẽ được hiển thị đểstdout
  • Bạn nên tránh chỉ đơn giản là tìm kiếm thông qua mã nguồn của bạn dưới dạng một chuỗi (tệp hoặc quine) để tìm số dòng
  • Nếu bất kỳ khoảng trắng hoặc câu lệnh bổ sung nào (không làm gián đoạn dòng mã) được thêm vào mã nguồn, thì nó sẽ được phản ánh vào thời gian chạy (sau khi biên dịch nếu có)

khuyến nghị

Nếu được cung cấp bởi ngôn ngữ, bạn có thể sử dụng ngoại lệ / dấu vết ngăn xếp để thực hiện mục tiêu này. Cố gắng hết sức để sử dụng mã có thể di động trên các hệ thống / triển khai khác nhau, nhưng lưu ý rằng đây không phải là một yêu cầu. Sử dụng các biến được xác định như __LINE__, mặc dù được cho phép bởi các quy tắc, không được khuyến khích.

Người chiến thắng

  • Đây là một cuộc thi phổ biến (kết thúc vào ngày 10 tháng 6 năm 2014), trong đó câu trả lời được cộng đồng bình chọn cao nhất sẽ được tuyên bố là người chiến thắng dựa trên số phiếu hiện tại vào thời điểm đó

  • Khi bỏ phiếu, vui lòng xem xét sự sáng tạo trong câu trả lời của ai đó, mức độ phức tạp hoặc thú vị của nó. và những khó khăn / hạn chế của ngôn ngữ lập trình đang được sử dụng


Bạn có ý nghĩa gì bởi "số dòng đầu tiên"? Bạn đang nói về những gì sẽ xảy ra nếu câu lệnh kéo dài nhiều dòng?
user2357112 hỗ trợ Monica

@ user2357112 có, chỉ để giải quyết bất kỳ sự mơ hồ nào nếu có ai cần sử dụng câu lệnh milti-line.
Đột phá

Tiêu đề rất rõ ràng, nhưng có lẽ hơi dài.
primo

1
Các câu trả lời cho điều này đều nhàm chán vì đây là một câu hỏi tồi. Nó giống như người hỏi không biết về sự tồn tại của LINE . Trong thực tế, tôi đã đăng ký cụ thể để bỏ phiếu này, tôi nghĩ rằng nó rất tệ.
dave

1
@Markasoftware nếu một dòng được thêm vào trước nó, đầu ra sẽ không thay đổi để phản ánh điều đó.
Primo

Câu trả lời:


48

Cơ bản

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

Xin chào thế giới, từ dòng 10!

Điều này sẽ hoạt động cho bất kỳ dòng nào bằng cách PEEKing tại địa chỉ lưu trữ số dòng hiện tại, do đó, những điều sau đây cũng sẽ hoạt động:

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

Xin chào thế giới, từ dòng 341!


Và bởi cùng một mã thông báo, Timex / Sinclair BASIC!
Gabe

Tôi không giả vờ biết ngôn ngữ này, nhưng bạn không thể bỏ qua STR$nếu bạn thay thế các +dấu hiệu bằng dấu chấm phẩy?
Ông Lister

@MrLister Vâng, điều đó chắc chắn sẽ hiệu quả nhưng tôi luôn sử dụng +s từ thói quen.
kitcar2000

40

CĂN BẢN

Tôi nghĩ rằng điều này làm mọi thứ đã được yêu cầu:

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). Ý định là ở đó. Ngoài ra, đó là dòng đầu tiên của nguồn, không phải là dòng thứ 10.
Bill Woodger

30
Nó có thể là dòng đầu tiên trong mã nguồn, nhưng nó vẫn là dòng 10 .
squossish ossifrage

13
Tôi tin rằng điều này rơi chắc chắn dưới thể loại không còn hài hước . Nó thực sự không tưởng tượng và không thú vị, mặc dù theo nghĩa đen nó đáp ứng yêu cầu. Tại sao điều này có rất nhiều upvote? (Tôi đã bị đánh giá thấp)
Tim S.

18
Đây là một câu trả lời tuyệt vời vì nó có một lợi thế ngớ ngẩn nhưng cụ thể về một khía cạnh của ngôn ngữ BASIC không thường thấy trong các ngôn ngữ khác (đặc biệt là các ngôn ngữ hiện đại). Nó có thể không phải là phổ biến nhất (thời gian sẽ trả lời), nhưng tôi khó có thể thấy nó kém thú vị như thế nào so với việc sử dụng hằng số như __LINE__ hoặc nhận thông tin gỡ lỗi từ khung ngăn xếp hiện tại (như hầu hết các câu trả lời khác hiện đang làm).
Nick

2
Thông minh, nhưng tôi sẽ thất vọng nếu không có gì khác kết thúc với nhiều upvote hơn cái này.
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
Tôi thíchThread.currentThread().getStackTrace()
Cruncher

3
Các cuộc gọi Thread.getStackTrace () (ngoại lệ mới ()). GetStackTrace () nếu được gọi trên chuỗi hiện tại, vì vậy đó là điều tương tự
DHall

1
kỳ lạ .... 2 câu trả lời giống nhau và 2 số tiền upvote khác nhau ... (có thể được sử dụng làm nguồn RNG ...) (giống ở đây: codegolf.stackexchange.com/a/30058/10801 )
masterX244

@ masterX244 hai câu trả lời là không chính xác giống hệt nhau; cái này sử dụng getLineNumber()phương thức trên dấu vết ngăn xếp, trong khi câu trả lời bạn liên kết với việc sử dụng toString()nó để tìm số dòng.
Đột phá

9
@ masterX244 cũng đáng lưu ý rằng câu trả lời này đã xuất hiện 2 giờ trước đó. Lần thứ hai tôi thấy một câu trả lời, nó không thú vị như lần đầu tiên.
Primo

30

Perl

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


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

Không hoàn toàn ngắn như sử dụng __LINE__, nhưng có lẽ thú vị hơn.

warnlà một công cụ gỡ lỗi, đưa ra một tuyên bố STDERR, cho biết tập tin nào và cảnh báo nào được đưa ra ... trừ khi STDERR đã bị đóng trước đó hoặc không thể truy cập được, trong trường hợp đó, cảnh báo được đưa ra cho tập tin được mở gần đây nhất xử lý - đây là hành vi không có giấy tờ. Tôi không chắc liệu nó sẽ được phân loại tốt hơn như là một tính năng hay một lỗi.

Ở đây, STDERRđược đóng lại và một tệp xử lý tệp mới được xác định FOOBARlà đã mở và được định tuyến đến biến $_. Điều này sau đó được phân tích cú pháp để lấy số dòng cảnh báo, được nhúng trong câu lệnh in.


3
Vâng, nó chắc chắn là thú vị hơn :)
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";
}

ví dụ sống


2
Đây là ... phù thủy
Paladine

1
Phải mất một thời gian dài để xem cách nó hoạt động. Soo nhiều cá trích đỏ! Nó ngon.
sehe

1
Vì vậy, làm thế nào nó hoạt động?
0x499602D2

16

Lua

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

16

C #

C # 5.0 [CallerLineNumber]thực hiện thủ thuật:

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

Đầu ra

Hello World, from line X!

Bất kỳ lý do cụ thể để sử dụng chữ số La Mã?
Cole Johnson

4
Khi dòng in là dòng 10, câu hỏi được hiểu theo nghĩa đen. Xbằng chữ số La Mã là 10.
ngày

Chữ số La Mã là một liên lạc tốt đẹp!
NPSF3000

15

C

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

Sử dụng các biến được xác định như LINE , mặc dù được cho phép bởi các quy tắc, không được khuyến khích.
vaxquis

@vaxquis, vâng, nhưng câu trả lời của tôi có trước khi chỉnh sửa câu hỏi
gnibbler

IMO vẫn là một giải pháp tệ hại và quá rõ ràng . Tôi đang tự hỏi tại sao mọi người đăng tất cả các loại biến thể của giải pháp này bằng tất cả các ngôn ngữ trên thế giới (bao gồm PHP, D, Perl) thay vì thậm chí cố gắng làm điều gì đó từ xa hài hước hoặc hấp dẫn?
vaxquis

14

Con trăn

Ví dụ (10 dòng, 213 ký tự):

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

Hãy thử trực tuyến tại đây . Mã và khoảng trắng thay đổi dòng chảy có thể được thêm vào và chương trình sẽ hiển thị số dòng được cập nhật, và tương tự, đoạn mã này cũng có thể được sử dụng ở bất cứ đâu trong một chương trình hiện có. Sản lượng dự kiến:

Hello World, from line 6!

Một ví dụ khác (thử trực tuyến tại đây) để cho thấy rằng nó hoạt động khi mã / khoảng trắng được thêm vào. Sản lượng dự kiến:

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

Lưu ý: Biểu thức, được đánh giá từ trong bảng điều khiển chrome dev sẽ được gói trong một withcâu lệnh. Vì vậy, chúng ta cần phải giảm một dòng nếu đó là trường hợp


2
ngăn xếp dữ liệu , hehe. Đã xác minh làm việc trên Firefox.
Đột phá

1
@BreakENC :) Có, nó hoạt động trên nhiều trình duyệt (chỉ được thử nghiệm với Chrome, FF, IE mới nhất). Chrome cần được đối xử đặc biệt khi được đánh giá từ trong bảng điều khiển, vì nó bao bọc mọi câu lệnh trong một withmệnh đề.
C5H8NNaO4

2
Tên người dùng thú vị nhưng mơ hồ. Bột ngọt, có lẽ? (BTW, tôi đang nghĩ đến việc đặt câu hỏi về DNA và axit amin, trong đó axit glutamic là một.)
Level River St

@steveverrill Theo google, bạn đã đúng !
kitcar2000

@ kitcar2000 Có lẽ. Nhưng có những hợp chất ít được biết đến khác với công thức này: chẳng hạn như natri methylaspartate hoặc nitropentanoate.
Cấp sông St

11

Con trăn 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

Xin chào thế giới, từ dòng 8!

Mã tự đọc này chứa hàm băm tự tham chiếu. Tổng SHA256 của dòng cuối cùng (với khoảng trắng bắt đầu và không có khoảng trắng ở cuối) bắt đầu bằng cc46f7... . Khi nó băm printdòng, nó thấy rằng hàm băm khớp với giá trị ma thuật mà nó đang tìm kiếm.


bạn không thể đặt line_num = thành -1 và có bản in bên ngoài vòng lặp và có được phép băm ma thuật không?
dave

1
@dave không chắc tôi theo bạn. Băm ma thuật là những gì làm cho giải pháp này thông minh.
Tim S.

+1 để giải thích theo nghĩa đen của quy tắc của tôi :) Rất thông minh.
Đột phá

5
@Stefan Trang web này là tất cả về thực hành tồi tệ nhất, mặc dù. ;)
Tim S.

1
@sehe Rất có thể, điều này là do vấn đề khoảng trắng. Tôi đã không có một dòng mới ở cuối tập tin khi tôi thực hiện nó. Tôi đã thêm một dòng để xóa khoảng trắng từ cuối dòng trước khi băm. Nó sẽ làm việc ổn định hơn bây giờ. (cũng đảm bảo rằng bạn không chuyển đổi khoảng trắng thành tab) Tôi đã thử tải nó lên ideone để hiển thị cho bạn phiên bản trực tiếp, nhưng nó không thể đọc tệp của chính nó ở đó.
Tim S.

9

GNU COBOL

Chà, họ nói không thể làm được. Thật ra, chính tôi đã nói rằng nó không thể được thực hiện. Bây giờ đã xong và một tính năng ngôn ngữ lỗi thời được triển khai lại bằng phương pháp được áp dụng.

Câu hỏi nêu:

Nếu bất kỳ khoảng trắng hoặc câu lệnh bổ sung nào (không làm gián đoạn dòng mã) được thêm vào mã nguồn, thì nó sẽ được phản ánh tại thời điểm chạy (sau khi biên dịch nếu có).

Bất kỳ số lượng các công cụ có thể được chèn trước ba DISPLAYs gây sự bắt đầu của đầu ra, và bất cứ điều gì sau khi các DISPLAYs sẽ "ngắt dòng mã", do đó của OK.

COBOL đã từng có một TRACEđộng từ (câu lệnh) chỉ liệt kê các số dòng nguồn khi chúng được thực thi (không có quyền truy cập vào số dòng trong chương trình). Mặc dù hạn chế sử dụng, tôi đã bao gồm triển khai 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
       .

Đầu ra là

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

Là một triển lãm về sức mạnh và tính linh hoạt của việc viết ngôn ngữ, ví dụ này sử dụng chữ thường, chữ thường và chữ hoa hoàn toàn cùng một lúc. Không thành vấn đề, vì khi được xử lý, mọi thứ đều được "gấp lại" thành UPPERCASE.

Cách COBOL tiêu chuẩn duy nhất để có được số dòng nguồn trong chương trình đang chạy, từ chương trình đang chạy, là với a DEBUGGING DECLARATIVE. Trong một SECTION, hoàn toàn trong một đoạn trong một SECTION, của một tuyên bố như vậy bạn có quyền truy cập vào đăng ký đặc biệt DEBUG-LINE. Điều này chứa số dòng nguồn của động từ (câu lệnh) đã gây ra sự chuyển quyền kiểm soát sang một tên thủ tục cụ thể (đoạn hoặc SECTION).

Vì vậy, với PERFORM, hoặc GO TO, hoặc "rơi qua" đoạn trong khai báo gỡ lỗi SECTIONđược thực thi.

OK, nhưng DISPLAYkhông gây ra sự chuyển giao quyền kiểm soát.

Không vấn đề gì. Đặt nó trên cùng một dòng với sự chuyển giao quyền kiểm soát.

Vấn đề, vì nếu "bất kỳ khoảng trắng hoặc câu lệnh bổ sung nào (không làm gián đoạn dòng mã) được thêm vào mã nguồn, thì nó sẽ được phản ánh vào thời gian chạy (sau khi biên dịch nếu có)".

Vì vậy, hãy đặt nó trên cùng một dòng nhưng trước khi chuyển quyền kiểm soát, hãy chia nội dung của DISPLAYhai phần (hãy nhớ, "Trong ngữ cảnh này, chúng tôi muốn số dòng đầu tiên của câu lệnh xuất ra chuỗi được hiển thị" ) và xuất phần đầu tiên trước khi chuyển quyền kiểm soát và phần thứ hai, từ DEBUG-LINE, một lần trong quy trình gỡ lỗi.

Bit khó khăn cuối cùng là cho "rơi qua" ("thủ tục" có thể được chỉnh sửa PERFORM, có thể là mục tiêu của a GO TOhoặc có thể được nhập đơn giản bằng cách là dòng tiếp theo cùng). Trong trường hợp này, đặt dòng DISPLAY trên định nghĩa thủ tục, nhưng trước định nghĩa .

Tên của "thủ tục" ( ab) đã được rút ngắn đáng kể để cho phép chúng khớp với cùng một dòng nguồn như DISPLAY. Nghiêm túc một tên thủ tục COBOL nên bắt đầu từ đâu đó từ cột tám đến cột 11. Tuy nhiên, cú pháp ngày nay, thoải mái hơn nhiều về điều đó. Trong phạm vi mà tôi có thể định nghĩa một tên thủ tục trên cùng một dòng với một số mã. Thậm chí nhúng trong mã. Chăm sóc, và thỉnh thoảng dừng lại, là bắt buộc.

Trong PROCEDURE DIVISIONmỗi điểm dừng hoàn toàn được hiển thị là bắt buộc và không còn nữa.

Để biên dịch:

cobc -x -g hiwhere.cbl

Để thực thi (linux):

COB_SET_DEBUG=Y ./hiwhere

Cuối cùng, sự trở lại của TRACE (không có 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
       .

Đầu ra là:

1
    17
2
    18
3
    19
    20

Trong đó 1, 2 và 3 là đầu ra từ ba câu lệnh HIỂN THỊ và 17, 18, 19 và 20 là số dòng của dòng "thực thi" (không gỡ lỗi).


8

Java

Sử dụng hành vi theo dõi ngăn xếp của Exception để có được dòng hiện tại. miễn là Printstatement không bị xáo trộn thành nhiều dòng hoặc classfile bị xáo trộn thì nó sẽ hoạt động

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

8

Con trăn

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

6

Perl

print 'Hello World, from line '.__LINE__.'!';

13
Đây cũng là một giải pháp PHP hợp lệ.
MrLore

6

Java

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

về mặt kỹ thuật giống như tôi đã làm ( codegolf.stackexchange.com/a/30058/10801 )
masterX244

2
Sắp xếp, ngoại trừ sử dụng Chủ đề hiện tại thay vì tạo Lỗi mới để theo dõi ngăn xếp. Không có lỗi gì cả;)
Cineris

6

Con trăn

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

Đầu ra

Hello World from line 2!

1
Python tốt nhất cho đến nay!
kirbyfan64sos

6

Befunge

Làm chỉ để cho vui.

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

Có điều kiện: trên cùng bên trái của mã phải là 0 <x <20 và 0 <= y <62; và hai ô đầu tiên phải trống.

thí dụ:

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

Sẽ xuất:

Xin chào, từ dòng 10


Không biết đây là gì, nhưng tôi tin rằng yêu cầu đầu ra của bạn, vì vậy +1 ;-)
ysap

1
Đối với những người đặt câu hỏi về sức mạnh của Befunge hùng mạnh, hãy thử tại đây: quirkster.com/iano/js/befunge.html
Justin

6

C

Bằng cách sử dụng macro matrixdic, chúng ta có thể tạo một chức năng in tự động thêm số dòng vào cuối câu lệnh printf tùy ý và luôn in ra thiết bị xuất chuẩn.

kiểm tra

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

đầu ra:

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

Lưu ý: Tôi đã lệch khỏi mẫu để chứng minh rằng printfl vẫn là một hàm matrixd hợp lệ; nếu bạn thực sự quan tâm đến định dạng của đầu ra, bạn luôn có thể thay đổi nghĩa đen mà tôi sử dụng.


Điều này chỉ hoạt động nếu bạn sử dụng một chuỗi định dạng không đổi. Không thành công nếu bạn chuyển bất kỳ biểu thức nào khác cho chuỗi định dạng.
Người tuyết

5

Bash

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

Đầu ra

Hello World, from line 4!

@professorfish ... có gì sai với phong cách MY thể hiện câu trả lời của tôi? Ít nhất bạn nên giải thích lý do tại sao bạn thao túng tác phẩm nghệ thuật của tôi ... :-P

2
Tôi đã thay đổi mã? nếu tôi đã làm, tôi xin lỗi. Tôi chỉ lo lắng rằng những người dùng không sử dụng bash sẽ không thể biết được mã nguồn là gì và đầu ra là gì

1
Và evryone khác ngoài tôi thích nhìn thấy công cụ của mình bị thay đổi mà không bình luận tại sao? Nơi kỳ lạ ...

3
Nó về cơ bản là một định dạng sửa chữa. Không có gì thực sự sai với những AFAIK

Sử dụng các biến được xác định như LINE , mặc dù được cho phép bởi các quy tắc, không được khuyến khích.
vaxquis

5

D

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

Sử dụng các biến được xác định như LINE , mặc dù được cho phép bởi các quy tắc, không được khuyến khích.
vaxquis

5

C hoặc C ++ và AWK

lineno.c:

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

Sử dụng:

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

Đầu ra:

Xin chào, Thế giới, từ dòng 3

Ghi chú:

  • Không có người dùng viết mã tìm kiếm các tập tin.
  • g ++ sẽ hoạt động trên một tập tin c ++.

4

Loại nhàm chán trong Ruby:

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

Đây không phải là gian lận, phải không?


Không, đây không phải là gian lận! Thử thách này rõ ràng sẽ dễ dàng hơn rất nhiều ở một số ngôn ngữ và khó hơn ở những ngôn ngữ khác, tuy nhiên, đó là lý do tại sao tôi đăng nó :) (Tôi hiểu tại sao việc đưa tiêu chí chấm điểm lại rất quan trọng)
Đột phá

Sử dụng các biến được xác định như LINE , mặc dù được cho phép bởi các quy tắc, không được khuyến khích.
vaxquis

1
@vaxquis Vâng, câu nói đó đã được thêm vào sau câu trả lời này.
Ajedi32

4

Javascript

Một dòng sử dụng theo dõi ngăn xếp.

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

3

Rắn hổ mang

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

3

Hồng ngọc

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

PowerShell

Di chuyển giá rẻ

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

Quyền hạn

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

Và:

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

Cả hai đều hoạt động như thế này:

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

+1, nhưng Write-Hostkhông ghi vào thiết bị xuất chuẩn. Đơn giản chỉ cần truyền chuỗi sẽ gửi nó đến thiết bị xuất chuẩn. Ví dụ:"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Rynant

@Rynant Điểm tốt! Tôi sẽ cập nhật câu trả lời của mình để xem xét điều đó ...
DarkAjax

3

Con trăn

import traceback

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

Ngắn và ngọt.


3

Perl

Một Perl khác:

use warnings;

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

$x=$x+1; print "Hello World, form line $line!\n";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.