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


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.