예기치 않은 기능을 유발하는 소스 코드에서 빈 줄 삭제 [닫기]


38

프로그램 논리 흐름에 빈 줄이 있으면 제대로 작동하지만 해당 줄을 제거하면 예기치 않은 동작이 발생하거나 중단되는 스크립트를 작성하십시오.

표준 허점 과 어리석은 대답을 피하십시오 . 프로그램이 몇 가지 정수를 추가하더라도 "유용한"기능을 수행해야합니다.

여러 줄 문자열에서 예상되는 출력이 기술적으로 변경되지 않아야하는 경우가 아니면 (예 : 일치하는 모든 빈 줄을 제거하는 경우 ^$) 여러 줄 문자열에서 빈 줄을 제거하면 계산되지 않습니다 .

공백 바보도 허용되지 않습니다. 캐리지 리턴, 탭, 공백 등으로 이상한 일을하지 마십시오.


11
공백을 제외해야한다고 생각합니다.
nneonneo 2016 년

17
공백 " 표준 허점 " 이라고 생각합니다
core1024

5
nneonneo는 공백 만 사용하는 언어 인 공백 에 대해 이야기 하고 있습니다.
Kyle Kanos 2018 년

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문자열을 찾지 못하면를 반환 합니다.

비트 단위 연산 ( ~)을 수행하면 -1로 변환되어 0잘못된 값이됩니다.


2
이게 무슨 속임수입니까?!
Kroltan

1
arguments.callee함수의 소스를 포함합니다.
Matthew

2
이것은 더 이상 엄격 모드 (대부분의 최신 코드에서 사용)에서 작동하지 않습니다. 엄격 모드는의 사용을 금지합니다 arguments.callee.
Daniel Lo Nigro 2016 년

1
@Michael : 아니요. spec은 정확한 형식에 대해 아무 것도 말하지 않습니다. 실제로 공백을 유지하지 않는 엔진이 실행됩니다.
Bergi

2
@DanielLoNigro 함수 표현식에 이름을 부여하고 대신에 이름을 사용할 수 있습니다 arguments.callee. 심지어 더 짧게 만듭니다.
고양이

42

이 마술 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 구문 분석기는 백 슬래시와 개행 문자를 볼 때 두 문자를 모두 무시하고 두 번째 행을 첫 번째 행의 연속으로 취급합니다. 빈 줄이 없으면 "무관심한"답변이 모두 이전 주석의 일부로 처리됩니다.


51
나는 +1했지만 백 슬래시로 끝나는 C 주석이 표준 허점 인 IMO가되기 시작했다.
Tim S.

2
이 "표준 허점"post 에 대한 참조 이므로 문자 그대로 "허점"이 아닐 수도 있습니다.
Tim S.

5
@TimS. 이 "솔루션"에 지루하다면 왜 공감 했습니까?
John Dvorak

8
백 슬래시-다음 줄에 주석으로 답 (3 점 또는 3 점 없음)은 내가 125의 평판을 얻었기를 바랍니다. 나는 그들을 계속보고 있으며 , 그들은 끔찍하게 반복되고, 완전히 꿰뚫 리며, 더 이상 영리하거나 재미 있지 않습니다. (어떠한 방식으로 그들이 분노를받을 자격이 때로는이 전혀 인식하지 못하고 있기 때문에 사람들에게 불행한 어떤 여기 점잔 빼는 것처럼, 그들을 사용 -하지만 트릭 . 그것을 적립됩니다)
doppelgreener

4
표준이 시작하는 긴 표준 /의 과장과 동일하지 않습니다 @Jan ... 그것의 사용은하지 않는, 여기 꽤 똑똑 보면 내가 알수없는에서 문자 (들)이있는, 본 적이 일부와는 달리 (장소 밖으로 주석의 끝 또는 주석 시작 문자로 주석을 종료하여 비정상적인 작업을 수행하십시오. 그래서 : 나는 그 속임수를 계속 사용하는 것이 아니라 해결책을 찬성했습니다.
Tim S.

37

베 펀지 -93

v
&
&
+
#

.
@

내 첫 번째 프로그램 :)

입력에서 두 개의 숫자를 읽고 합계를 인쇄합니다. 빈 줄을 삭제하면 아무 것도 인쇄되지 않습니다.

설명:

v세트의 코드를 실행하는 하향 방향
&의 정수 판독
+함께 번호를 추가
#, 다음 명령은 생략
.스택의 정수 인쇄
@프로그램을 종료

작성된 것처럼 #빈 줄을 건너 뛰고로 끝납니다 .. 빈 줄을 삭제할 때 구매를 .건너 뜁니다.

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

줄 바꿈이 맨 위에 있으면 제대로 작동합니다. 그렇지 않으면 첫 번째 주석 줄이 셸에 의해 잘못된 셰방으로 해석됩니다.


3
이것이 항상 작동하지 않거나 항상 작동하지 않습니까? 예를 들어, ruby youranswer.rb로 실행했다면 루비 인터프리터에서 이미 실행 중이기 때문에 shebang을 찾지 않지만, shebang이 없기 때문에 실행 ./youranswer.rb되지 않으면 실행되지 않습니다.
Reinstate Monica

6
적어도 내 루비에서는 shebang을로 실행하더라도 명예를 얻으 ruby youranswer.rb므로 파일에 필요한 명령 줄 스위치를 설정하는 데 유용 할 수 있습니다. 따라서 줄 바꿈없이ruby: no Ruby script found in input (LoadError)
histocrat

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.

이것은 스칼라 세미콜론 추론의 코너 사례입니다. 일반적으로 개행은 결과 코드가 유효 할 때마다 세미콜론을 얻습니다. 그러나 스칼라 개발자는 사람들이 이집트 괄호 를 사용하도록 강요하지 않기 때문에 클래스 정의에 대한 괄호를 줄에 바로 넣는 것이 유효합니다. 그러나 빈 줄은 클래스 정의와 대괄호를 구분합니다. 빈 줄을 제거하면 코드가 클래스 정의 및 블록에서 생성자가 포함 된 클래스 정의로 변경됩니다.


6
이집트 브라켓을 강요하지 않는 것이 아주 좋습니다. 그러나 세미콜론 추론은 나쁜 생각입니다.
Almo

세미콜론 추론은 주로 JavaScript로 인해 잘못된 이름을 얻습니다. 언어를 염두에두고 디자인하면 고통이 덜합니다 (예를 들어 Python에서는 아무도 불평하지 않습니다). 불행히도 스칼라는 세미콜론 추론으로 잘 작동하지 않는 몇 가지 기능을 포함했습니다. 이것과 postfix 연산자가 있습니다 (제 답변에 사용하고 싶었지만 약간 통행입니다).
James_pic 2016 년

2
@James_pic : AFAIK 파이썬에는 존재하지 않기 때문에 아무도 파이썬에 대해 불평하지 않습니다. JS에서 세미콜론은 구문의 필수 부분이며 특정 지점에 삽입 (추론) 될 수 있습니다. 파이썬에서 세미콜론은 구문의 필수 부분은 아니지만 선택적으로 사용할 수 있습니다. 큰 차이가 있습니다.
메이슨 휠러

큰 차이처럼 보일 수 있지만 Scala가 현재 문장 경계를 모호하게 만드는 몇 가지 기능을 제거하면 JavaScript의 측면에서 Python으로 이동합니다.
James_pic

1
@James_pic : 파이썬을 다르게 만드는 것은 이스케이프되거나 대괄호 안에 들어 가지 않는 한 개행이 문장을 종료한다는 것입니다. 그것은 완전 / 불완전한 규칙이 없다는 것입니다.
Jan Hudec

27

GolfScript

~{.@\%:

}do;

두 개의 0이 아닌 정수의 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

@ 데니스 와우. TIL 짝수 문자열도 변수로 사용할 수 있습니다. 그게 유용한가요?
John Dvorak

@JanDvorak : 제외하고 일부 가장자리의 경우 (상동 코드에서 불공정 코드 , 아마 나는 이것이 단지 (라고 생각합니다. 문서화 GolfScript 인터프리터가 토큰에 코드를 분할하는 방법의) 부작용.
데니스

@Dennis는 .:-1입력을 -1마이너스 부호가 아닌에 저장하는 것을 의미 합니까? 흠 ...
존 드보락

23

미디어 위키 템플릿 구문

템플릿 : 푸를 다음과 같이 정의

{{{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 (역 참조)

다음 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 기능도 포함합니다. 빈 줄을 제거하면 알고리즘이 트리거되어 유지 관리가 불충분 한 프로그램을 거부합니다.

라인 연속 또는 삼단 그래프가 없습니다. 나는 그것이 유효한 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매크로입니다. 전 처리기의 문자열 연결 기능을 사용 하면의 패리티를 실제로 검사한다는 사실을 가장 할 수 있습니다 __LINE__.


tcc -run
Vi 와도

정말 깔끔합니다. 그것은 vfry함수 정의에서 확장되지 않았기 때문에 실제로 나를 혼란스럽게했습니다.
FUZxxl

11

이 프로그램은 이전의 빈 줄을 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


@TheRare 그러나 덜 명확합니다.
Ypnypn 2016 년

6
오른쪽으로 매우 눈에 띄는 백 슬래시를 보지 않으면 덜 분명합니다. (그러나 그들이 눈에 띄게 오른쪽에 떠 있기 때문에, 그것들을 보게 될 것입니다.)
doppelgreener

3
그러나 이들 중 하나를 제외한 모든 것이 정당합니다
QuadmasterXLII

6
기술적으로 말하면 @QuadmasterXLII는 모두 정확하고 정확합니다.
Mark

9

C / C ++

int main(){

    return __LINE__ - 3;
}

성공을 리턴하고 true 구현으로 사용할 수 있습니다 . 빈 줄이 제거되면 대신 거짓 구현으로 사용할 수 있습니다 .


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

TeX

\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
코드 리뷰를 자주 방문하지만 왜 Java를 사용하지 않는지 궁금합니다 Math.pow.
Simon Forsberg

내 코드는 무언가를해야하기 때문입니다. 2 개의 숫자를 추가하는 것은 너무 간단합니다.
barteks2x

Math.pow결과를 사용 하고 인쇄하여 무언가 를하고 있습니까?
Simon Forsberg 2018 년

그리고 나는 정말로 내가 .Math.pow를 사용할 수 있다는 것을 깨달았다. 나는 왜 그렇게해야한다고 생각하는지 모르겠다.
barteks2x 2016 년

7
당신은 너무 많은 골프를하고 있습니다. 올바른 일을하는 대신 Code Review 를 방문하십시오 !
Simon Forsberg

6

펄 5

print(<<""
Hello, World!

);

이 코드는 인쇄합니다 Hello, World!. 빈 줄을 제거하면 구문 오류가 발생합니다.

설명:

여러 줄 문자열에 대한 Perl의 here-doc 구문 은 빈 종결 자 문자열을 허용합니다. 심지어 명시 적으로 문서화되어 있습니다. 빈 줄을 제거하면 닫는 괄호 (및 다음 빈 줄이있는 경우 그 밖의 모든 줄)가 문자열의 일부로 해석되어 구문 오류가 발생합니다.

당신이 얻는 오류 메시지는 실제로 이상한 홀수 구문 기능으로 꽤 괜찮습니다. print(<<""줄 뒤에 프로그램에 빈 줄이 없으면 Perl은 단순히 다음과 같이 말합니다.

foo.pl 1 행에서 EOF 앞의 문자열 종결 자 ""를 찾을 수 없습니다.

이 경우 프로그램의 끝 부분에 빈 줄, 당신이 대신 뭔가를 얻을 :

EOF에서 foo.pl 4 행의 구문 오류
  (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

파이썬 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 또는 어셈블리로 작성되지 않은 경우).

나는 자바 스크립트 솔루션을 볼 때까지 이것이 나를 혼란스럽게했다는 것을 인정해야합니다.


3

#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

기술적으로는 "코드"문제가 아니라 서버 문제입니다. CGI 스크립트를 통해 Apache로 보내지면 (언제든지 원하는 언어로 생성 할 수 있음) 클라이언트에게 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

자바 스크립트

이 함수 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
시원한. 나는 그런 예외 스택을 사용하는 것을 생각하지 못했습니다.
nderscore

2

#!/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;

이 펄 스크립트는 스크립트 파일을 읽고 "blabla"을 포함하는 줄 뒤에 닫는 괄호가 있는지 확인합니다.


2

Escript

escript구현상의 버그로 인해 유효한 escript는 3 줄 이상이어야하고 첫 줄은 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의 나이에 그 캐릭터를 보지 못했습니다.
애디슨 크럼

0

C ++

이것은 고전적이고 다소 멍청한 트릭입니다. 당신이 그것을 볼 때 그것이 무엇인지 알 것입니다. 이것은 완성을 위해 여기 있습니다. 따라서 저는 이것을 커뮤니티 위키 답변으로 표시하고 있습니다.

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

    return 1;
}

왜 이것이 작동 하는가


13
이것은 실제로 허점 중 하나입니다.
Mhmd

@Mhmd 나는 몰랐다. 어느 쪽이든, 나는 사람들이 항상 이런 종류의 질문에 이것을 사용한다는 것을 알고 있으며, 나는 누군가가 이것을하기 위해 영리하지 않도록 이것을 여기에두고 싶었습니다.
Aearnus 2016 년

1
이 답변은 두 가지 이유로 잘못되었습니다. 먼저 즉 ??/의미 \​하므로, ??//방법 \/및 광고가 끝나지 않는 한 \​, 어떠한 광고 연속 없다. 두 번째는 실행 여부에 관계없이 동작이 정확히 동일 return 0;하다는 것입니다. 실행이 main닫힘 에 도달 할 때의 표준 동작이기 때문입니다 }.
hvd

@hvd 거기. 나는 그것을 고쳤다.
Aearnus

3
@cra 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}

)

비밀은 줄 바꿈이 실제로 탭이고 줄 바꿈이라는 것입니다. 이것이 중요한지 모르겠지만 나는 그것이 칼이라고 생각했습니다. 뒤에 나오는 문자 %도 탭이지만 어떤 이유로 든 표시되지 않습니다. 나는 루비의 퍼센트 표기법을 사용하여 문자열을 만들었습니다. 여기에 더 많은 것이 있습니다 : http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


실제로는 계산에 포함되지 않습니다. "공백이 없습니다." 정확히 하나 \n있어야하며 프로그램이 예상대로 작동하는 데 결정적이어야합니다.
Naftuli Kay

Ah ok :( 잘 시도했습니다
addison

1
그래도 당신이 이것을 고칠 수 있다고 생각합니다 : 줄 바꿈 자체는 백분율 구분 기호가 될 수 있습니다.
histocrat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.