การลบบรรทัดว่างในซอร์สโค้ดซึ่งทำให้เกิดการทำงานที่ไม่คาดคิด [ปิด]


38

เขียนสคริปต์ที่ทำงานได้ดีเมื่อมีบรรทัดว่างอยู่ในโฟลว์ของโปรแกรมลอจิก แต่จะแบ่งหรือทำให้เกิดพฤติกรรมที่ไม่คาดคิดเมื่อลบบรรทัดนั้น

หลีกเลี่ยงช่องโหว่มาตรฐานและคำตอบที่โง่ โปรแกรมของคุณควรทำบางสิ่งที่ "มีประโยชน์" แม้ว่ามันจะเพิ่มจำนวนเต็มเล็กน้อยก็ตาม

การลบบรรทัดว่างออกจากสตริงหลายบรรทัดจะไม่นับรวมยกเว้นผลลัพธ์ที่คาดไว้จากสตริงหลายบรรทัดนั้นไม่ควรเปลี่ยนแปลงทางเทคนิค (เช่น: หากคุณกำลังลบการจับคู่บรรทัดว่างทั้งหมด^$)

นักเล่นแร่แปรธาตุไม่อนุญาตเช่นกัน อย่าทำสิ่งแปลก ๆ กับ carriage return, tabs, ช่องว่าง ฯลฯ


11
ฉันคิดว่าคุณควรยกเว้น Whitespace
nneonneo

17
ฉันคิดว่า Whitespace เป็น " ช่องโหว่มาตรฐาน "
core1024

5
nneonneo กำลังพูดถึงWhitespaceซึ่งเป็นภาษาที่ใช้ช่องว่างเป็นไวยากรณ์เท่านั้น
Kyle Kanos

4
"ฟังก์ชั่นที่ไม่คาดคิด" เป็นวลีที่ดีมาก
Kaz

3
ฉันลงคะแนนให้ปิดคำถามนี้เป็นหัวข้อนอกเพราะความท้าทายที่ไม่ได้อยู่ในหัวข้อบนเว็บไซต์นี้อีกต่อไป meta.codegolf.stackexchange.com/a/8326/20469
cat

คำตอบ:


62

จาวาสคริ

เปิดป๊อปอัปการแจ้งเตือนด้วย "Hello, World!" หากมีบรรทัดว่างอยู่มิฉะนั้นจะแจ้งเตือน "0"

(function(){
    alert(~(arguments.callee+[]).indexOf('\n\n') && "Hello, World!");

})();

การสาธิต

คำอธิบาย:

arguments.callee เป็นการอ้างอิงถึงฟังก์ชั่นที่ไม่ระบุชื่อที่ดำเนินการเอง

การต่อท้ายอาร์เรย์ว่างเปล่า ( []) จะใช้ฟังก์ชันกับสตริงซึ่งจะให้ซอร์สโค้ดแก่คุณ

indexOfส่งคืน-1ถ้าไม่พบสตริง

การดำเนินการ bitwise not operation ( ~) ส่งผลให้เกิด-1การเปลี่ยนเป็น0ค่าเท็จ


2
นี่มันช่างอุบายอะไรเหรอ!
Kroltan

1
arguments.calleeมีแหล่งที่มาของฟังก์ชั่น
แมทธิว

2
โปรดทราบว่านี่จะไม่ทำงานในโหมดเข้มงวดอีกต่อไป (ซึ่งโค้ดที่ทันสมัยที่สุดจะใช้) arguments.calleeโหมดเข้มงวดห้ามการใช้งานของ
Daniel Lo Nigro

1
@Michael: ไม่ข้อมูลจำเพาะไม่ได้เกี่ยวกับรูปแบบที่แน่นอน ในความเป็นจริงมีเครื่องยนต์ทำงานอยู่รอบ ๆ ที่ไม่ได้รักษาช่องว่าง
Bergi

2
@DanielLoNigro คุณสามารถตั้งชื่อให้กับนิพจน์ฟังก์ชันและใช้แทนarguments.calleeได้ ยิ่งทำให้สั้นลง
แมว

42

C

โปรแกรมมายากล 8 ลูกนี้จะยังคงทำงานโดยไม่มีบรรทัดว่าง แต่มันจะแตกต่างกันเล็กน้อย - ไม่มีคำตอบที่เป็นกลางใด ๆ ที่จะปรากฏในผลลัพธ์

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
  int x, t;
  char *quotes[] = {
        // Positive :-)
        "It is certain", "It is decidedly so", "Without a doubt", "Yes definitely", "You may rely on it",
        "As I see it, yes", "Most likely", "Outlook good", "Yes", "Signs point to yes",
        // Indifferent :-\

        "Reply hazy try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
        // Negative :-(
        "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful" };
  srandom(time(NULL)); // Initialize random number generator
  x = random() % (sizeof(quotes) / sizeof(char*)); // Choose a random outcome
  printf("The Magic Eight Ball says...\n%s\n",quotes[x]);
  return 0;
}

คำอธิบาย

เมื่อ C parser เห็นแบ็กสแลชตามด้วยอักขระขึ้นบรรทัดใหม่มันจะละเว้นทั้งสองและปฏิบัติต่อบรรทัดที่สองเป็นการดำเนินการต่อเนื่องของบรรทัดแรก หากไม่มีบรรทัดว่างคำตอบ "ไม่แยแส" จะถือว่าเป็นส่วนหนึ่งของความคิดเห็นก่อนหน้า


51
ฉัน +1 แต่การเห็นความคิดเห็น C ที่ลงท้ายด้วยแบ็กสแลชเริ่มกลายเป็นช่องโหว่มาตรฐาน IMO
Tim S.

2
มันเป็นการอ้างอิงถึงโพสต์ "ช่องโหว่มาตรฐาน"ดังนั้นอาจไม่ใช่ "ช่องโหว่" อย่างแท้จริง
ทิมเอส.

5
@TimS หากคุณเบื่อกับ "วิธีแก้ปัญหา" นี้ทำไมคุณถึงโหวตขึ้น
John Dvorak

8
backslash-the-next-line-in-a-comment คำตอบ (trigraph หรือไม่มี trigraph) ทำให้ฉันหวังว่าฉันมี 125 ชื่อเสียง ฉันเห็นพวกเขาเรื่อย ๆ และพวกเขาก็เริ่มจะซ้ำซากอย่างสิ้นเชิงดูทะลุผ่านและไม่ฉลาดหรือตลกอีกต่อไป (ซึ่งเป็นโชคร้ายสำหรับผู้ที่ใช้พวกเขาเช่นคลื่นไส้ที่นี่เพราะพวกเขาไม่ได้รับความเดือดดาลและบางครั้งก็ไม่รู้ถึงสิ่งนี้ - แต่เคล็ดลับคือการหามัน)
doppelgreener

4
@Jan เริ่มที่จะกลายเป็นมาตรฐานไม่เหมือนกับ long-standard / overdone ... การใช้มันค่อนข้างฉลาดที่นี่มันไม่ได้ดูนอกสถานที่ (ต่างจากบางอย่างที่ฉันเคยเห็นซึ่งลึกลับมีตัวละครที่ จุดสิ้นสุดของความคิดเห็นหรือสิ้นสุดความคิดเห็นด้วยอักขระการเริ่มต้นข้อคิดเห็นเพื่อทำสิ่งที่ผิดปกติ ดังนั้น: ฉันโหวตโซลูชันไม่ใช้เคล็ดลับต่อไป
ทิมเอส.

37

Befunge-93

v
&
&
+
#

.
@

โปรแกรม befunge ครั้งแรกของฉัน :)

มันอ่านตัวเลขสองตัวจากอินพุตและพิมพ์ผลรวมของพวกเขา หากคุณลบบรรทัดว่างเปล่ามันจะไม่พิมพ์อะไรเลย

คำอธิบาย:

vกำหนดทิศทางลงสำหรับการดำเนินการ
&อ่านจำนวนเต็ม
+เพิ่มตัวเลขด้วยกัน
#ข้ามคำสั่งต่อไป
.พิมพ์จำนวนเต็มจากสแต็ก
@จบโปรแกรม

ในฐานะที่เป็นลายลักษณ์อักษร#ข้ามเหนือเส้นที่ว่างเปล่าและ contines .กับ ซื้อเมื่อคุณลบบรรทัดว่าง.จะถูกข้าม

ดูเหมือนว่าจะเป็นล่ามที่ดีที่http://befunge.aurlien.net/


อาหนึ่งฉลาด
Seequ

1
Befunge 98 ก็ทำเช่นนี้ ความคิดที่ดี. และล่ามนี้มีประโยชน์บางอย่าง (ฉันไม่ได้ใช้ของคุณมากนักดังนั้นฉันไม่รู้ถึงประโยชน์ของมัน)
Justin

32

ทับทิม / เชลล์

​​​​​​
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#!   The Amazing Integer Adder             !
#! Adds 1 and 1, and displays the result   !
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

p 1+1

ทำงานได้ดีหากบรรทัดใหม่อยู่ที่ด้านบนมิฉะนั้นบรรทัดความคิดเห็นแรกจะถูกตีความโดยเชลล์ว่าเป็น Shebang ที่มีรูปแบบไม่ถูกต้อง


3
สิ่งนี้จะไม่ทำงานหรือไม่ได้เสมอ? ตัวอย่างเช่นถ้าคุณวิ่งตามruby youranswer.rbนั้นมันจะไม่มองหา Shebang เพราะมันถูกใช้งานในล่ามทับทิมอยู่แล้ว แต่ถ้าคุณวิ่งตามที่./youranswer.rbมันจะไม่วิ่งเลยเพราะไม่มี Shebang ..
Reinstate Monica

6
อย่างน้อยกับ ruby ​​ของฉัน shebang ก็เป็นเกียรติแม้ว่าคุณจะเรียกใช้เป็นruby youranswer.rbซึ่งจะเป็นประโยชน์ในการตั้งสวิตช์บรรทัดคำสั่งที่จำเป็นในไฟล์ ดังนั้นหากไม่มีบรรทัดใหม่ฉันจะได้รับruby: no Ruby script found in input (LoadError)
ชำนาญการ

29

สกาล่า

case class IntWrapper(i: Int)

{
  val answer = (IntWrapper(0) /: (1 to 100)){(x, y) => IntWrapper(x.i + y)} // Add up ints
  println(s"Sum of wrapped integers is $answer")
}

หากคุณลบบรรทัดว่างเปล่าจะไม่มีการพิมพ์ผลลัพธ์ สิ่งใดที่ดีที่สุดเพราะสแต็คของคุณจะล้นหากคุณเรียกจริงIntWrapper

นี่เป็นกรณีมุมของการอนุมานอัฒภาคของ Scala โดยปกติแล้วการขึ้นบรรทัดใหม่จะมีเครื่องหมายอัฒภาคเมื่อใดก็ตามที่โค้ดผลลัพธ์จะใช้ได้ อย่างไรก็ตาม Scala devs ไม่ต้องการบังคับให้ผู้คนใช้วงเล็บอียิปต์ดังนั้นจึงสามารถใส่วงเล็บสำหรับคำจำกัดความของคลาสบนบรรทัดได้ทันทีหลังจาก - ไม่มีการเพิ่มเครื่องหมายอัฒภาคแม้ว่าจะมี อย่างไรก็ตามบรรทัดว่างจะแบ่งวงเล็บออกจากคำจำกัดความของคลาส เมื่อลบบรรทัดว่างออกแล้วโค้ดจะเปลี่ยนจากการนิยามคลาสและบล็อกไปเป็นนิยามคลาสด้วยคอนสตรัคเตอร์ - และคอนสตรัคแบบเรียกซ้ำที่นั้น!


6
เป็นคนดีมากที่จะไม่บังคับชาวอียิปต์ แต่อัฒภาคอัฒภาคเป็นความคิดที่ไม่ดีในความคิดของฉัน
Almo

การอนุมานอัฒภาคได้รับชื่อที่ไม่ดีส่วนใหญ่มาจาก JavaScript มันค่อนข้างเจ็บปวดน้อยกว่าถ้าคุณออกแบบภาษาโดยคำนึงถึงมัน (ไม่มีใครบ่นเกี่ยวกับมันใน Python ตัวอย่าง) น่าเสียดายที่สกาล่ามีคุณสมบัติสองอย่างที่ไม่เล่นได้ดีเมื่อใช้การอนุมานอัฒภาค มีสิ่งนี้และตัวดำเนินการ postfix (ซึ่งฉันถูกล่อลวงให้ใช้ในคำตอบของฉัน แต่มันก็ดีกว่าหน่อย)
James_pic

2
@James_pic: AFAIK ไม่มีใครบ่นเกี่ยวกับเรื่องนี้ใน Python เพราะมันไม่มีอยู่ใน Python ใน JS เครื่องหมายอัฒภาคเป็นส่วนที่จำเป็นของไวยากรณ์และสามารถแทรก (อนุมาน) ที่จุดที่แน่นอน ใน Python อัฒภาคไม่ใช่ส่วนที่จำเป็นของไวยากรณ์ แต่สามารถใช้เป็นทางเลือกได้ นั่นเป็นความแตกต่างใหญ่
Mason Wheeler

อาจดูเหมือนแตกต่างกันมาก แต่ถ้า Scala ลบคุณลักษณะบางอย่างออกซึ่งทำให้ขอบเขตของคำสั่งไม่ชัดเจนมันจะย้ายจากด้านข้างของ JavaScript ของรั้วไปยัง Python
James_pic

1
@James_pic: สิ่งที่ทำให้ python แตกต่างกันคือมีบรรทัดใหม่ที่ยกเลิกคำสั่งยกเว้นว่ามีการหลบหนีหรืออยู่ในวงเล็บเหลี่ยมใด ๆ นั่นคือไม่มีกฎสมบูรณ์ / ไม่สมบูรณ์
Jan Hudec

27

GolfScript

~{.@\%:

}do;

คำนวณ GCD ของจำนวนเต็มสองจำนวนที่ไม่เป็นศูนย์ การลบบรรทัดว่างจะทำให้โปรแกรมแตก

ลองออนไลน์

มันทำงานอย่างไร

นี่คือการนำ GolfScript มาใช้ของอัลกอริทึมแบบยุคลิด:

      # STACK: "15 24"
~     # Interpret the input string.
{     # STACK: 15 24
  .@  # Duplicate the topmost integer and rotate the other on top of both copies.
      # STACK: 24 24 15
  \   # Swap the topmost integers.
      # STACK: 24 15 24
  %   # Calculate the modulus.
      # STACK: 24 15
}do   # If the modulus is non-zero, repeat the loop.
;     # Discard the last modulus.

มีปัญหาเล็ก ๆ เพียงปัญหาเดียว:

{}doดึงมอดุลัสจากสแต็กเพื่อตรวจสอบว่ามันเป็นความจริงหรือไม่ดังนั้นจึงต้องทำซ้ำเมื่อสิ้นสุดลูป โดยปกติจะทำได้โดย.แต่:\n\nมีผลเหมือนกัน: มันเก็บไอเท็มสแต็กสูงสุดในตัวแปร LF ( :\n) จากนั้นกดเนื้อหาของตัวแปรนั้น


7
ว้าวแม้จะเป็นตัวแปร : O
aditsu

@aditsu: เฉพาะ#, {และ}ไม่สามารถนำมาใช้เป็นชื่อตัวแปรเช่นที่พวกเขาเป็นส่วนหนึ่งของกำลังไวยากรณ์ โทเค็นอื่น ๆ นั้นใช้ได้รวมทั้งสตริง
Dennis

@Dennis wow TIL แม้กระทั่งสตริงสามารถใช้เป็นตัวแปรได้ มันมีประโยชน์สำหรับอะไร?
John Dvorak

@JanDvorak: นอกเหนือจากบางกรณีขอบ (รหัส palindromic, รหัสทุจริตอาจจะไม่ผมคิดว่านี่เป็นเพียงจุด (. เอกสาร ) ผลข้างเคียงของวิธีการล่าม GolfScript แยกรหัสลงในราชสกุล.
เดนนิส

@Dennis หมายความว่า.:-1เก็บอินพุตไว้-1ไม่ใช่เครื่องหมายลบหรือไม่ อืม ...
John Dvorak

23

ไวยากรณ์เทมเพลต MediaWiki

กำหนดเทมเพลต: Foo เป็น

{{{a

b|Uh-oh!}}}

ในหน้าอื่น

{{Foo|a

b=Works!}}  <!-- outputs "Works!" -->

{{Foo|a


b=Works!}}  <!-- outputs "Uh-oh!" -->

{{Foo|a
b=Works!}}  <!-- outputs "Uh-oh!" -->

ใน MediaWiki ชื่อพารามิเตอร์สามารถมีการขึ้นบรรทัดใหม่


1
นิสัยดีนี่คือสิ่งที่ฉันกำลังมองหาในกรณีที่มีขอบแปลก ๆ เช่นนี้
Naftuli Kay

16

LaTeX (backref)

รหัส LaTeX ต่อไปนี้ใช้การอ้างอิงและการอ้างอิงประกอบด้วยรายการของหน้าเว็บที่รายการถูกอ้างอิง นี่คือหน้าแรก แพคเกจhyperrefยังเพิ่มลิงค์ PDF หน้าอ้างอิงกลับเป็นสีแดงลิงค์อ้างอิงเป็นสีเขียว

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.

\end{thebibliography}
\end{document}

ผลลัพธ์

แต่ LaTeX ไม่ต้องการบรรทัดว่างเปล่าบรรทัดว่างจะดูฟุ่มเฟือยและตัวอย่างจะยังคงทำงานโดยไม่มีhyperrefและบรรทัดว่าง:

\documentclass{article}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

ผลลัพธ์โดยไม่ต้องไฮเปอร์

แต่ลิงก์และการอ้างอิงกลับหายไปดังนั้นเราจึงแทรกมันอีกครั้ง:

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

แต่ตอนนี้ตัวอย่างถูกทำลายและจะไม่รวบรวมอีกต่อไป:

Runaway argument?
 Donald E. Knuth: \textit {The \TeX book}; Addison Wesley, 1984. \end \ETC.
! File ended while scanning use of \BR@@bibitem.
<inserted text> 
                \par 
<*> knuth

?

เกิดอะไรขึ้น? แพคเกจhyperref(หรือแพคเกจที่แม่นยำมากขึ้นbackrefซึ่งโหลดโดยhyperref) ต้องการที่จะได้รับในตอนท้ายของรายการบรรณานุกรมเพื่อเพิ่มรายการอ้างอิงกลับ แต่ไวยากรณ์ใน LaTeX ให้การเริ่มต้นของการป้อน\bibitemเท่านั้นจุดสิ้นสุดสามารถอยู่ที่ใดก็ได้ ในแพคเกจฉุกเฉินนี้backrefได้เพิ่มข้อ จำกัด ที่\bibitemจะต้องจบรายการด้วยบรรทัดว่าง จากนั้นแพ็กเกจสามารถกำหนดใหม่\bibitemเพื่อใส่การอ้างอิงกลับในตอนท้ายของรายการ

เนื่องจากบรรทัดว่างหายไป TeX จะค้นหา แต่พบจุดสิ้นสุดไฟล์แทนและออกข้อความแสดงข้อผิดพลาด


12

C (กึ่งสับสน)

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

ไม่มีการต่อสายหรือ trigraphs ทุกที่ ฉันเชื่อว่ามันถูกต้อง ANSI C99

เนื่องจากคณิตศาสตร์ขั้นสูงที่เกี่ยวข้องถ้าคุณรวบรวมอย่าลืมที่จะใช้gcc-lm

#include <setjmp.h>
#include <stdio.h>
#define max(x,y) ((x<y?y:x))
#define swap(x,y) ((x^=y,y^=x,x^=y))
#include <stdlib.h>
#include <math.h>
#define vfry(x,p,z,y,i) (!!y&((z##z##L##I##p##x##z##z)))
#define NDEBUG

/* 
 * Proper use of whitespace is essential!
 * Please do not remove any blank lines.
 */

const double E = 2.71828182845904523536;

int vrfy(double epsilon, int magic, const char *key, long int L) {
  /* You are not expected to understand this */
  double x=284.2891,u=2.34e56;
  while (rand()+magic*pow(epsilon,sin(x-E))!=log(u*L))
    x*=vrfy(1.0/epsilon,(int)u,&key[swap(L,magic)],L++);
  return u/lgamma(x);
}

int main(int argc, char *argv[]) {
  int N_=831293812; /* do not change, see Knuth 1987 */
  if (!vfry(E, N,_, "M=&;VT=I!9", 0xfe86ddcaL)) {
    fprintf(stderr, "Code standards violation detected!\n");
    abort();
  }
  if (argc < 2) {
    fprintf(stderr, "Usage: %s n\nComputes n!\n", argv[0]);
    exit(1);
  }
  int m=1, n=atoi(argv[1]), i;
  for (i=1; i <= n; i++)
    m *= i;
  printf("%d! = %d\n", n, m);
  return 0;
}

ผู้ทำให้เสื่อมเสีย

vrfyฟังก์ชั่นที่ซับซ้อนนั้นไม่เคยถูกเรียกใช้ แต่เป็นvfryมาโครที่ดูตลก การใช้ของ preprocessor คุณลักษณะสตริง__LINE__ปลอมความจริงที่ว่าเราเป็นจริงๆเพียงแค่การตรวจสอบความเท่าเทียมกันของ


ทำงานร่วมกับtcc -run
Vi

นี่มันเรียบร้อยจริงๆ นั่นvfryไม่ได้ถูกขยายออกไปในนิยามฟังก์ชั่นที่ทำให้ฉันงง
FUZxxl

11

C

โปรแกรมนี้ทำงานได้ตามที่คาดไว้ (ตามที่อธิบายไว้ในความคิดเห็น) ยกเว้นว่าจะfoo = 5;ลบบรรทัดว่างก่อนออก

น่าเศร้าที่ฉันพบข้อผิดพลาดเกือบจะเป็นเช่นนี้ในรหัสการผลิตครั้งเดียว

#include <stdio.h>

int main()
{
    int foo = 0;

    #define FROB(x) do {                                            \
        x++;                                                        \
        printf("%d\n", x);                                          \
    } while (0);                                                    \

    foo = 5;
    FROB(foo); /* prints 6 */
    FROB(foo); /* prints 7 */
    FROB(foo); /* prints 8 */

    return 0;
}

ตัวอย่างนี้ใช้do { ... } while (0)สำนวนสำหรับการสร้างคำสั่งหลายบรรทัดในแมโคร (ดูhttps://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ) นอกจากนี้ยังใช้อักขระเครื่องหมายแบ็กสแลชเพื่อกระจาย#defineมากกว่าหนึ่งบรรทัด อย่างไรก็ตามมันยังทำสิ่งผิดสองอย่าง:

  • หลังจากนั้นจะมีเครื่องหมายอัฒภาคwhile (0)ในขณะที่สำนวนมักจะละเว้นสิ่งนี้
  • มีแบ็กสแลชหลังบรรทัดสุดท้ายของ #define

ด้วยวิธีนี้ในสถานที่เอาบรรทัดว่างก่อนfoo = 5;สาเหตุที่ได้รับมอบหมายจะต้องถูกประหารชีวิตหลังจากprintfแต่ยังหลังจากที่ทุกภาวนาของFROBแมโคร ดังนั้นผลลัพธ์หลังจากลบบรรทัดว่างคือ:

1
6
6

1
โดยทั่วไปซ้ำกับcodegolf.stackexchange.com/a/31662/20356
seequ

@TheRare แต่มันชัดเจนน้อยกว่า
Ypnypn

6
จะเห็นได้ชัดน้อยลงถ้าคุณไม่มองแบ็กสแลชเหล่านั้นลอยไปทางขวาอย่างชัดเจนมาก (แต่เนื่องจากพวกมันลอยไปทางขวาอย่างเด่นชัดพวกเขาจะได้ดู)
doppelgreener

3
อย่างไรก็ตามทั้งหมดหนึ่งในนั้นเป็นธรรม
QuadmasterXLII

6
@QuadmasterXLII ซึ่งเป็นเทคนิคการพูดพวกเขามีความชอบธรรม - ถูกต้องเพื่อความแม่นยำ
Mark

9

C / C ++

int main(){

    return __LINE__ - 3;
}

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


8

PowerShell

ฟังก์ชั่นนี้จะเพิ่มตัวเลขสองตัว

function add ($a, $b) {
    $numbers = @($a `

            $b)
        $numbers| measure -sum| select -expand sum
}

การลบบรรทัดว่างจะทำให้ฟังก์ชันล้มเหลวด้วย: Unexpected token '$b' in expression or statement.

คำอธิบาย

องค์ประกอบแถวลำดับสามารถคั่นด้วยบรรทัดใหม่และ / หรือเครื่องหมายจุลภาค วางอักขระบรรทัดต่อเนื่อง ( `) หลังจากที่$aต้องมีการขึ้นบรรทัดใหม่พิเศษเพื่อแยกและ$a $bมิฉะนั้นล่ามดูรหัสเป็น$numbers = @($a $b)(ไม่มีตัวคั่นองค์ประกอบ)


7

เท็กซ์

\noindent\everypar{$\bullet$ hello }

world
\bye

หากไม่มีบรรทัดว่างเปล่า "hello" จะไม่ถูกพิมพ์

คำอธิบาย

TeX ถือว่าบรรทัดว่างเป็นตัวแบ่งย่อหน้าและ\everyparจะถูกดำเนินการเมื่อเริ่มต้นย่อหน้าใหม่


6

ชวา

import java.util.Scanner;

public class BlankLine
{
    public static void main( String[] args )
    {
        //This calculates 2^ given number
        //if you remove blank line after the next line it will always print 1
        int x = new Throwable().getStackTrace()[0].getLineNumber();

        int y = new Throwable().getStackTrace()[0].getLineNumber() - x;
        System.out.println("Number:");
        Scanner scanner = new Scanner(System.in);
        int r = 1;
        int n = scanner.nextInt();

        for(int i = 0; i < n; i++){
            r *= y;
        }
        System.out.println("2^number: "+r);
    }
}

x คือหมายเลขบรรทัดปัจจุบัน y คือหมายเลขบรรทัดปัจจุบัน - x หากมีช่องว่างระหว่างสองบรรทัดผลลัพธ์คือ 2 ดังนั้นโค้ดจะคำนวณจำนวน 2 ^


1
+1 เพียงเพราะ Java แต่เป็นผู้เยี่ยมชมCode Reviewบ่อยครั้งฉันสงสัยว่าทำไมคุณไม่ใช้Math.pow?
Simon Forsberg

เพราะรหัสของฉันต้องทำอะไรบางอย่าง การเพิ่มตัวเลข 2 ตัวนั้นง่ายเกินไป
barteks2x

การใช้Math.powและพิมพ์ผลก็คือการทำอะไรบางอย่างใช่ไหม?
Simon Forsberg

และตอนนี้ฉันก็รู้ว่าฉันสามารถใช้คณิตศาสตร์ได้จริงฉันไม่รู้ว่าทำไมฉันถึงคิดว่าฉันต้องทำแบบนั้น ... Matbe ฉันอยากจะทำมันด้วยวิธี "ลับ ๆ ล่อๆ"
barteks2x

7
คุณเล่นกอล์ฟมากเกินไป คุณควรเยี่ยมชมCode Reviewแทนเราทำสิ่งที่ถูกต้อง!
Simon Forsberg

6

Perl 5

print(<<""
Hello, World!

);

พิมพ์รหัสHello, World!นี้ การลบบรรทัดว่างจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์แทน

คำอธิบาย:

ไวยากรณ์ของ doc ที่นี่ docของ Perl สำหรับสตริงหลายบรรทัดอนุญาตให้สตริง terminator ว่างเปล่า มันเป็นเอกสารอย่างชัดเจน การลบบรรทัดว่างออกทำให้วงเล็บปิด (และทุกอย่างขึ้นอยู่กับบรรทัดว่างถัดไปหากมี) จะถูกตีความเป็นส่วนหนึ่งของสตริงทำให้เกิดข้อผิดพลาดทางไวยากรณ์

ข้อความแสดงข้อผิดพลาดที่คุณได้รับนั้นค่อนข้างดีทีเดียวสำหรับฟีเจอร์ซินแท็คซ์ลูกเล่น หากไม่มีบรรทัดว่างเลยในโปรแกรมหลังจากprint(<<""บรรทัด Perl ก็บอกว่า:

ไม่พบสตริงตัวอักษร "" ที่ใดก็ได้ก่อน EOF ที่ foo.pl บรรทัดที่ 1

หากมีเป็นบรรทัดว่างในตอนท้ายของโปรแกรมที่คุณจะได้รับบางสิ่งบางอย่างเช่นนี้แทน:

ข้อผิดพลาดทางไวยากรณ์ที่ foo.pl บรรทัด 4, ที่ EOF
  (อาจเป็นสายอักขระหลายบรรทัด << ที่ควบคุมไม่ได้เริ่มต้นที่บรรทัดที่ 1)
การดำเนินการ foo.pl ถูกยกเลิกเนื่องจากข้อผิดพลาดในการรวบรวม


5

ชุด

@echo off
setLocal enableDelayedExpansion
set NL=^


echo Hello!NL!World

รหัสนี้ออกจะและในบรรทัดถัดไปHello Worldเมื่อลบบรรทัดว่างอย่างใดอย่างหนึ่งหรือทั้งสองอย่างออกจะไม่มีผลอะไรเลย

มีคำอธิบายที่นี่คือ


4

ทับทิม

การลบบรรทัดแรกจะทำให้เกิดข้อผิดพลาด:

line = IO.readlines($0).first.chomp if line.empty? puts 34+4 else raise "Please add a newline at the beginning of the program." end

2
ฉันรักข้อความผิดพลาด ต้องการดูปฏิกิริยาของบางคนที่พยายามเรียกใช้โปรแกรมและได้รับการตอบสนองนั้น
tomsmeding

4

หลาม

ไม่ทราบว่าสิ่งนี้อยู่ภายใต้ช่องโหว่มาตรฐานหรือไม่ฉันดูรายการและไม่เห็นสิ่งนี้

src = open(__file__, 'r')
code = src.readlines()
src.close()

if code[3] == '\n':
    print 'Hello World!'

การรันสิ่งนี้จะส่งคืนอย่างสม่ำเสมอ

Hello World!

รันโดยไม่มีบรรทัดว่างบนบรรทัด 4 เช่นที่ด้านล่าง:

src = open(
__file__, 'r')
code = src.readlines()
src.close()
if code[3] == '\n':
    print 'Hello World!'

ไม่มีอะไรคืน


3

Python 2.x

โปรแกรมนี้แสดงผลอักขระที่ห้าของสตริงอินพุต

import inspect

text = raw_input()
print 'Fifth character of the string:', text[inspect.getlineno(inspect.currentframe())]

นี่ไม่ได้ซ่อนอยู่ในทางใดทางหนึ่ง หากคุณลบบรรทัดว่างมันจะให้อักขระตัวที่สี่และตัวที่หกถ้าคุณเพิ่มหนึ่งบรรทัด


3

Tcl

ฟังก์ชั่นที่เพิ่มตัวเลขสองตัว (และตรวจสอบว่ามีการลบบรรทัดใหม่):

proc add {a b} {
    if {[llength [split [info body add] \n]] < 5} {error "function has been modified"}

    return [expr $a+$b]
}

ไม่มีอะไรจะซ่อนที่นี่ทำในสิ่งที่มันพูดดังนั้นฉันจึงไม่ทำให้คำอธิบายเสียไป ฟังก์ชั่นinfoนี้เป็นมีดกองทัพสวิสแห่งการวิปัสสนา info bodyส่งคืนซอร์สโค้ดของฟังก์ชัน (หากไม่ได้เขียนใน C หรือชุดประกอบ)

ฉันต้องยอมรับว่าสิ่งนี้ทำให้ฉันนิ่งงันจนกว่าฉันจะเห็นโซลูชัน javascript


3

C

#include <stdio.h>


int main() {
    const char* a = "You love blank lines.";
    #define print_out(a) \

    printf("%s\n", a);
    a = "You don't seem to love blank lines";
    print_out(a);
    return 0;
}

ด้วยบรรทัดว่างaเป็นตัวแปรโลคอล a และไม่มีพารามิเตอร์มาโคร ...


3

ในทางเทคนิคไม่ใช่ปัญหา "รหัส" แต่เป็นเซิร์ฟเวอร์ หากสิ่งนี้ถูกส่งไปยัง Apache จากสคริปต์ CGI (ซึ่งสามารถสร้างด้วยภาษาใดก็ได้ที่คุณต้องการ) มันจะส่งการตอบกลับ HTTP ไปยังลูกค้า:

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8

Hello world!

ในทางกลับกันสิ่งนี้จะล้มเหลวเนื่องจากไม่มีที่ว่างหลังส่วนหัว

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8
Hello world!

2

JavaScript

ฟังก์ชั่นwhereamiตอบสนองกับตำแหน่งของสายโทรศัพท์ที่สัมพันธ์กับตำแหน่งของตัวเองในซอร์สโค้ด

console.log (whereami ()) //3 line(s)  before me 


function whereami () {
    var a=function a(e){try{to}catch(c){for(var d=c.stack.split("\n"),b=0;b<d.length&&!~d[b].indexOf("a");b++);return c.stack.split("\n")[b+~~e].match(/:(\d+)/)[1]-~~window.hasOwnProperty("__commandLineAPI")}},a1=a(1),i


    i= a(2)>a(1)+4?a(1):a(1)>a1+2?a1-1:a/a1



    return ((i=(a(2)<i?i-1:a(1)>i+3?a(2)-a(1)-1:a/1)) + " line(s) "   ) + (i<a(2)?" after":(i>=a(2)?" before":"confusing")) + " me";
}


console.log (whereami ()) //3 line(s)  after me

หากบรรทัดว่างใด ๆ ในwhereamiฟังก์ชั่นจะถูกลบออก NaN line(s) confusing meเอาท์พุทเป็น (การเพิ่มบรรทัดไม่ทำให้มันแตก)

จริง ๆ แล้วนับเฉพาะจำนวนบรรทัดที่อยู่ระหว่างiและบรรทัดแรกและบรรทัดสุดท้ายตามลำดับ หากพวกเขาตกอยู่ภายใต้ค่าที่กำหนด เส้นอ้างอิงจะถูกกำหนดให้NaNซึ่งไม่ตอบสนองมิได้NaN<callingLine NaN>=callingLineฉันพยายามซ่อนมันเล็กน้อยในนิพจน์ที่ประกอบกันไม่ได้อ่าน


1
เย็น. ฉันไม่คิดว่าจะใช้ข้อยกเว้นแบบกองซ้อนเช่นนั้น
ขีด

2

Perl

#!/usr/bin/perl

use strict;
use warnings;

open IN, "<".$0 or die "Did not find input files!";
while (<IN>) {
        m/blabla/ && ((<IN> =~ /\}/ && print "tra-la-la...\n") || print "ti-ri-li\n");

}
close IN;

สคริปต์ Perl นี้จะอ่านไฟล์สคริปต์และตรวจสอบว่าหลังจากบรรทัดที่มี "blabla" มีวงเล็บปิดอยู่หรือไม่


2

Escript

เนื่องจากข้อผิดพลาดในescriptการใช้งาน escript ที่ถูกต้องจะต้องมีอย่างน้อยสามบรรทัดและบรรทัดแรกต้องเป็นบรรทัด shebang หรือบรรทัดว่าง ดังนั้นการติดตามสคริปต์จึงมีสองบรรทัดว่างโดยที่บรรทัดแรกต้องเป็นบรรทัดแรก:

main(_) -> io:format("Hello world!~n", []), halt().

หรือมันจะหักเป็นสองบรรทัด แต่ก็ยังต้องมีบรรทัดว่างก่อน

main(_) ->
    io:format("Hello world!~n", []), halt().

มิฉะนั้นคุณจะได้รับ

escript: Premature end of file reached

2

ทับทิม

print %q
2+2=

p(2+2)

พิมพ์2+2=4แต่ให้ข้อผิดพลาดทางไวยากรณ์โดยไม่มีบรรทัดที่สามว่าง %qอนุญาตให้อักขระที่ไม่ใช่คำใด ๆ ทำหน้าที่เป็นตัวคั่นสตริงแม้แต่อักขระขึ้นบรรทัดใหม่ ดังนั้นโค้ดสามบรรทัดแรกจึงเทียบเท่ากันจริง ๆprint %q"2+2="หรือแค่print "2+2="นั้น เนื่องจากมีการใช้การขึ้นบรรทัดใหม่หลังจาก2+2=เป็นตัวคั่นเครื่องหมายคำพูดดังนั้นจึงไม่จำเป็นต้องแยกวิเคราะห์เป็นตัวคั่นบรรทัดดังนั้นคุณจึงต้องใช้ตัวคั่นอื่นทันที


1

นอนไม่หลับ (ทั้งสองรุ่น)!

Þyoo

â

รหัสนี้จะพิมพ์ ~ (ไม่ต้องถามทำไมนอนไม่หลับเป็นเรื่องแปลก) หากคุณลบบรรทัดว่างออกมันจะพิมพ์ÿแทน

โดยวิธีการที่ตัวอักษรตัวแรกเป็นหนาม


1
ไชโยหนาม! ไม่เคยเห็นตัวละครนั้นในวัย +1
Addison Crump

0

C ++

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

int main() {
    //This program won't work without the next line, why??/

    return 1;
}

ทำไมถึงได้ผล


13
อันที่จริงนี่เป็นหนึ่งในช่องโหว่
Mhmd

@Mhmd ฉันไม่รู้ ไม่ว่าจะด้วยวิธีใดฉันรู้ว่าผู้คนมักจะใช้สิ่งนี้ในคำถามประเภทนี้และฉันแค่ต้องการออกจากที่นี่เพียงเพื่อให้บางคนไม่คิดว่ามันฉลาดที่จะทำสิ่งนี้
Aearnus

1
คำตอบนี้ผิดด้วยสองเหตุผล ประการแรกคือ??/หมายความว่า\​ดังนั้น??//หมายความว่า\/และเมื่อบรรทัดไม่สิ้นสุด\​ไม่มีการต่อบรรทัด ประการที่สองคือพฤติกรรมที่ตรงเดียวกันโดยไม่คำนึงว่าreturn 0;จะถูกดำเนินการเพราะเห็นว่าเป็นพฤติกรรมมาตรฐานเมื่อการดำเนินการของต้นน้ำปิดmain }
hvd

@hvd นั่น ฉันซ่อมมัน.
Aearnus

3
@ คราI know people always use this in these kinds of questionนั่นเป็นสาเหตุที่เราทำให้มันเป็นช่องโหว่มาตรฐาน
undergroundmonorail

0

วางสิ่งนี้ลงในไฟล์ html และเปิดในเบราว์เซอร์ของคุณ มันค่อนข้างง่าย แต่ค่อนข้างยุ่งยากเพราะใช้จำนวนบรรทัดว่างในเอกสารและจัดทำดัชนีอาร์เรย์เพื่อเรียกใช้ฟังก์ชันที่แสดงการแจ้งเตือน

<body>
<script>
[null, function(){alert("GIVE ME MY LINE BACK")}, function(){alert("2 + 2 = " + (2+2))}][document.body.innerHTML.split("\n\n").length]()

</script>
</body>

อันนี้เป็นการฝ่าฝืนกฎเขตแดน เทคนิค JavaScript ไม่มีสตริงหลายบรรทัดซึ่งเป็นเหตุผลเดียวที่ใช้งานได้

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

<body>
<script>
window.onerror=function(){
  alert("2 + 2 = " + (2+2));
}
</script>
<script>
var a = "\

";
alert("GIVE ME MY LINE BACK!");
</script>
</body>

0

ทับทิม

puts (% #{ARGV[0].to_i + ARGV[1].to_i}

)

ความลับอยู่ที่การขึ้นบรรทัดใหม่เป็นแท็บจริงๆแล้วขึ้นบรรทัดใหม่ ฉันไม่รู้ว่าสิ่งนี้สำคัญหรือเปล่า แต่ฉันคิดว่ามันเป็นปังตอ ตัวละครที่อยู่หลัง%แท็บนั้นก็เป็นแท็บด้วยเช่นกัน แต่ด้วยเหตุผลบางอย่างมันก็ไม่แสดงขึ้นมาเหมือนกัน ฉันใช้เครื่องหมายเปอร์เซ็นต์ของ Ruby เพื่อสร้างสตริงซึ่งเพิ่มอาร์กิวเมนต์ 2 ตัวแรกที่ส่งผ่านไปยังสคริปต์ มีเพิ่มเติมเกี่ยวกับที่นี่: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


อันที่จริงมันไม่ได้นับอ่านคำแนะนำ: "ไม่มีคนโง่ที่ช่องว่าง" \nควรมีหนึ่งรายการและควรมีความสำคัญต่อการทำให้โปรแกรมทำงานตามที่คาดไว้
Naftuli Kay

Ah ok :( ฉันลองแล้ว
แอดดิสัน

1
ฉันคิดว่าคุณสามารถแก้ไขปัญหานี้ได้: การขึ้นบรรทัดใหม่อาจเป็นตัวคั่นเปอร์เซ็นต์ได้
ฮิสโทแคต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.