이것은 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 : 마지막 질문을 편집했습니다. 읽어주십시오!
문제는 퍼즐의 두 부분을 모두 해결하는 것입니다. 그것을하는 첫 번째 사람이 이깁니다.
궁금하지 않은 경우 질문을 게시하고 최대한 빨리 수정하겠습니다. 건배. 강조된 텍스트