m3ph1st0s의 프로그래밍 퍼즐 3 (C) : "쉬운 버그"[닫힘]


11

이것은 C / C ++ 퍼즐 시리즈 중 3 번째입니다. (1) : 경우에 당신은 여기 처음 2를 놓친 m3ph1st0s의 프로그래밍 퍼즐 1 (C ++) (2) m3ph1st0s의 프로그래밍 퍼즐 2 (C ++) : "하드 전화"

내 퍼즐이 100 % 독창적이라고 말해야한다. 그렇지 않다면, 나는 항상 본문에 그렇게 진술 할 것입니다. 내 세 번째 퍼즐은 다음과 같이 두 부분으로 구성됩니다.

퍼즐 3.1

이 부분 (3.1)은 원래 퍼즐이 아니며, 얼마 전에 읽은 인터넷 페이지에서 수집 한 것입니다. 나는 여기서 당신을위한 시작점과 워밍업으로 사용합니다. 이것을 해결하고 두 번째 부분으로 넘어갑니다.

어떤 사람은 "+"부호를 20 번 인쇄하려고 시도했으며 다음과 같은 프로그램을 만들었습니다.

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

예상 한 결과를 얻지 못했다는 사실은 분명합니다. 프로그램은 결코 끝나지 않습니다. 고쳐! 쉬운? 이제 공백 문자가 아닌 문자 하나만 변경하여 프로그램을 수정하십시오! 이 도전에는 3 가지 해결책이 있습니다. 그중 3 가지를 모두 찾으십시오. 분명히하기 위해서 : 프로그램은 20 개의 "+"부호를 출력해야하며 빨리 끝나야합니다. "빠른"의 의미에 대해 비판하기 전에, 그것은 최대 2 초를 의미한다고 말할 것입니다.

퍼즐 3.2

편집 3.2.2 퍼즐에 대한 솔루션은 컴파일러에 따라 다를 수 있다는 것이 이전에 나에게 지적되었다. 주제에 대한 가능한 토론을 제거하기 위해, 나는 논쟁을 일으키지 않도록 추가주의를 기울일 때 아이디어를 수정하고 다음 퍼즐에서 개선 할 것입니다. 그러나이 퍼즐을 계속 진행하기 위해 3.2.2를 약간 수정합니다 (솔루션은 더 쉬우면서도 깨끗합니다).

내가 처음 퍼즐을 보았을 때 나는 그것이 아주 굉장하다는 것을 알았다. 나는 그것을 해결하기 위해 관리했지만주의를 기울여야하기 때문에 즉시하지 않았습니다. 당신이 여기 있다면 그것은 당신도 그것을 해결했다는 것을 의미합니다. 가능한 모든 문자를 가능한 모든 값으로 바꾸고 모든 솔루션을 테스트하는 프로그램을 작성하면 손실됩니다. 열심히 일하는 사람. 이제 20 개의 "+"부호를 쓰는 프로그램을 수정했습니다 :

3.2.1 : 결과가 유효하고 3 개의 수정 된 프로그램 모두에서 동일한 결과를 출력하도록 코드에 하나의 문자 하나만 입력하십시오. 말할 필요도없이, 편지는 main의} 앞에 들어가야합니다 (프로그램 후 그냥 편지를 쓴 사람들을 듣고 싶지 않으며 컴파일러는 매우 친절했습니다).

편집 (아래 참조)-이 마지막 질문에 대해 카운터 i는 0 대신 -1에서 시작한다는 것을 고려하십시오.

3.2.1.5 : 출력이 최소 19 "+"부호 (아직 유한 출력) 인 상태에서 이전의 모든 문제를 반복하십시오. 공백을 변경할 수 있습니다. 이제 첫 번째 경우보다 더 많은 솔루션을 찾았을 것입니다. 이 중 일부는 3.2.2 질문에 가장 적합합니다.

3.2.2 : 변수 n을 초기화하기 위해 다른 값을 선택하여 결과 출력이 3.2.1.5에서 적어도 하나의 수정 된 프로그램에 대해 동일하게 유지되도록하십시오 (모두 반드시 그런 것은 아님).

LAST EDIT1 : 원본 텍스트에 "정확하게"20 부호가 표시되지 않으므로 21 "+"부호를 출력하도록 프로그램을 변경하는 것이 여전히 좋은 솔루션입니다. 그러나 무한 출력은 금지되어 있습니다. 분명히 이것이 금지되지 않았기 때문에 수백 개의 "+"부호를 모두 출력하기 시작한다는 것을 의미하지는 않습니다. 그러나 아름다운 21 개의 결과물을 제거하는 것은이 경쟁의 정신에 있지 않습니다.

LAST EDIT2 : LAST EDIT1을 고려 하고 공간을 변경 하는 것은 이제 5 가지 가능한 솔루션을 가지고있는 것으로 보입니다.이 중 4 가지 솔루션이 이미 답변에서 지적되었습니다. 그러나 마지막 도전 과제는 다루지 않았으며 다시 한 번 분명히 해야합니다 .n 에는 다른 값을 할당해야합니다 .n을 20에서 n까지 할당하는 솔루션은 그렇지 않습니다 (n = 20L과 같이). 또한 공백을 변경하지 않는 세 번째 솔루션을 선호합니다.

마지막 편집 3 : 마지막 질문을 편집했습니다. 읽어주십시오!

문제는 퍼즐의 두 부분을 모두 해결하는 것입니다. 그것을하는 첫 번째 사람이 이깁니다.

궁금하지 않은 경우 질문을 게시하고 최대한 빨리 수정하겠습니다. 건배. 강조된 텍스트


한 문자를 변경하면 공백이 아닌 문자로 변경하는 것이 포함된다고 가정합니까? 그렇다면 파트 1에 대한 3 가지 솔루션을 모두 찾은 것
같습니다

아 .. 미안합니다. 나는 그것을 명백히 부정하고 싶지만 잊어 버렸습니다. 지금 편집하겠습니다. 물어보세요.
Bogdan Alexandru

오 좋네. 내 현재 3 개 솔루션에 대한 부분 3.2.2에 대한 답을 찾을 수 없기 때문에 ... 나는 더 :) 일을 찾아해야한다는 것을 의미 추측
mellamokb

예 : 좋은 행운에 그
보그 Alexandru

1
@ardnew : OP가 한 번 질문의 원래 의도를 변경했다고 생각하지 않습니다. 나는 끝에 많은 Edit을 쓰러 뜨리는 것보다 질문을 해결하는 더 좋은 방법이 있다는 데 동의합니다 ...하지만 여전히 같은 질문에 핵심이 있습니다.
mellamokb

답변:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

이러한 변경 사항이 있으면 프로그램이 20 '+'기호를 출력합니다. 이것은 가깝습니다.

for( i = 0;~i < n; i-- )

21 개의 '+'부호를 출력합니다.

3.2.1

한 글자를 삽입 하여이 문제를 해결하는 적어도 112 가지 방법을 찾았습니다. 모든 컴파일러에서 작동하지 않을 수도 있습니다.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

마지막 두 가지 경우 x104 개의 가능한 해결책을 제공하기 위해 문자를 대체하십시오 . 마지막 두 줄 중 하나를 사용하면 출력이 변경되지만 3 개의 수정 된 프로그램의 출력은 여전히 ​​동일합니다.

3.2.2

내가 생각해 낸 것은에 할당 할 때 20 번으로 캐스팅 된 것들입니다 int.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

그렇습니다, 당신은 내가 똑같은 대답을 가지고 있습니다 (나는 모든 답변을받지 못했기 때문에 이전에 게시하지 않았습니다). 3.2.2에 대한 답은 우리 중 어느 누구도 찾지 못한 3.1의 세 번째 해결책에 있다고 생각합니다 (그리고 공간을 변경하지 못하게하는 규칙에 따르십시오).
mellamokb

3.2.1에, 나는 확실하지 않다 fd에 대한 접미사 int(잘 유형 d에 대한 어떤 그 문제에 대한 형),하지만 당신은 중단 한 몇 사람이 있습니다 int n = 20l, int n = 20U하고 int n = 20u. 또한 uintC 또는 C ++의 표준 유형 식별자 라고 생각하지 않습니다 . 어쨌든 어떤 컴파일러를 사용하고 있습니까?
ardnew

당신은 여기서 아주 좋은 일을 해냈지만 완성되지 않았습니다! 우선 ~ i 솔루션이 여전히 좋습니다! 요구 사항은 20 "+"부호를 출력해야했기 때문에 21은 여전히 ​​좋은 솔루션입니다 (유일한 나쁜 솔루션은 무한 출력). 이것은 이제 4 가지 해결책을 찾았 음을 의미합니다! 그리고 재미있는 점은, 나는 여전히 하나 더 있습니다 :) 3.2.2에 대해, 특별히 n의 값을 변경해야하기 때문에 나쁘지 않습니다. 20 :)
Bogdan Alexandru

1
또한 -i 및 ~ i 솔루션은 공간을 변경하므로 "부분"솔루션으로 간주합니다. 세 번째 완전한 솔루션은 퀴즈 텍스트에 지정된대로 공백이 아닌 문자를 변경해야합니다
Bogdan Alexandru

1
당신은 문제를 이해하지 못했습니다. 나는 수정이 코어 스폰 딩 수정 프로그램과 같은 결과를 낼 것이라고 말했다. 즉, 올바른 프로그램 C1, C2, C3이 있습니다. 문자 삽입 후 P1, P2, P3이 있습니다. 요구 사항은 다음과 같습니다. P1은 C1과 동일한 출력을 가지며, P2는 C2와 동일한 출력을, P3은 C3과 동일한 출력을 갖습니다. 동일한 출력을 갖는 P1, P2, P3 인 NOT
보그 Alexandru

2

3.1

또 다른 퍼즐. 그러나 정상적인 솔루션은 지루합니다. 특별한 것은 어떻습니까?

해결책 하나 :

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

하나의 문자 만 변경하기로 결정했습니다 -. 이외의 문자 -는 변경 되지 않았습니다 .

해결 방법 2 :

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

이것은 정확히 하나 개의 문자를 변경 - 세미콜론 이후 int i=printf("++++++++++++++++++++");exit(0);.

해결책 3 :

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

stdix.h시스템 헤더가 로드됩니다 . 시스템 포함 경로에 stdix.h라는 다음 파일을 삽입하십시오. 다음 내용을 포함해야합니다.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

이제 하나의 문자를 삽입하십시오. 음, 간단 그 교체 int main()와 함께 int main(a). 이것은 표준에 따라 유효하지 않지만 누가 신경 쓰나요?



0

3.1

  1. 변경 i--n--
  2. i<n-i<n
  3. (불행히도 다른 답변을보기 전에 컴파일러로 확인하지 않았기 때문에 잘못된 답변입니다)

3.2.1

int n = 20 

uint n = 20

(컴파일러 의존 ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

와 동일하게 19 + 부호를 인쇄합니다 int n = 20L;. 그러나 3.2.1에 대한 다른 답변을 보지 못했다면 그것을 찾지 못했을 것입니다.


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
답에 프로그램 언어와 문자 수를 추가하십시오.
Timtech

1
@Timtech 왜 문자 수? 이것은 코드 골프가 아닙니다
자랑스런 헤 켈러

1
@Timtech은 왜 언어를 포함시켜야합니까? 이것은 언어 별 과제입니다.
자부심을 가진 haskeller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.