Xóa một dòng trống trong mã nguồn gây ra chức năng không mong muốn [đã đóng]


38

Viết một kịch bản hoạt động tốt khi có một dòng trống trong dòng logic của chương trình, nhưng phá vỡ hoặc gây ra hành vi không mong muốn khi dòng đó bị xóa.

Tránh sơ hở tiêu chuẩn và câu trả lời ngu ngốc. Chương trình của bạn nên làm một cái gì đó "hữu ích", ngay cả khi tất cả những gì nó làm là thêm một vài số nguyên.

Xóa một dòng trống khỏi chuỗi đa dòng không được tính, trừ khi đầu ra dự kiến ​​từ chuỗi đa dòng đó không nên thay đổi về mặt kỹ thuật (ví dụ: nếu bạn xóa tất cả các dòng trống phù hợp ^$).

Đánh lừa khoảng trắng cũng không được phép; đừng làm những điều kỳ lạ với lợi nhuận vận chuyển, tab, không gian, v.v.


11
Tôi nghĩ bạn nên loại trừ khoảng trắng.
nneonneo

17
Tôi nghĩ rằng Whitespace một " lỗ hổng tiêu chuẩn "
core1024

5
nneonneo đang nói về Whitespace , một ngôn ngữ chỉ sử dụng khoảng trắng làm cú pháp của nó.
Kyle Kanos

4
"chức năng bất ngờ" là một cụm từ rất tốt.
Kaz

3
Tôi đang bỏ phiếu để đóng câu hỏi này dưới dạng ngoài chủ đề vì các thử thách ngầm không còn thuộc chủ đề trên trang web này. meta.codegolf.stackexchange.com/a/8326/20469
mèo

Câu trả lời:


62

Javascript

Mở một cửa sổ bật lên cảnh báo với "Xin chào, Thế giới!" nếu dòng trống tồn tại, nếu không thì cảnh báo "0".

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

})();

Bản giới thiệu

Giải trình:

arguments.callee là một tham chiếu đến chức năng ẩn danh tự thực hiện.

Việc thêm một mảng trống ( []) sẽ đưa hàm vào một chuỗi, cung cấp cho bạn mã nguồn của nó.

indexOftrả về -1nếu không tìm thấy chuỗi.

Thực hiện một bitwise không hoạt động ( ~) dẫn đến -1bị biến thành 0, đó là một giá trị falsey.


2
Cái mánh khóe gì thế này?!
Kroltan

1
arguments.calleechứa nguồn của hàm.
Matthew

2
Lưu ý rằng điều này không còn hoạt động trong chế độ nghiêm ngặt (mà hầu hết các mã hiện đại sẽ sử dụng). Chế độ nghiêm ngặt cấm sử dụng arguments.callee.
Daniel Lo Nigro

1
@Michael: Không, spec không nói gì về định dạng chính xác. Trên thực tế , có những động cơ chạy xung quanh không giữ được khoảng trắng.
Bergi

2
@DanielLoNigro Bạn chỉ có thể đặt tên cho biểu thức hàm và sử dụng tên đó thay vì arguments.callee. Thậm chí làm cho nó ngắn hơn.
một con mèo

42

C

Chương trình 8 quả bóng ma thuật này sẽ vẫn hoạt động mà không có dòng trống, nhưng nó sẽ quyết định hơn một chút - không có câu trả lời trung lập nào sẽ xuất hiện trong đầu ra.

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

Giải trình

Khi trình phân tích cú pháp C thấy dấu gạch chéo ngược theo sau là ký tự dòng mới, nó bỏ qua cả hai và coi dòng thứ hai là phần tiếp theo của dòng thứ nhất. Nếu không có dòng trống, tất cả các câu trả lời "thờ ơ" sẽ được coi là một phần của nhận xét trước đó.


51
Tôi + 1'd, nhưng thấy các bình luận C kết thúc bằng dấu gạch chéo ngược đang bắt đầu trở thành một lỗ hổng tiêu chuẩn, IMO.
Tim S.

2
Nó là một tài liệu tham khảo cho bài "lỗ hổng tiêu chuẩn" này , vì vậy có lẽ không phải là "lỗ hổng" theo nghĩa đen.
Tim S.

5
@TimS. Nếu bạn cảm thấy nhàm chán với "giải pháp" này, tại sao bạn lại nâng cấp?
John Dvorak

8
Các câu trả lời gạch chéo ngược-the-next-line-thành-a-bình luận (trecraft hoặc no trecraft) đang khiến tôi ước mình có 125 danh tiếng. Tôi tiếp tục nhìn thấy chúng và chúng bắt đầu lặp đi lặp lại một cách khủng khiếp, hoàn toàn nhìn xuyên thấu và không còn thông minh hay hài hước nữa. (Thật không may cho những người sử dụng chúng, như squeamish ở đây, bởi vì họ không xứng đáng với cái tôi và đôi khi hoàn toàn không biết về điều này - nhưng mánh khóe đang kiếm được nó.)
doppelgreener

4
@Jan bắt đầu trở thành tiêu chuẩn không giống như tiêu chuẩn dài / quá liều ... việc sử dụng nó khá thông minh ở đây, nó không có vẻ gì khác biệt (không giống như một số tôi đã thấy, có thể hiểu là có nhân vật tại kết thúc một bình luận, hoặc kết thúc bình luận của họ với (các) nhân vật bắt đầu bình luận để làm điều gì đó bất thường). Vì vậy: Tôi nâng cao giải pháp, không tiếp tục sử dụng mánh khóe của nó.
Tim S.

37

Befunge-93

v
&
&
+
#

.
@

Chương trình befunge đầu tiên của tôi :)

Nó đọc hai số từ đầu vào và in tổng của chúng. Nếu bạn xóa dòng trống, nó sẽ không in bất cứ thứ gì.

Giải trình:

vđặt hướng xuống để thực thi mã
&đọc một số nguyên cộng
+các số lại với nhau
#bỏ qua lệnh tiếp theo
.in một số nguyên từ ngăn xếp
@kết thúc chương trình

Như đã viết, #bỏ qua dòng trống và tiếp tục với .. Mua khi bạn xóa dòng trống, .được bỏ qua.

Dường như có một thông dịch viên tốt tại http://befunge.aurlien.net/


Ah, thông minh một.
xem

1
Befunge 98 cũng làm điều này. Suy nghĩ tốt. Và thông dịch viên này có một số lợi ích (Tôi chưa sử dụng nhiều của bạn, vì vậy tôi không biết lợi ích của nó).
Justin

32

Hồng ngọc / Vỏ

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

p 1+1

Hoạt động tốt nếu một dòng mới ở trên cùng, nếu không thì dòng nhận xét đầu tiên được trình bày bởi shell là một shebang không đúng định dạng.


3
Điều này sẽ không luôn luôn làm việc hoặc luôn luôn không làm việc? Ví dụ: nếu bạn chạy nó như vậy ruby youranswer.rb, nó sẽ không tìm kiếm shebang vì nó đã được chạy trong trình thông dịch ruby ​​rồi, nhưng nếu bạn chạy nó ./youranswer.rbthì nó sẽ không chạy được vì không có shebang ..
Tái lập Monica

6
Ít nhất là với viên ruby ​​của tôi, shebang được vinh danh ngay cả khi bạn chạy nó ruby youranswer.rb, điều này có thể hữu ích để đặt các công tắc dòng lệnh cần thiết trong tệp. Vì vậy, không có dòng mới tôi nhận đượcruby: no Ruby script found in input (LoadError)
lịch sử

29

Scala

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

Nếu bạn xóa dòng trống, sẽ không có đầu ra nào được in. Điều này là tốt nhất, vì ngăn xếp của bạn sẽ tràn nếu bạn thực sự được gọi IntWrapper.

Đây là một trường hợp góc của suy luận dấu chấm phẩy của Scala. Thông thường các dòng mới có dấu chấm phẩy bất cứ khi nào mã kết quả sẽ hợp lệ. Tuy nhiên, các nhà phát triển Scala không muốn buộc mọi người sử dụng dấu ngoặc Ai Cập , do đó, việc đặt dấu ngoặc cho định nghĩa lớp trên dòng ngay sau đó là không hợp lệ - không có dấu chấm phẩy nào được thêm vào, mặc dù có thể được thêm vào. Tuy nhiên, một dòng trống sẽ tách các dấu ngoặc khỏi định nghĩa lớp. Với dòng trống được loại bỏ, mã thay đổi từ một định nghĩa lớp và một khối, sang một định nghĩa lớp với một hàm tạo - và một hàm tạo đệ quy tại đó!


6
Rất đẹp trong số họ không ép buộc Ai Cập Chân đế. Nhưng theo tôi, dấu chấm phẩy là một ý tưởng tồi.
Almo

Suy luận dấu chấm phẩy có một tên xấu, phần lớn là do JavaScript. Sẽ bớt đau hơn một chút nếu bạn thiết kế ngôn ngữ với nó (chẳng hạn, không ai phàn nàn về nó bằng Python). Thật không may Scala bao gồm một số tính năng không chơi tốt với suy luận dấu chấm phẩy. Có cái này và các toán tử postfix (mà tôi đã cố gắng sử dụng trong câu trả lời của mình, nhưng nó hơi bị động).
James_pic

2
@James_pic: AFAIK không ai phàn nàn về nó trong Python vì nó không tồn tại trong Python. Trong JS, dấu chấm phẩy là một phần cần thiết của cú pháp và có thể được chèn (suy ra) tại một số điểm nhất định. Trong Python, dấu chấm phẩy không phải là một phần cần thiết của cú pháp, nhưng có thể được sử dụng tùy ý. Đó là một sự khác biệt lớn.
Mason Wheeler

Nó có vẻ như là một sự khác biệt lớn, nhưng nếu Scala loại bỏ một vài tính năng, hiện đang khiến ranh giới câu lệnh trở nên mơ hồ, nó sẽ chuyển từ phía hàng rào của JavaScript sang hàng rào của Python.
James_pic

1
@James_pic: Điều khiến python khác biệt là dòng mới chấm dứt tuyên bố trừ khi thoát hoặc bên trong bất kỳ loại dấu ngoặc nào. Đó là không có quy tắc hoàn chỉnh / không đầy đủ.
Jan Hudec

27

GolfScript

~{.@\%:

}do;

Tính GCD của hai số nguyên khác không. Loại bỏ các dòng trống phá vỡ chương trình.

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

Đây là một triển khai GolfScript của thuật toán Euclide:

      # 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.

Chỉ có một vấn đề nhỏ:

{}dobật mô-đun từ ngăn xếp để kiểm tra xem nó có đúng không, vì vậy nó phải được sao chép ở cuối vòng lặp. Điều này thường được thực hiện bởi ., nhưng :\n\ncó tác dụng tương tự: Nó lưu trữ mục ngăn xếp trên cùng trong biến LF ( :\n), sau đó đẩy nội dung của biến đó.


7
Wow, thậm chí đó là một biến? : O
aditsu

@aditsu: Chỉ có #, {}không thể được sử dụng như tên biến, vì chúng là một phần đang trong cú pháp. Mọi mã thông báo khác đều ổn, bao gồm cả chuỗi.
Dennis

@Dennis wow. TIL chuỗi thậm chí có thể được sử dụng như là biến. Điều đó có hữu ích cho bất cứ điều gì không?
John Dvorak

@JanDvorak: Ngoài một số trường hợp cạnh (mã palindromic, mã ngầm , có thể không. Tôi nghĩ đây chỉ là tác dụng phụ (được ghi lại ) về cách trình thông dịch GolfScript chia mã thành mã thông báo.
Dennis

@Dennis có nghĩa là .:-1lưu trữ đầu vào -1, không phải là dấu trừ? Hmm ...
John Dvorak

23

Cú pháp mẫu MediaWiki

Xác định mẫu: Foo là

{{{a

b|Uh-oh!}}}

Trong một trang khác,

{{Foo|a

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

{{Foo|a


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

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

Trong MediaWiki, tên tham số có thể chứa dòng mới.


1
Thật tuyệt, đây là những gì tôi đang tìm kiếm, những trường hợp kỳ lạ như thế này.
Naftuli Kay

16

LaTeX (backref)

Mã LaTeX sau đây sử dụng trích dẫn và trích dẫn chứa danh sách các trang, trong đó mục nhập được trích dẫn. Đây là trang đầu tiên. Gói hyperrefcũng thêm các liên kết PDF, tham chiếu trở lại trang là màu đỏ, liên kết trích dẫn là màu xanh lá cây.

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

Kết quả

Nhưng LaTeX không yêu cầu dòng trống, dòng trống trông có vẻ thừa và ví dụ sẽ vẫn hoạt động mà không có hyperrefdòng trống:

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

Kết quả mà không hyperref

Nhưng các liên kết và tham chiếu trở lại đã biến mất, do đó chúng tôi tái xác nhận chúng:

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

Nhưng bây giờ ví dụ đã bị hỏng và sẽ không biên dịch nữa:

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

?

Chuyện gì đã xảy ra? Gói hyperref(hoặc gói chính xác hơn backref, được tải bởi hyperref) muốn nhận ở cuối mục nhập thư mục để thêm danh sách tham chiếu trở lại. Nhưng cú pháp trong LaTeX chỉ cung cấp phần đầu của mục nhập \bibitem, phần cuối có thể ở bất cứ đâu. Trong gói khẩn cấp backrefnày đã thêm một hạn chế \bibitemphải kết thúc mục nhập bằng một dòng trống. Sau đó gói có thể xác định lại \bibitemđể đặt các tham chiếu trở lại vào cuối mục.

Vì dòng trống bị thiếu, TeX tiếp tục tìm kiếm nó, nhưng tìm thấy phần cuối của tệp thay vào đó và đưa ra thông báo lỗi.


12

C (bán kín)

Chương trình nhỏ này lấy một số trên dòng lệnh và tính giai thừa của nó. Tuy nhiên, nó cũng chứa chức năng AI tiên tiến để xác minh thời gian chạy rằng các tiêu chuẩn mã hóa của công ty, bao gồm cả việc sử dụng đúng khoảng trắng và dòng trống, đang được tuân theo. Xóa một dòng trống sẽ kích hoạt thuật toán từ chối chương trình không đủ bảo trì.

Không có tiếp tục dòng hoặc tr tryss bất cứ nơi nào. Tôi tin rằng nó là hợp lệ ANSI C99.

Do toán học tiên tiến liên quan, nếu bạn biên dịch với gcc, hãy nhớ sử dụng -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;
}

Làm hỏng

Hàm phức tạp vrfykhông bao giờ được gọi, mà là vfrymacro trông buồn cười . Việc sử dụng tính năng nối chuỗi của bộ tiền xử lý che giấu thực tế rằng chúng ta thực sự chỉ đang kiểm tra tính chẵn lẻ của __LINE__.


Cũng hoạt động vớitcc -run
Vi.

Điều này thực sự gọn gàng. Điều đó vfrykhông được mở rộng trong định nghĩa hàm thực sự làm tôi bối rối.
FUZxxl

11

C

Chương trình này hoạt động như mong đợi (như được mô tả trong các bình luận) trừ khi dòng trống trước đó foo = 5;bị xóa.

Đáng buồn thay, tôi đã gặp một lỗi gần như chính xác như thế này trong mã sản xuất một lần.

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

Ví dụ này sử dụng do { ... } while (0)thành ngữ để tạo một câu lệnh đa dòng trong một macro (xem https://stackoverflow.com/questions/257418/do- while-0-what-is-it-good-for ). Nó cũng sử dụng ký tự dấu gạch chéo ngược để trải rộng #definetrên nhiều dòng, thuận tiện xếp thành hàng ngoài tầm nhìn. Tuy nhiên, nó cũng có hai điều sai:

  • Có một dấu chấm phẩy sau while (0), trong khi thành ngữ thường bỏ qua điều này
  • Có dấu gạch chéo ngược sau dòng cuối cùng của #define

Với điều này tại chỗ, loại bỏ các dòng trống trước khi foo = 5;nguyên nhân chuyển nhượng được thực hiện sau khi các printf, nhưng cũng sau mỗi invocation của FROBvĩ mô. Do đó, đầu ra sau khi xóa dòng trống là:

1
6
6

1
Về cơ bản là một bản sao của codegolf.stackexchange.com/a/31662/20356
seequ

@TheRare Nhưng nó ít rõ ràng hơn.
Ypnypn

6
Nó chỉ ít rõ ràng hơn nếu bạn không nhìn vào những dấu gạch chéo ngược trôi nổi rất rõ ở bên phải. (Nhưng vì chúng nổi ở bên phải rất dễ thấy, nên chúng sẽ được nhìn vào.)
doppelgreener

3
Tuy nhiên, tất cả ngoại trừ một trong số chúng đều hợp lý
QuadmasterXLII

6
@QuadmasterXLII, về mặt kỹ thuật, tất cả đều hợp lý - chính xác, chính xác.
Đánh dấu

9

C / C ++

int main(){

    return __LINE__ - 3;
}

Trả về thành công và có thể được sử dụng như là một thực hiện cho đúng . Nếu dòng trống bị loại bỏ, bạn có thể sử dụng nó như là một triển khai cho sai .


8

PowerShell

Hàm này sẽ thêm hai số.

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

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

Xóa dòng trống sẽ khiến chức năng bị lỗi với: Unexpected token '$b' in expression or statement.

Giải trình

Các phần tử mảng có thể được phân tách bằng dòng mới và / hoặc dấu phẩy. Đặt ký tự tiếp tục dòng ( `) sau $ayêu cầu thêm một dòng mới để phân tách $a$b. Mặt khác, trình thông dịch xem mã dưới dạng $numbers = @($a $b)(không có dấu tách phần tử).


7

TeX

\noindent\everypar{$\bullet$ hello }

world
\bye

Không có dòng trống, "xin chào" không được in.

Giải trình

TeX coi dòng trống là ngắt đoạn và \everyparđược thực thi khi bắt đầu đoạn mới.


6

Java

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 là số dòng hiện tại, y là số dòng hiện tại - x. Nếu có dòng trống giữa chúng thì kết quả là 2. Vì vậy, mã sẽ tính 2 ^ số.


1
+1 đơn giản vì đó là Java, mặc dù là khách truy cập thường xuyên của Đánh giá mã, tôi tự hỏi tại sao bạn không sử dụng Math.pow?
Simon Forsberg

Bởi vì mã của tôi phải làm một cái gì đó. Thêm 2 số là một chút quá đơn giản.
barteks2x

Sử dụng Math.powvà in ra kết quả cũng đang làm gì đó phải không?
Simon Forsberg

Và bây giờ tôi nhận ra rằng tôi thực sự có thể sử dụng .Math.pow Tôi không biết tại sao tôi nghĩ tôi cần phải làm theo cách đó ... Matbe tôi muốn làm điều đó theo cách "lén lút".
barteks2x

7
Bạn đã chơi golf quá nhiều. Bạn nên truy cập Code Review thay vì nơi chúng tôi làm việc đúng!
Simon Forsberg

6

Perl 5

print(<<""
Hello, World!

);

Mã này in Hello, World!. Thay vào đó, việc xóa dòng trống sẽ gây ra lỗi cú pháp.

Giải trình:

Cú pháp here-doc của Perl cho các chuỗi nhiều dòng cho phép một chuỗi kết thúc trống. Nó thậm chí còn được ghi lại rõ ràng. Xóa dòng trống gây ra dấu ngoặc đơn đóng (và mọi thứ khác cho đến dòng trống tiếp theo, nếu có) được hiểu là một phần của chuỗi, gây ra lỗi cú pháp.

Các thông báo lỗi bạn nhận được thực sự khá tốt, cho một tính năng cú pháp kỳ quặc như vậy. Nếu không có dòng trống nào trong chương trình sau print(<<""dòng, Perl chỉ cần nói:

Không thể tìm thấy bộ kết thúc chuỗi "" ở bất cứ đâu trước EOF tại dòng 1 của foo.pl.

Nếu có một dòng trống ở phần cuối của chương trình, bạn sẽ có được một cái gì đó giống như thay vì điều này:

lỗi cú pháp tại foo.pl dòng 4, tại EOF
  (Có thể là một chuỗi << chạy nhiều dòng bắt đầu trên dòng 1)
Việc thực thi foo.pl bị hủy bỏ do lỗi biên dịch.



4

Hồng ngọc

Xóa dòng đầu tiên sẽ gây ra lỗi:

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
Tôi thích thông báo lỗi. Muốn xem phản ứng của ai đó cố gắng chạy chương trình và nhận được phản hồi đó.
tomsmeding

4

Con trăn

Không biết nếu điều này rơi vào sơ hở tiêu chuẩn, tôi đã xem danh sách và không thấy điều này.

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

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

Chạy này thường xuyên trở lại

Hello World!

Chạy nó mà không có dòng trống trên dòng 4, tức là như dưới đây:

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

trả lại không có gì.


3

Python 2.x

Chương trình này xuất ký tự thứ năm của chuỗi nhập vào.

import inspect

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

Đây không phải là cách ẩn. Nếu bạn loại bỏ dòng trống, nó sẽ cho ký tự thứ tư và thứ sáu nếu bạn thêm một dòng.


3

Tcl

Hàm thêm hai số (và kiểm tra xem dòng mới đã bị xóa chưa):

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

    return [expr $a+$b]
}

Không có gì để che giấu ở đây, nó làm những gì nó nói, vì vậy tôi không làm hỏng lời giải thích. Chức năng infonày là một con dao quân đội thụy sĩ của sự hướng nội (điều mà các ngôn ngữ khác gọi là sự phản chiếu). info bodytrả về mã nguồn của hàm (nếu không được viết bằng C hoặc assembly).

Tôi phải thừa nhận rằng điều này đã làm tôi bối rối cho đến khi tôi thấy giải pháp 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;
}

Với dòng trống, alà biến cục bộ a và không có tham số macro ...


3

Về mặt kỹ thuật không phải là vấn đề "mã", mà là vấn đề của máy chủ. Nếu điều này được gửi tới Apache từ tập lệnh CGI (có thể được tạo bằng bất kỳ ngôn ngữ nào bạn muốn), nó sẽ gửi phản hồi HTTP đến máy khách:

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

Hello world!

Mặt khác, điều này sẽ thất bại vì nó thiếu khoảng trống sau tiêu đề.

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

2

JavaScript

Hàm whereamiđáp ứng với vị trí của đường dây gọi, liên quan đến vị trí của chính nó trong mã nguồn.

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

Nếu bất kỳ dòng trống trong whereamichức năng được loại bỏ. Đầu ra là NaN line(s) confusing me. (Thêm dòng không phá vỡ nó)

Nó thực sự chỉ tính có bao nhiêu dòng nằm giữa ivà dòng đầu tiên và dòng cuối cùng tương ứng. Nếu họ thuộc một giá trị nhất định. Dòng tham chiếu được đặt thành NaNkhông thỏa mãn NaN<callingLinecũng không NaN>=callingLine. Tôi đã cố gắng để che giấu nó một chút trong các biểu thức ternary không thể đọc được.


1
Mát mẻ. Tôi đã không nghĩ đến việc sử dụng ngăn xếp ngoại lệ như thế.
nderscore

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;

Tập lệnh perl này sẽ đọc tệp tập lệnh và kiểm tra xem sau dòng có chứa "blabla" có dấu ngoặc đóng hay không.


2

Bản thảo

Do lỗi trong escriptquá trình triển khai, bản mô tả hợp lệ phải dài ít nhất ba dòng và dòng đầu tiên là dòng shebang hoặc dòng trống. Vì vậy, đoạn script sau vội vàng để có hai dòng trống trong đó dòng đầu tiên phải là dòng đầu tiên:

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

Hoặc nó đã bị phá vỡ thành hai dòng nhưng vẫn phải có dòng trống đầu tiên.

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

Nếu không bạn sẽ nhận được

escript: Premature end of file reached

2

Hồng ngọc

print %q
2+2=

p(2+2)

In 2+2=4, nhưng đưa ra một lỗi cú pháp mà không có dòng thứ ba trống. %qcho phép bất kỳ ký tự không phải từ nào đóng vai trò là một dấu phân cách chuỗi, thậm chí là ký tự dòng mới. Vì vậy, ba dòng mã đầu tiên thực sự tương đương print %q"2+2="hoặc chỉ print "2+2=". Vì dòng mới sau khi 2+2=được sử dụng làm dấu phân cách trích dẫn, nên nó cũng không được phân tích cú pháp như một dấu phân cách dòng , vì vậy bạn cần một dòng khác ngay sau đó.


1

Mất ngủ (cả hai phiên bản)!

Þyoo

â

Mã này in một ~ (đừng hỏi tại sao, mất ngủ là lạ). Nếu bạn xóa dòng trống, nó sẽ in một thay thế.

Nhân tiện, lá thư đầu tiên là một cái gai .


1
Hoan hô, gai! Không thấy nhân vật đó ở độ tuổi, +1.
Addison Crump

0

C ++

Đây là một thủ thuật cổ điển và khá ngu ngốc. Bạn sẽ biết nó là gì khi bạn nhìn thấy nó, đây chỉ là ở đây để hoàn thành. Như vậy, tôi đánh dấu đây là một câu trả lời wiki cộng đồng.

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

    return 1;
}

Tại sao điều này hoạt động


13
Đây thực sự là một trong những sơ hở.
Mhmd

@Mhmd Tôi không biết. Dù bằng cách nào, tôi biết mọi người luôn sử dụng câu hỏi này trong các loại câu hỏi này và tôi chỉ muốn để nó ở đây chỉ để ai đó không thấy thông minh khi làm điều này.
Aearnus

1
Câu trả lời này sai vì hai lý do. Đầu tiên là điều đó ??/có nghĩa là \​, vì vậy ??//có nghĩa là \/, và vì dòng không kết thúc \​, không có tiếp tục dòng. Thứ hai là hành vi hoàn toàn giống nhau bất kể có return 0;được thực hiện hay không, bởi vì đó là hành vi tiêu chuẩn khi việc thực hiện mainđạt đến mức đóng }.
hvd

@hvd Có. Tôi sửa nó rồi.
Aearnus

3
@cra I know people always use this in these kinds of questionđó là lý do tại sao chúng tôi biến nó thành một kẽ hở tiêu chuẩn
ngầm cá nhân

0

Dán tệp này vào tệp html và mở tệp trong trình duyệt của bạn. Nó khá đơn giản, nhưng hơi khó vì nó lấy số dòng trống trong tài liệu và lập chỉ mục một mảng để gọi một hàm hiển thị cảnh báo.

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

Đây là một phá vỡ quy tắc biên giới. Về mặt kỹ thuật, JavaScript không có các chuỗi nhiều dòng, đó là lý do duy nhất để nó hoạt động.

Vì bạn có thể có lỗi cú pháp trong một thẻ tập lệnh mà không can thiệp vào các thẻ tập lệnh khác, điều này chỉ hiển thị kết quả dương tính nếu có lỗi trên trang. Lỗi này ngăn cảnh báo thứ hai phát ra vì nó nằm trong cùng một thẻ script.

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

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

0

Hồng ngọc

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

)

Bí mật là dòng mới, thực sự là một tab, sau đó là một dòng mới. Tôi không biết nếu điều này được tính nhưng tôi nghĩ đó là cleaver. Ký tự sau đó %cũng là một tab, nhưng vì một số lý do, nó không hiển thị như một. Tôi đang sử dụng ký hiệu phần trăm của Ruby để tạo một chuỗi, thêm 2 đối số đầu tiên được truyền vào tập lệnh. Có nhiều hơn về điều đó ở đây: http://teohm.com/blog/2012/10/15/start-USE-ruby-percent-notation/


Nó thực sự không được tính, đọc hướng dẫn: "Không lừa đảo khoảng trắng." Chính xác một người \nnên có mặt và rất quan trọng để chương trình hoạt động như mong đợi.
Naftuli Kay

À ok :( tôi cũng đã thử
addison

1
Tôi nghĩ rằng bạn có thể khắc phục điều này, mặc dù: một dòng mới có thể là một dấu phân cách phần trăm.
lịch sử
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.