เขียนชิ้นส่วนของรหัสเพื่อส่งออกหมายเลขบรรทัดของคำสั่งพิมพ์ / ส่งออกเอง (ในรูปแบบ“ Hello World, จากบรรทัด X!”)


25

ความท้าทาย

เขียนโปรแกรมที่แสดงผลHello World, from line X!ซึ่งXเป็นหมายเลขบรรทัดในซอร์สโค้ดของคำสั่งพิมพ์จริง

กฎระเบียบ

  • ในบริบทนี้เราต้องการแรกหมายเลขบรรทัดของคำสั่งที่ออกผลลัพธ์สตริงที่จะแสดงให้stdout
  • คุณควรหลีกเลี่ยงการค้นหาจากซอร์สโค้ดของคุณเป็นสตริง (ทั้งไฟล์หรือควินิน) เพื่อค้นหาหมายเลขบรรทัด
  • หากมีการเพิ่มช่องว่างหรือคำสั่งเพิ่มเติมใด ๆ(ซึ่งไม่ได้ขัดขวางการไหลของรหัส) จะถูกเพิ่มลงในซอร์สโค้ดมันควรจะสะท้อนให้เห็นในเวลาทำงาน (หลังจากรวบรวมถ้ามี)

ข้อเสนอแนะ

หากให้บริการโดยภาษาคุณอาจใช้การยกเว้น / ติดตามสแต็คเพื่อให้บรรลุเป้าหมายนี้ ลองใช้รหัสที่พกพาได้ดีที่สุดในระบบ / การใช้งานที่แตกต่างกัน แต่โปรดทราบว่านี่ไม่ใช่ข้อกำหนด การใช้ตัวแปรที่กำหนดเช่น__LINE__ถึงแม้จะได้รับอนุญาตจากกฎแล้วก็ตาม

ผู้ชนะ

  • นี่คือการประกวดความนิยม (สิ้นสุดวันที่ 10 มิถุนายน 2014) ซึ่งคำตอบที่ได้รับคะแนนสูงสุดจากชุมชนจะได้รับการประกาศว่าเป็นผู้ชนะโดยพิจารณาจากคะแนนปัจจุบันในขณะนั้น

  • เมื่อลงคะแนนโปรดพิจารณาความคิดสร้างสรรค์ของคำตอบของใครบางคนละเอียดหรือน่าสนใจแค่ไหน และความยากลำบาก / ข้อ จำกัด ของภาษาการเขียนโปรแกรมที่ใช้


คุณหมายถึงอะไรโดย "หมายเลขบรรทัดแรก"? คุณกำลังพูดถึงสิ่งที่จะเกิดขึ้นหากคำสั่งมีหลายบรรทัด?
user2357112 รองรับ Monica

@ user2357112 ใช่เพียงเพื่อแก้ไขความคลุมเครือใด ๆ หากใครก็ตามจำเป็นต้องใช้คำสั่ง milti-line
พัฒนา

ชื่อเป็นที่ชัดเจนมาก แต่อาจจะยาวสักหน่อย
พรีโม่

1
คำตอบนี้มีทั้งหมดน่าเบื่อเพราะมันเป็นเช่นคำถามที่ไม่ดี มันก็เหมือนถามไม่ทราบถึงการดำรงอยู่ของสาย ในความเป็นจริงผมเซ็นสัญญาขึ้นมาโดยเฉพาะเพื่อลงคะแนนเสียงนี้ผมคิดว่ามันแย่มาก
dave

1
@ Markasoftware หากมีการเพิ่มบรรทัดก่อนหน้าเอาต์พุตจะไม่เปลี่ยนแปลงเพื่อสะท้อนว่า
พรีโม่

คำตอบ:


48

ซินแคลร์ขั้นพื้นฐาน

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

สวัสดีชาวโลกจากสาย 10!

วิธีนี้จะใช้ได้กับทุกบรรทัดโดยPEEKที่ที่อยู่ซึ่งเก็บหมายเลขบรรทัดปัจจุบันดังนั้นสิ่งต่อไปนี้จะใช้ได้เช่นกัน:

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

สวัสดีชาวโลกจากสาย 341!


และในทำนองเดียวกัน Timex / ซินแคล BASIC!
เกบ

ฉันไม่ได้แกล้งรู้ภาษานี้ แต่คุณไม่สามารถละทิ้งSTR$ถ้าคุณเปลี่ยน+เครื่องหมายด้วยเครื่องหมายอัฒภาค?
นาย Lister

@MrLister ใช่ว่าจะทำงานได้แน่นอน แต่ฉันมักจะใช้+นิสัย
kitcar2000

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
Bill Woodger

30
มันอาจจะเป็นบรรทัดแรกในรหัสที่มา แต่ก็ยังคงสาย 10
ossifrage คลื่นไส้

13
ฉันเชื่อว่าสิ่งนี้จะอยู่ในหมวดหมู่ที่ไม่ตลกอีกต่อไป เป็นเรื่องที่ไม่น่าเชื่อและไม่สนใจจริงๆแม้ว่ามันจะเป็นไปตามข้อกำหนด ทำไมถึงมี upvotes มากมาย? (ฉันลงคะแนนแล้ว)
ทิม S.

18
นี่เป็นคำตอบที่ยอดเยี่ยมเพราะใช้ประโยชน์จากแง่มุมที่แปลกประหลาดของภาษาเบสิกซึ่งไม่พบในภาษาอื่น (โดยเฉพาะอย่างยิ่งภาษาสมัยใหม่) อาจไม่เป็นที่นิยมมากที่สุด (เวลาจะบอก) แต่ฉันแทบจะไม่สามารถดูว่ามันน่าสนใจน้อยกว่าการใช้ค่าคงที่เช่น __LINE__ หรือรับข้อมูลการแก้ไขข้อบกพร่องจากกรอบสแต็กปัจจุบัน
Nick

2
ฉลาด แต่ฉันจะผิดหวังถ้าไม่มีอะไรจบลงด้วย upvotes มากกว่าอันนี้
agweber

35

ชวา

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()
Cruncher

3
Thread.getStackTrace () เรียก (ยกเว้นใหม่ ()) getStackTrace () ถ้าเรียกเธรดปัจจุบันจึงเป็นสิ่งเดียวกัน.
DHall

1
แปลก .... 2x คำตอบเดียวกันและ 2 จำนวน upvote แตกต่างกัน ... (สามารถนำมาใช้เป็นแหล่ง RNG ... ) (เหมือนกับที่นี่: codegolf.stackexchange.com/a/30058/10801 )
masterX244

@ masterX244 ทั้งสองคำตอบไม่ได้ว่าเหมือนกัน; วิธีนี้ใช้getLineNumber()เมธอดบนการติดตามสแต็กในขณะที่คำตอบที่คุณเชื่อมโยงเพื่อใช้toString()ในการค้นหาหมายเลขบรรทัด
พัฒนา

9
@ masterX244 เป็นที่น่าสังเกตว่าคำตอบนี้ปรากฏขึ้น 2 ชั่วโมงก่อนหน้านี้ ครั้งที่สองที่ฉันเห็นคำตอบมันไม่น่าสนใจเท่าครั้งแรก
โม่

30

Perl

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


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

ไม่สั้นอย่างที่ใช้__LINE__แต่อาจน่าสนใจกว่า

warnเป็นเครื่องมือดีบั๊กซึ่งจะออกคำสั่งSTDERRระบุว่าไฟล์ใดและบรรทัดใดที่คำเตือนออก ... เว้นแต่จะ STDERRได้ปิดไปก่อนหน้านี้หรือไม่สามารถเข้าถึงได้เป็นอย่างอื่นในกรณีนี้คำเตือนจะถูกส่งไปยังไฟล์ที่เปิดล่าสุด จัดการ - นี่คือพฤติกรรมที่ไม่มีเอกสาร ฉันไม่แน่ใจว่ามันจะถูกจัดเป็นคุณลักษณะหรือข้อผิดพลาดที่ดีกว่า

ที่นี่STDERRจะปิดและจัดการไฟล์ใหม่ระบุว่ามีการเปิดและส่งไปยังตัวแปรFOOBAR $_นี่คือการแยกวิเคราะห์เพื่อดึงหมายเลขบรรทัดของคำเตือนซึ่งฝังอยู่ในคำสั่งพิมพ์


3
ใช่มันแน่นอนเป็นที่น่าสนใจมากขึ้น :)
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";
}

ตัวอย่างสด


2
นี่คือ ...
พ่อมดแม่มด

1
ฉันใช้เวลานานพอสมควรแล้วที่จะเห็นว่ามันทำงานอย่างไร ซู herrings สีแดงมากมาย! มันอร่อย.
sehe

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!

มีเหตุผลใดที่จะใช้ตัวเลขโรมัน?
โคลจอห์นสัน

4
เมื่อบรรทัดการพิมพ์คือบรรทัดที่ 10 คำถามจะถูกตีความอย่างแท้จริง ในเลขโรมันเป็นX 10
Junurous

ตัวเลขโรมันเป็นสัมผัสที่ดี!
NPSF3000

15

C

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

การใช้ตัวแปรที่กำหนดไว้เช่นLINEแม้ว่าจะไม่ได้รับอนุญาตจากกฎ
vaxquis

@vaxquis ใช่ แต่ถือกำเนิดคำตอบของฉันที่จะแก้ไขคำถาม
gnibbler

มันยังคงเป็นโซลูชั่น IMO ที่น่ารังเกียจและชัดเจนเกินไป ฉันสงสัยว่าทำไมผู้คนโพสต์รูปแบบต่าง ๆ ของโซลูชันนี้ในทุกภาษาของโลก (รวมถึง PHP, D, Perl) แทนที่จะพยายามทำสิ่งที่ตลกหรือน่าสนใจจากระยะไกล
vaxquis

14

หลาม

ตัวอย่าง (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

จาวาสคริ

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

หมายเหตุ: นิพจน์ที่ประเมินจากภายในคอนโซล dev ของ Chrome จะถูกรวมอยู่ในwithคำสั่ง ดังนั้นเราจำเป็นต้องลดหนึ่งบรรทัดลงถ้าเป็นกรณีนี้


2
สแต็ก dat , ฮิฮิ ยืนยันว่าทำงานกับ Firefox
Breakthrough

1
@Breakthrough :) ใช่มันใช้งานได้กับเบราว์เซอร์ (ทดสอบเฉพาะกับ Chrome, FF, IE ล่าสุด) Chrome ต้องการการดูแลเป็นพิเศษเมื่อประเมินจากภายในคอนโซลเนื่องจากมันwithครอบคลุมทุกข้อความในประโยค
C5H8NNaO4

2
ชื่อผู้ใช้ที่น่าสนใจ แต่ไม่ชัดเจน โมโนโซเดียมกลูตาเมต (BTW ฉันกำลังคิดทำคำถามเกี่ยวกับ DNA และกรดอะมิโนซึ่งกรดกลูตามิกเป็นหนึ่งเดียว)
Level River St

@steveverrill ตาม google คุณถูกต้อง !
kitcar2000

@ kitcar2000 น่าจะเป็น แต่มีสารประกอบอื่น ๆ ที่ไม่ค่อยมีคนรู้จักด้วยสูตรนี้: Sodium methylaspartate หรือ nitropentanoate เป็นต้น
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

สวัสดีชาวโลกจากสาย 8!

รหัสการอ่านตัวเองนี้ประกอบด้วยแฮชการอ้างอิงตนเอง ผลรวมของ SHA256 บรรทัดสุดท้าย (ที่มีช่องว่างจุดเริ่มต้นและไม่มีช่องว่างต่อท้าย) เริ่มต้นด้วย cc46f7...เมื่อมันแฮชprintบรรทัดมันจะพบว่าแฮชตรงกับค่าเวทย์มนตร์ที่มันกำลังค้นหา


คุณไม่สามารถตั้งค่า line_num = เป็น -1 และมีการพิมพ์นอกลูปและขี่แฮชวิเศษได้หรือไม่
dave

1
@ ไม่แน่ใจว่าฉันติดตามคุณ แฮชเวทย์คือสิ่งที่ทำให้โซลูชันนี้ฉลาดขึ้น
ทิมเอส.

+1 สำหรับการตีความกฎของฉันตามตัวอักษร :) ฉลาดมาก
พัฒนา

5
@Stefan เว็บไซต์นี้มีเนื้อหาเกี่ยวกับการปฏิบัติที่เลวร้ายที่สุด ;)
Tim S.

1
@sehe เป็นไปได้มากว่านี่เป็นเพราะปัญหาช่องว่าง ฉันไม่ได้ขึ้นบรรทัดใหม่ตอนท้ายไฟล์เมื่อสร้างมัน ฉันได้เพิ่มบรรทัดเพื่อตัด whitespace จากจุดสิ้นสุดของบรรทัดก่อนที่จะ hashing มันควรจะทำงานอย่างต่อเนื่องในขณะนี้ (ตรวจสอบให้แน่ใจว่าคุณไม่ได้แปลงช่องว่างเป็นแท็บ) ฉันลองอัปโหลดเป็น ideone เพื่อแสดงเวอร์ชันสด แต่คุณไม่สามารถอ่านไฟล์ของตัวเองได้ที่นั่น
ทิมเอส.

9

GNU COBOL

พวกเขาบอกว่ามันทำไม่ได้ ที่จริงแล้วฉันเป็นคนพูดว่าทำไม่ได้ ตอนนี้ก็เสร็จสิ้นแล้วและมีการใช้ภาษาที่ล้าสมัยอีกครั้งโดยใช้วิธีการที่ใช้

คำถามระบุ:

หากมีการเพิ่มช่องว่างหรือคำสั่งเพิ่มเติมใด ๆ (ซึ่งไม่ได้ขัดขวางการไหลของรหัส) จะถูกเพิ่มลงในซอร์สโค้ดมันควรจะสะท้อนให้เห็นในเวลาทำงาน

จำนวนของสิ่งใด ๆ ที่สามารถแทรกก่อนที่จะมีสามDISPLAYs ซึ่งเป็นสาเหตุของการเริ่มต้นของการส่งออกและสิ่งหลังจากDISPLAY 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!

ในฐานะที่เป็นนิทรรศการของพลังและความยืดหยุ่นในการเขียนภาษาตัวอย่างนี้ใช้ตัวพิมพ์เล็กตัวพิมพ์เล็กทั้งหมดและตัวพิมพ์ใหญ่ทั้งหมดในเวลาเดียวกัน มันไม่สำคัญว่าเมื่อประมวลผลแล้วทุกอย่างจะ "ถูกพับ" เป็น UPPERCASE

วิธี COBOL DEBUGGING DECLARATIVEมาตรฐานเท่านั้นที่จะได้รับเป็นแหล่งบรรทัดจำนวนในโปรแกรมที่ทำงานจากโปรแกรมทำงานอยู่กับ ภายในSECTIONอย่างเคร่งครัดภายในวรรคภายในเป็นของที่ดังกล่าวเปิดเผยคุณมีการเข้าถึงพิเศษลงทะเบียนSECTION DEBUG-LINEสิ่งนี้มีหมายเลขบรรทัดแหล่งที่มาของคำกริยา (คำสั่ง) ซึ่งทำให้เกิดการถ่ายโอนการควบคุมไปยังชื่อกระบวนงานเฉพาะ (ย่อหน้าหรือSECTION)

ดังนั้นด้วยPERFORM, หรือGO TO, หรือ "ตกลงมา" ย่อหน้าในการประกาศการดีบักSECTIONจะถูกดำเนินการ

ตกลง แต่DISPLAYไม่ทำให้การถ่ายโอนการควบคุม

ไม่มีปัญหา. วางไว้ในบรรทัดเดียวกับการถ่ายโอนการควบคุม

ปัญหาเนื่องจากหาก "เพิ่มช่องว่างหรือคำสั่งเพิ่มเติมใด ๆ (ซึ่งไม่ขัดจังหวะการไหลของรหัส) จะถูกเพิ่มลงในซอร์สโค้ดจึงควรมีผลในเวลาทำงาน (หลังจากรวบรวมถ้ามี)"

ดังนั้นวางไว้บนบรรทัดเดียวกันแต่หน้าการถ่ายโอนการควบคุมแยกเนื้อหาของDISPLAYเป็นสองชิ้น (จำไว้ว่า "ในบริบทนี้เราต้องการหมายเลขบรรทัดแรกของคำสั่งที่แสดงสตริงที่จะแสดง" ) และเอาท์พุทส่วนแรกก่อนที่จะมีการถ่ายโอนการควบคุมและส่วนที่สองจากDEBUG-LINEภายในเมื่อขั้นตอนการดีบัก

บิตสุดท้ายที่ยุ่งยากสำหรับ "fall through" ("โพรซีเดอร์" สามารถเป็นPERFORMed สามารถเป็นเป้าหมายของ a GO TOหรือสามารถป้อนได้ง่าย ๆ โดยการขึ้นบรรทัดถัดไป) ในกรณีนี้วางDISPLAY อยู่บนเส้นซึ่งได้กำหนดขั้นตอน แต่ในด้านหน้าของคำนิยาม

ชื่อของ "วิธีการ" ( aและb) DISPLAYได้รับการสั้นลงอย่างรุนแรงเพื่อให้พวกเขาเพื่อให้พอดีกับที่เดียวกันแหล่งที่มาสายเป็น อย่างเคร่งครัดขั้นตอนชื่อโคบอลควรเริ่มต้นที่ไหนสักแห่งจากคอลัมน์ที่แปดถึงคอลัมน์ที่ 11 อย่างไรก็ตามไวยากรณ์คือวันนี้ผ่อนคลายมากขึ้นเกี่ยวกับที่ ในขอบเขตที่ฉันสามารถกำหนดชื่อขั้นตอนในบรรทัดเดียวกันเป็นรหัสบางส่วน ฝังอยู่ในรหัส การดูแลและเป็นครั้งคราวเต็มหยุดจะต้อง

ในการPROCEDURE DIVISIONหยุดเต็มรูปแบบที่แสดงจำเป็นต้องมีและไม่มีอีกต่อไป

เพื่อรวบรวม:

cobc -x -g hiwhere.cbl

ในการดำเนินการ (linux):

COB_SET_DEBUG=Y ./hiwhere

ในที่สุดการกลับมาของ TRACE (โดยไม่พร้อม / 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 เป็นเอาต์พุตจากคำสั่ง DISPLAY สามรายการและ 17, 18, 19 และ 20 เป็นหมายเลขบรรทัดของบรรทัด "ปฏิบัติการ" (ไม่ใช่การดีบัก)


8

ชวา

การใช้ลักษณะการทำงานของการติดตามสแต็กของข้อยกเว้นเพื่อรับบรรทัดปัจจุบัน ตราบใดที่ Printstatement ไม่ได้ถูกรวมเป็นหลายบรรทัดหรือ classfile ได้รับการจัดการมันควรจะทำงานได้

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



6

ชวา

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
เรียงลำดับของยกเว้นการใช้เธรดปัจจุบันแทนที่จะสร้างข้อผิดพลาดใหม่เพื่อรับการติดตามสแต็ก ไม่มีข้อผิดพลาดใด ๆ )
Cineris

6

หลาม

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

เอาท์พุต

Hello World from line 2!

1
Python ที่ดีที่สุดจนถึงตอนนี้!
kirbyfan64sos

6

Befunge

ทำเพื่อความสนุก

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

เงื่อนไข: รหัสด้านบนซ้ายจะต้องเป็น 0 <x <20 และ 0 <= y <62; และเซลล์แรกที่สองต้องว่างเปล่า

ตัวอย่าง:

                         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

1
สำหรับผู้ที่ตั้งคำถามเกี่ยวกับพลังของ Befunge อันยิ่งใหญ่ลองที่นี่: quirkster.com/iano/js/befunge.html
Justin

6

C

ด้วยการใช้มาโครแบบ variadic เราสามารถสร้างฟังก์ชั่นการพิมพ์ซึ่งจะเพิ่มหมายเลขบรรทัดไปยังส่วนท้ายของคำสั่ง printf โดยพลการและพิมพ์ไปที่ 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;
}

เอาท์พุท:

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

หมายเหตุ: ฉันเบี่ยงเบนจากรูปแบบเพื่อแสดงให้เห็นว่า printfl ยังคงเป็นฟังก์ชัน Variadic ที่ถูกต้อง ถ้าคุณจริงๆดูแลเกี่ยวกับรูปแบบของการส่งออกคุณก็สามารถเปลี่ยนอักษรที่ผมใช้


ใช้งานได้เฉพาะถ้าคุณใช้สตริงรูปแบบคงที่ มันจะล้มเหลวถ้าคุณผ่านในการแสดงออกอื่น ๆ สำหรับสตริงรูปแบบ
Snowbody

5

ทุบตี

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

เอาท์พุต

Hello World, from line 4!

@professorfish ... สไตล์ของฉันผิดไปแสดงคำตอบของฉันคืออะไร? อย่างน้อยคุณควรอธิบายว่าทำไมคุณจัดการงานศิลปะของฉัน ... :-P

2
ฉันเปลี่ยนรหัสหรือไม่ ถ้าฉันทำฉันขอโทษ ฉันแค่กังวลว่าผู้ใช้ที่ไม่ทุบตีจะไม่สามารถบอกได้ว่าซอร์สโค้ดคืออะไรและอะไรคือผลลัพธ์

1
และ evryone อื่นนอกเหนือจากฉันชอบที่จะเห็นการเปลี่ยนแปลงของเขาโดยไม่แสดงความเห็นว่าทำไม? สถานที่แปลก ๆ ...

3
มันเป็นพื้นแก้ไขการจัดรูปแบบ ไม่มีอะไรผิดปกติกับ AFAIK เหล่านั้น

การใช้ตัวแปรที่กำหนดไว้เช่นLINEแม้ว่าจะไม่ได้รับอนุญาตจากกฎ
vaxquis

5

D

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

การใช้ตัวแปรที่กำหนดไว้เช่นLINEแม้ว่าจะไม่ได้รับอนุญาตจากกฎ
vaxquis

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

เอาท์พุท:

สวัสดีโลกจากบรรทัด 3

หมายเหตุ:

  • ไม่มีรหัสที่ผู้ใช้เขียนค้นหาไฟล์
  • g ++ จะทำงานกับไฟล์ c ++

4

น่าเบื่อในประเภททับทิม:

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

นี่ไม่ใช่การโกงใช่มั้ย


ไม่นี่ไม่ใช่การโกง! เห็นได้ชัดว่าความท้าทายนี้จะง่ายขึ้นมากในบางภาษาและยากกว่าในภาษาอื่นซึ่งเป็นสาเหตุที่ฉันโพสต์ :) (ฉันเห็นแล้วว่าทำไมการรวมเกณฑ์การให้คะแนนจึงสำคัญมาก)
Breakthrough

การใช้ตัวแปรที่กำหนดไว้เช่นLINEแม้ว่าจะไม่ได้รับอนุญาตจากกฎ
vaxquis

1
@vaxquis ใช่แล้วข้อความนั้นถูกเพิ่มเข้ามาหลังจากคำตอบนี้
Ajedi32

4

จาวาสคริ

หนึ่งบรรทัดโดยใช้การติดตามสแต็ก

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


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

PowerShell

ราคาถูกย้าย

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

Powershell

$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 เพียงแค่ส่งสตริงจะส่งไปยัง stdout เช่น"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Rynant

@ เรนท์จุดดี! ฉันจะปรับปรุงคำตอบของฉันจะต้องพิจารณาว่า ...
DarkAjax


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.