쓸모없는 것처럼 보이는 프로그램에 줄을 쓰십시오.


26

일부 프로그램 (크기는 중요하지 않음)을 작성하고 쓸모없는 것처럼 보이지만 실제로는 중요하지 않습니다. 제거 할 경우 프로그램이 충돌하거나 잘못 될 수 있습니다. 주석에 의해 사용되지 않는 줄을 표시하거나 아래 예와 같이 코드 설명을 언급하십시오 (물론이 예에서는 실제로 필요하지 않습니다. 단지 예일뿐입니다).

int main(void) {
    /* The line below is actually needed. */
    2 + 2;

    return 0;
}

이것이 인기 콘테스트이므로, 가장 많은 표를 얻은 솔루션이 승리합니다.


2
예제의 라인이 왜 필요한가요?
Gari BN

3
@GariBN 아닙니다. "이 예제에서는 실제로 줄이 필요하지 않습니다. 단지 예일뿐입니다."
elixenide

9
@EdCottrell 알아두면 좋은 점 ... 기본 사항을 놓쳤다 고 생각했습니다 ...
Gari BN

2
그래서이 되고 필요로했다. 예를 들어. :-)
Florian F

1
나는이 문제를 주제로 다루지 않기로 결심했다. 왜냐하면이 사이트에서 미숙 한 도전은 더 이상 주제가 아니기 때문이다. meta.codegolf.stackexchange.com/a/8326/20469
cat

답변:


33

기음

int main(int argc, char **argv) {
    switch(argc) {
        case 2:
            ;
            int allowed = 0;
        case 3:
            argc--;
            break;
        default:
            argc = 3;
    }
    return 0;
}

single을 제거하면 컴파일되지 않습니다 ;.

편집 :

아래 해결책 :

이는 case명령문이 레이블 일 뿐이 므로 명령문 다음에 명령문이 있어야합니다 (표준은 선언을 배제하는 "수행 할 조치 지정자"라고 함). 이를 방지하기 위해 선언 앞에 ;, null 문을 붙 입니다. 사양 case라벨이 발견 될 수 여기 (인 문서 (131)) 페이지 (142)


4
GCC는 "라벨은 명령문의 일부일 수 있으며 선언은 명령문이 아닙니다"라고 말합니다.
Vortico

1
나는 학교에서 쓰는 프로그램에서 이것에 물렸다.
Kevin-복원 모니카

이렇게하면 실제 프로그램이 실제로보기 흉하게 보입니다.
val은

23

C / C ++

소개 / 튜토리얼 스타일로 작성된 일부 코드 ...

튜토리얼 번호. 2 : 숫자 읽기, 수학 연산 수행 및 결과 인쇄.

//////////////////////////////////////////////////
///////////////////////////////////////////////////
/////                                            //
/////           T  U  T  O  R  I  A  L           //
/////                                            //
///////////////////////////////////////////////////

#include "stdio.h"

int main()
{
    ///////////////////////////////////////////////
    // Local variables (int means integer!!)      /
    int a, b, result;

    ///////////////////////////////////////////////
    // Reading them in                            /
    scanf("%d", &a);
    scanf("%d", &b);

    ///////////////////////////////////////////////
    // Performing an operation, e.g. addition!!!  /
    result = a+b;

    ///////////////////////////////////////////////
    // Why is the next line absolutely mandatory??/
    result = 42;
    printf("The result is: %d", result);

}

result = 42;언뜻보기에 불필요한 줄 을 제거하면 언급 된 목표를 고려할 때 실제로 잘못되어 실제로 프로그램이 설명의 내용을 수행하지 못하게됩니다.

왜?

3 부작이 다시 쳤다! ?? /\로 전처리기로 대체되어 다음 줄을 주석으로 연결합니다. 결과 = 42; 주석의 일부가되므로 인쇄 라인을 "저장"합니다. 함께 결과 = 42; 줄이 제거되면 주석으로 printf 줄이 삼켜집니다. 일부 컴파일러는 경고를 표시하거나 삼중 그래프가 기본적으로 꺼져있을 수 있으며이 예제가 작동하려면 켜져 있어야합니다. 구문 강조는 또한 그것을 배신 할 수 있지만, 당신을 더 현명하게 남겨 두는 컴파일러와 IDE가 있습니다.


적어도 gcc에서는이 플래그 (-trigraphs)를 추가하여 trigraphs를 사용하도록 지정해야합니다. 이것이 없으면 gcc는 경고를 일으키고 3 점을 무시합니다.
Gari BN

4
좋은 것! 나는 그것을 알아 내기 전에 너무 멀리 스크롤하지 않았기 때문에 기쁘다. 블록 인용구를 >!그냥 대신 시작하여 스포일러 텍스트로 변경할 수 있습니다 >.
으스스한 ossifrage

@ squeamishossifrage : 감사합니다. 이것은 원래의 의도였습니다 >!. 모든 라인에서 사용 하지는 않았습니다. 나는 그들이 쓴대로 그들은 나를 위해 표시되지 않습니다. 흥미롭게도, SE 파서는 그것을
망치지

1
나는 "stdio.h"실제 라이브러리 포함 대신 로컬 포함을 보았을 때 두 번째로 몰래 뭔가가 있다는 것을 알았습니다 .<stdio.h>
Braden Best

1
내가 말한 불필요한 의견을 보자 마자 "삼각형은 어디에 있습니까? 삼각법이 있어야합니다. 아, 거기 있습니다."
고양이

19

공백

불행히도 StackExchange는 모든 후행 공백을 제거하기 때문에 여기에 프로그램을 표시 할 수 없습니다. pastebin.com과 pastie.org도 마찬가지이므로 연결할 수 없습니다.

물론, 전체 프로그램은 "무용지물처럼 보입니다".


41
때문에 그러나 다행스럽게도 값의 아무 것도 손실되지 않습니다 전체 언어가 쓸모 :-)입니다
점잔 빼는 ossifrage가

1
@Timwi "raw paste data"상자는 어떻습니까?
Braden Best

1
@Timwi 여기서 방금 테스트했으며 , 무슨 뜻인지 알았습니다. 그러나 공백이 아닌 텍스트를 넣으면 제출되고 원시 붙여 넣기 데이터는 그대로 유지됩니다. 예를 들어 "원시 붙여 넣기 데이터를 복사하고이 줄을 삭제하십시오"라는 추가 줄을 추가 할 수 있습니다.
Braden Best

8
\ t를 t로 바꿉니다. ""를 s로 바꾸고 \ n을 n으로 바꾸십시오
Cruncher

7
최고의 장난 : 실제로 코드를 작성하지 않고 무언가를 게시하십시오.
Kaz Wolfe

9

자바 스크립트 :

for (var a = 0, b = 4; ++a < b; a++)b+-

2 + 2; // This line is needed, or it will alert twice!
alert(a);

의 몸이 있기 때문에 그것이 작동하는 이유는 for이다 b+-,하지 b++또는 b--; 따라서 필요한 행을 제거하면 b의 값에 추가됩니다 -alert(a).


"이 추가됩니다 b의 가치 alert(a)"그래서는 안 b+-b+=?
Gaurang Tandon

@GaurangTandon 아니오; 아이디어는 b++또는 처럼 보입니다 b--.
칫솔

b +-실제는 무엇을 의미합니까?
Mhmd

5
@ user689 b + -2 + 2. 을 사용하여 행을 삭제하면로 2 + 2;평가됩니다 b + -alert(a);.
칫솔

8

기음:

#include <stdio.h>
#include <string.h>

int main() {
    int i,sum;
    char s[4];

    /* Add all the integers < 1000 that contain no '0' or '9' */
    sum=0;
    for (i=0; i<1000; i++) {
        sprintf(s,"%d",i);
        if (strchr(s,'0')) goto skip;
        if (strchr(s,'9')) goto skip;
        sum += i;
      skip:
        i = i; /* Don't delete this line! */
    }
    printf("The answer is %d\n",sum);  /* <<< Should be 258948 */
    return 0;
}

i = i;을 삭제하면 코드가 작동하지 않습니다. 이 때문입니다...

... 사실조차 컴파일되지 않습니다. C 표준에 따르면 위의 예에서 skip 과 같은 레이블 은 명령문과 연관 되어야합니다 . 단일 세미콜론으로도 충분하지만 전체 행을 삭제하면 레이블에 연관된 명령문이없고 컴파일에 실패합니다. 이 답변 은 좀 더 자세히 설명합니다.


7

APL

APL 기능은 다음과 같습니다.

i_←{
  ⍺←⎕IO ⋄ ⎕IO←⍺
  ⍵⍴⍳×/⍵
}

J의 monadic과 동일한 기능을 수행합니다 i..

      i_ 5 5
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

오프셋을 제공하는 선택적 왼쪽 인수를 사용할 수 있습니다.

      0 i_ 5 5
 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

이 줄 ⍺←⎕IO ⋄ ⎕IO←⍺은 쓸모 없게 보이며 ( "assign ⎕IOto , assign to ⎕IO"), 첫 번째 부분은 왼쪽 인수가 주어지지 않은 경우에만 실행되므로 실제로 무언가를 수행합니다.

  • 지정하지 않으면 (global)으로 설정하십시오 .⎕IO
  • (로컬) ⎕IO

7

기음#

Func<int, int> fibo;
fibo = null; //Note that this can be set to *any* Func<int, int> reference.  It doesn't matter.
fibo = x => x < 1 ? 1 : fibo(x-1) + fibo(x-2);

fibo람다를 fibo자체에 할당하더라도 변수 를 람다 내에서 사용하려면 먼저 변수 를 할당해야합니다 . (겉으로는 쓸모없는) 할당을 제거하면 컴파일러 오류가 발생합니다 (“할당되지 않은 로컬 변수 'fibo'사용”).


null 참조 예외가 아니며 초기화되지 않은 변수 컴파일러 오류입니다. 또한 선언이 쓸모가 없기 때문에 선언을 자체 줄로 옮기는 것이 좋습니다.
Kendall Frey

@KendallFrey 좋은 지적입니다! 결정된.
벤 라이히

5

윈도우 배치 :

echo hello
pause
echo world

프로그램 실행을 설정하고 파일을 다음과 같이 수정하십시오.

rem test01
pause
echo hello world

주석을 제거하거나 크기를 조정하면 프로그램의 첫 번째 인스턴스가 일시 중지 된 후 19 바이트부터 계속 해석되어 혼란을 초래할 수 있습니다.


의견이 없습니다.
오리온

4
REM (
비고

4

자바

package stackexchange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Curl
{
    public void getUrl(String address)
    {
        try {
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            /* don't remove this line! */
            http://codegolf.stackexchange.com

            while( true ){
                String line = input.readLine();
                if( line==null ) break http;
                System.out.println(line);
            }

            input.close();

        } catch(IOException ex){
            // ignore.
        }
    }

    public static void main(String[] args) {
        Curl curl = new Curl();
        curl.getUrl("http://codegolf.stackexchange.com");
    }
}

URL에서 웹 페이지를 검색하는 작업 프로그램입니다. 당신은 라인이 놀라 울 수 있습니다

            http://codegolf.stackexchange.com

경고없이 컴파일합니다. 실제로 프로그램이 없으면 프로그램이 컴파일되지 않습니다.

실제로는 레이블 http:이며 뒤에 주석이옵니다 //codegolf.... 레이블은 while에 적용되며 break http;명령문에 사용됩니다 .


1
약간의 설명을 부탁드립니다.
Bill Woodger

3

루비

require 'prime'

# Given a regular expression, return the smallest prime containing it
# and the substring of the prime that matches it
def smallest_prime_matching_regexp(regexp)
  match = 'this assignment is necessary even though the value is never used'
  prime = Prime.find { |n| match = n.to_s[regexp] }
  return prime, match
end

[ /4/, /1+2/, /[02468]{2,}/ ].each do |regexp|
  prime, match = smallest_prime_matching_regexp(regexp)
  puts "#{regexp.inspect}:\t#{prime} (#{match})"
end

최근에 비슷한 일이 일어났습니다. 동료가 실제로 코드 검토 중에 필연적으로 불필요한 초기화를 표시했으며 실제로 설명을 스포일러 블록 안에 넣는 유혹을 받았습니다. 그래서 여기서하겠습니다.

블록 내부에서 초기화 된 변수가 해당 블록에 로컬이기 때문에 행이 필요합니다. 블록 외부에서 초기화하면 값이 메소드 범위를 벗어날 수 있습니다.

있는 그대로 출력 :

/4/:    41 (4)
/1+2/:  127 (12)
/[02468]{2,}/:  223 (22)

메소드의 첫 번째 라인이 제거 된 출력 :

main : Object에 대한 정의되지 않은 지역 변수 또는 메소드`match '(NameError)


1
그이 필요한 이유는 매우 분명하다 ... 어쨌든, 더 좋은 방법이 바로 될 것이다 쓰기match = Prime.find { |n| n.to_s[regexp] }
손잡이

1
그것은 내가 원하는 것을하지 않을 것입니다 ... Prime.find반환 n(예 : 223), match있어야합니다 n.to_s[regexp](예 : "22"). 분명히 나는 ​​그것을 필요로하는 문제를 해결했다.
histocrat

아 죄송합니다, 당신은 배열이 아닌 전화 findPrime하고 있음을 알지 못했습니다. 어쨌든, 왜 그 라인이 필요한지 알아 차리는 것은 여전히 ​​쉬운
Doorknob

충분합니다. 어쩌면 내 동료가 관찰되지 않았을 수도 있습니다.
histocrat

허. 변수 선언은 없지만 파이썬이하는 것과 로컬 / 비 로컬을 기본 설정하는 반대의 접근 방식. 루비를 배우기로 결정하면 이상하게 느껴질 것입니다.
user2357112는 Monica

3

PHP

<?php
$some_html_text= <<<EOT
<h1>This is a Header </h1>
<body> This is a body </body>
EOT;
//This is a comment    

여기 \n//This is a comment가 필요합니다. 그것이 없으면 코드가 실행되지 않습니다.

제대로 실행 \n한 후 최소한 숯이 필요 EOT;합니다


3

자바 스크립트

var a = function(b) {
    return b;
}

; // This must be here

(function() {
    // more code
}());

세미콜론이 없으면 a두 번째 함수의 반환 값이 undefined됩니다. 이 경우에는 반환 값입니다 . 원래 할당 된 함수 a는 두 번째 함수를 인수로하여 바로 실행되기 때문 b입니다.


2

COBOL (IBM 메인 프레임)

   ID DIVISION. 
   PROGRAM-ID. USELESS. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  W-WHEN-COMPILED              PIC X(8)BX(8) VALUE SPACE.
   PROCEDURE DIVISION. 
       IF W-WHEN-COMPILED EQUAL TO SPACE 
           NEXT SENTENCE 
       END-IF 
       MOVE SPACE                   TO W-WHEN-COMPILED. 
       MOVE WHEN-COMPILED           TO W-WHEN-COMPILED 

       DISPLAY W-WHEN-COMPILED " HELLO WORLD!" 
       GOBACK 
       . 

위의 프로그램 (COBOL II 이후의 IBM Mainframe COBOL (첫 번째 IBM 컴파일러는 1985 표준, 아마도 다른 IBM COBOL) 이후)을 실행하면 출력은 다음과 같습니다.

02/22/14 13.11.02 안녕하세요 세계!

그러나 세 번 쓸모없는 줄 "MOVE SPACE TO W-WHEN-COMPILED"를 제거하면. (필드는 초기 공간 값을 가지며 다음 명령에서 다른 내용을 포함하며 어쨌든 분기됩니다) 프로그램은 출력을 생성하지 않으며 실제로 다음 메시지와 함께 이상 종료 (U4038) (충돌을 의미합니다) :

 IGZ0037S The flow of control in program USELESS proceeded beyond the 
          last line of the program.  From compile unit USELESS at entry 
          point USELESS at compile unit offset +000003AC at entry offset
          +000003AC at address 119003AC. 

(메시지 코드와 텍스트는 컴파일러마다 다르며, 오프셋은 사용 된 실제 컴파일러 및 컴파일 옵션에 따라 다르며, 주소는 EXECuted시 프로그램이로드되는 위치에 따라 다릅니다).

이유는 NEXT SENTENCE입니다. 이것은입니다 Secret GO TO. 컴파일러는 소스에서 다음 전체 정지 / 기간을 찾아 내고 다음 명령어에 대한 분기를 생성합니다. COBOL II부터는 전체 정지 /주기 사용이 완화되었습니다. 프로그램은 완전 정지 / 마침표로 끝나야합니다. 이 경우 분기는 프로그램 끝에서 벗어납니다.

두 프로그램 모두 100 % 깨끗하게 컴파일됩니다 (진단 메시지 없음, 리턴 코드 0).

이 동작은 COBOL에 대한 "IBM Extension"입니다. 1985 표준은 허용하지 않는 NEXT SENTENCE내부 IF/ END-IF( CONTINUE무 조작하지되는 대신에 사용된다). IBM은이를 허용하여 때때로 끔찍한 문제를 야기했습니다.


2
#include <stdio.h>
#include <stdlib.h>

void strcmp_or_die(char *s, char *t) {
    if(!strcmp(s, t)) {
        printf("Success!\n");
    } else {
        int *ptr = NULL;
        *ptr = 0;
    }
}

int main(void) {
    char blah = '\0'; //segfaults without this line

    char v[2] = "ok";
    strcmp_or_die(v, "ok");
}

간단한 문자열 오버 플로우 문제.


1
괜찮은 컴파일러라면 "너무 많은 이니셜 라이저"진단을 제공 할 것입니다.
벤 Voigt

어떤 플랫폼 segfaults없이 blah? 여기서는 OpenBSD 5.5 / amd64와 시스템 gcc를 사용하여 blah존재 여부에 관계없이 segfault하지 않습니다 . 컴파일 된 프로그램은 16 바이트의 스택 공간을 할당하고 "ok"의 16 비트 값을 처음 2 바이트에 복사합니다. 초기화되지 않은 3 번째 바이트는 운이 좋게 '\ 0'입니다. 있는 경우 blah16 번째 바이트에 있으며 여전히 문자열을 종료하지 않습니다.
kernigh 2016

2

~-~!

이것은 아마도 가장 어리 석고 가장 명백한 것입니다.

'=|hello\|:
'=~!|Useless?\|:
@'[|y|]|n|:

두 번째 줄이 없으면 오류가 발생하고 인쇄 y됩니다.

백 슬래시는 이스케이프 문자가 아닙니다.


언어 이름을 어떻게 발음합니까?

8
@professorfish~-~!
Timtech

1
@professorfish "댓글 없음"입니다.
cjfaure 2016 년

1

윈도우 배치

이 파일은 1부터 10까지 숫자를 빈 줄로 인쇄하는 배치 파일입니다.

@echo off

setlocal EnableDelayedExpansion

set NL=^


rem Previous two lines deliberately left blank for NL to work.

for /l %%a in (1,1,10) do (
    echo %%a!NL!
)

endlocal

pause

이것은 더티 해킹 을 효과적으로 사용 하여 변수 안에 개행을 저장합니다 (지연된 확장 사용은 링크 된 답변에서 더 무서운 NL 라인을 제거합니다). 주석 위의 완전히 쓸모없는 두 줄을 제거하거나 변경하면 작동하지 않습니다.


0

트로프

Troff는 가장 훌륭한 텍스트 처리 시스템입니다. 내 문서에 사용합니다. 사용할 준비가 되려면 매크로 시스템이 필요하며 가장 유명한 것은 ms매크로 패키지입니다. 고전적인 -ms옵션으로 다음 코드를 컴파일 해 봅시다 .

.\" -ms macro package
.\" the following line seems to be useless
\& \" print an invisible character
.ad c
.sp |300p \" absolute vertical positionning
.ps 36p
.ft B
My title.
.PP
This is a paragraph.

세 번째 줄은 쓸모없는 것처럼 보이며 실제로 매크로 패키지가 없으면 쓸모가 없습니다. 아래의 두 줄 뒤에는 절대적인 수직 위치 지정이 있기 때문에 아무 것도 인쇄하지 않는 것 같습니다. 그러나이 보이지 않는 특성이 없으면 세로 위치 결정이 효과가 없지만 이유를 설명 할 수는 없습니다 . 토론을 한눈에 보려면이 스레드를 참조하십시오 . 이것은 새로운 사용자를 미치게 만들지 만, 그 트릭은 더 실험적인 사용자에게 친숙해질 것입니다.

잘 알려지지 않은 troff (heirloom troff) 버전을 확인했지만 GNU troff와 동일하게 작동합니다.


LaTeX에서도 마찬가지입니다. 빈 상자 나 이와 유사한 것이 없으면 세로 간격이 제대로 작동하지 않습니다.
오리온
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.