m3ph1st0s의 프로그래밍 퍼즐 1 (C ++) [닫기]


26

이것은 당신을위한 일련의 C ++ 퍼즐 중 첫 번째입니다. 당신이 즐길 수 있기를 바랍니다.

퍼즐 1 번 :

다음과 같은 프로그램이 주어집니다 :

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

출력이 0이되도록 프로그램 내 아무 곳이나 하나의 새 줄에 코드를 삽입하십시오. 새 줄에는 AT MOST 18 자 (공백 포함)가 포함되며 나머지 줄은 수정되지 않은 상태로 유지됩니다. 분명히, 다음은 유효한 새 코드의 예입니다.

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   int* p = NULL;
   const float c=0.5;
   std::cout << a/b-a*c;
}

15 자로 된 줄 바꿈이 삽입되었으므로 괜찮습니다. 그러나 문제가 해결되지 않습니다.

이것이 당신에게 너무 간단하다면 걱정하지 마십시오.


2
누군가가 때때로 C ++ 질문을 게시하게되어 매우 기쁩니다! C ++ 솔루션이 20 또는 30 줄이되는 모든 퍼즐을 사용하면 J 또는 K 또는 Golfscript로 솔루션을 게시하는 사람들이 잠시 후에 실망하게됩니다.
Mr Lister

3
결과가 유효하고 잘 정의 된 C ++이어야합니까 아니면 UB를 사용할 수 있습니까? (씨 리스터는 지적처럼하지만, 원래의 코드는 ++도 유효 C하지 않습니다.)
콘라드 루돌프

4
유효하지 않습니다. main은 int를 리턴해야합니다 (c ++ 표준을 읽으십시오)
BЈовић

2
우리는 여기에 요점이 없습니다. 마음에 들지 않으면 int와 return 0을 넣으십시오.
Bogdan Alexandru

11
@Bogdan : Dafuq? 하나는 DevC ++가 말할 수 없을 정도로 오래 되었기 때문에 결과는 관련이 없습니다. 둘째, OS를 대상으로 한 특정 구성의 주어진 컴파일러가 허용하는지 여부는 C ++을 유효하게하지 않습니다.
DeadMG

답변:


14
#define int float

잘 작동하고 길이가 같습니다.


내가 처음 생각 왔을 때이 내가 생각했던 것입니다
보그 Alexandru

5
#define int float실제로 정의되지 않은 동작입니다. 키워드에 새로운 의미를 부여 할 수 없습니다.
fredoverflow

프레드, 출처를 인용 할 수 있습니까? GCC cpp 문서에 "C 키워드 인 경우에도 유효한 식별자를 매크로로 정의 할 수 있습니다"라고 말합니다.
Dan

@ 단 : C ++ 표준은 그것을 금지합니다.
DeadMG

3
UB 일지 모르지만, 몇몇 유명한 컴파일러가 그것을 지원합니다. 나는 짓을했는지 #define int ERROR의 동등한 사용하는 자신을 강제로 int32_t대신 내장 유형. 내가 int main()갔을 때 매크로에 대해 잊어 버렸고 왜 내 코드가 컴파일되지 않는지 궁금해했습니다.
dan04

33

다른 범위로 이동하여 a = 1을 제거 할 수 있습니다.

#include <iostream>
main() 
{
int a=0;if(0)
    const int a=1;
    const int b=2;
    const float c=0.5;
    std::cout << a/b-a*c;
}

13 자라고 생각합니다. 또는 a0 이되는 새로운 것을 얻는 것이 좋습니다 .

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
if(int a=2)
   std::cout << a/b-a*c;
}

11 자예요


24
#include <iostream>
main() 
{
   const int a=1;
#define a 0
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

1 줄, 12 줄


그게 내가 제출하고 싶었던 ... +1입니다.
H2CO3

질문을 읽을 때 나의 첫 번째 아이디어)))
Qwertiy

23

그래서, #define a 0완료. 나는 그것이 놀랍게도 게시 된 것을 보았다.

놀랍게도, 이것은 게시되지 않았습니다 :

#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout<<0||
   std::cout << a/b-a*c;
}

14 자

그렇게해야합니까?


21
#include <iostream>
main() 
{
const int a=0;//\
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

17 자

그건 그렇고, 원래 프로그램은 MSVC에서 컴파일 main되지 않으며 반환 유형이 없다고 불평합니다 .


2
int a = 0; // \ 또한 트릭을 수행합니다
복사

2
전혀. 그러나 이것은 "가장 짧은 라인 승리"종류의 경연 대회입니까?
Mr Lister

그렇게 생각했지만 그렇지 않습니다. 그런데 좋은 속임수
복사

2
예, codegolf SE에서 가장 짧은 솔루션이 승리합니다. faq
BЈовић

2
@ BЈовић FAQ는 실제 코드 골프 질문에 가장 짧은 솔루션이 승리한다고 말합니다. 이 질문은 분명히 코드 골프 질문이 아닙니다.
kojiro

11

개행 포함 18

#define float int

난 정말 확실히이 작품 ... 통해 UR 선언 float로서 C와 0.5으로 초기화 아니에요
보그 Alexandru

5
어느 것이 0으로 잘립니다.
DeadMG

맞습니다, 재밌는 점은 십진수 값으로 정수를 초기화하는 것을 본 적이 없었습니다. 컴파일러 오류 일 것이라고 생각했지만 경고 만 표시합니다.
Bogdan Alexandru

2
@BogdanAlexandru는 C ++ 표준을 간파합니다. 특히 여기에서 암시 적 변환을 자세히 설명합니다.
oldrinb

2
모든 컴파일러에서이를 허용하지만 표준에서는 키워드 재정의 (및 float키워드)를 금지 합니다.
avakar


9
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a 0;1
   std::cout << a/b-a*c;
}

14 자


7
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   return puts("0");
   std::cout << a/b-a*c;
}

17 자


1
C ++과 관련된 모든 것에 직면하여 최고의 솔루션입니다.
fabspro

3
`puts '는이 범위에서 선언되지 않았습니다
shiona

@shiona 어떤 컴파일러를 사용하고 있습니까?
Ashrr

@Ashrr gcc (g ++) 4.5.4
shiona

1
생각하지 마십시오.이 코드는 0을 반환합니다. 그러나 느낌표를 통해 공백을 바꿀 수 있습니다. 어쨌든 puts가 0을 반환 할 때 확실하지 않습니다.
Qwertiy 2016 년

7
#include <iostream>
main()
{
   const int a=1;
   const int b=2;
   const float c=0.5;
std::cout<<0;//\
   std::cout << a/b-a*c;
}

17 자이므로 딱 맞습니다.


7

C ++을 모르지만 질문에 따라 단순히 0을 출력하는 줄을 입력 할 수 없습니까? 질문은 출력이 0이어야 함을 지정하고 출력을 0으로 변경해야한다고 지정하지 않습니다.

std::cout << 0

(C ++에 대한 단서가 있습니다. 아마도 누군가이 개념을 사용할 수 있습니다)


오, 출력은 단지 0이어야합니다. 명백하다고 생각했습니다. 그렇지 않으면 퍼즐이 없을 것입니다.
Bogdan Alexandru

7
@BogdanAlexandru 당신은 잘못 작성된 질문을 이용하는 것이 이러한 퍼즐을 해결하는 일반적인 기술이라는 것을 알게 될 것입니다. 사용자가 이러한 바로 가기를 사용하지 못하게하려면 몇 분 동안 자신의 질문을 분석하고 잠재적 인 모호성을 제거하십시오.
ardnew

3

12 문자, mob의 솔루션과 유사

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a b
   std::cout << a/b-a*c;
}

다른 조합도 일, 같은 #define a c또는#define c 0


2

나는 그것이 가 아니라는 것을 알고 있지만 오늘 그 모자를 쓰고있는 것 같습니다!

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;

--에이;

   std::cout << a/b-a*c;
}

개행을 포함하여 다섯 문자;


2
때문에, 컴파일되지 않습니다 a이다 const.
Csq

죄송합니다. 컴파일러에 제공해야합니다! :-(
Toby Speight

0

C ++ 뭐든지 ...

echo "0"; exit
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

다음을 통해 실행 :

sh mp.cpp

좋은 시도이지만 요구 사항을 위반합니다 : 유효한 C ++.
Konrad Rudolph

0

리스터 씨의 답변 에 대한 변형 이지만 약간 덜 명확합니다.

#include <iostream>
int main() 
{
   const float a=1; //??/
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

-1
#include <iostream>
int main() 
{
int a;if(a)
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

이 11 문자는 어떻습니까?


1
여기서 문제는 int a이전 if이 초기화되지 않았으므로 a값을 가질 수 있다는 것입니다.
frozenkoi

1
이것은 정의되지 않았습니다 a.에 초기화되지 않은 값을 사용하고 있습니다.
Konrad Rudolph

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.