11
This is the 3rd of my series of C/C++ puzzles; in case you missed the first 2 they are here: (1) m3ph1st0s's programming puzzle 1 (C++) (2) m3ph1st0s's programming puzzle 2 (C++): "Call hard!"
I must say that my puzzles are 100% original. If not, I will always state so in the text. My 3rd puzzle has 2 parts as follows:
Puzzle 3.1
This part (3.1) is not an original puzzle of mine, it is collected from some internet page I've read a while ago. I use it here as a starting point and a warm-up for you. Solve this one and then move on to the 2nd part.
Some one tried to print the "+" sign 20 times and came up with the following program:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
The fact that it did not have the expected result is obvious - the program never ends. Fix it! Easy? Now fix the program by changing ONLY ONE CHARACTER - non-space character of course! For this challenge there are 3 solutions. Find all 3 of them. Just to make it clear: the program must output 20 "+" signs and must end fast. Before criticizing me on what "fast" means, I'll say it means at most a couple of seconds (which by the way is too much but just to make it crystal clear).
Puzzle 3.2
EDITED It was pointed to me earlier that the solution for the 3.2.2 puzzle might be compiler-dependent. In order to eliminate any possible discussion on the subject, I'll modify the idea and improve it on a next puzzle when I'll take extra care not to generate controversy. However, in order to keep this puzzle going, I'll make a small modification for 3.2.2 (the solution will be easier but cleaner).
When I first saw the puzzle I found it pretty awesome. I did manage to solve it but not immediately since it requires some careful attention. If you are here it means you too solved it. If you did so by writing a program to replace all possible characters with all possible values and test every solution, you are lost. Hard working guy though. Now having corrected the program that writes 20 "+" signs:
3.2.1: Insert one single letter and nothing more in the code so that the result is valid and outputs the same thing in all 3 corrected programs. Needless to say, the letter must be before the enclosing } of main (I say that because I don't want to hear people who just put a letter after the program and somehow their compiler was very friendly).
EDITED (see bellow) - For these final questions consider that the counter i starts from -1 instead of 0.
3.2.1.5: Repeat all previous problems with the condition that the output is at least 19 "+" signs (but still a finite output). Changing spaces is allowed. Now you might have found more solutions than in the first case. Some of these will most definitely fit for the 3.2.2 question.
3.2.2: Choose another value to initialize the variable n so that the resulting output will remain the same for at least one corrected programs in 3.2.1.5(not necessarily for all of them).
LAST EDIT1: changing the program so that it outputs 21 "+" signs is still a good solution, as the original text did not say "exactly" 20 signs. However, the infinite output is forbidden. Obviously this doesn't mean let's all start outputting hundreds of "+"signs since it's not forbidden. But eliminating a beautiful 21 output would not be in the spirit of this competition.
LAST EDIT2: considering LAST EDIT1 and accepting space changing it seems that now we have 5 possible solutions, four of which have already been pointed out in the responses. The last challenge however hasn't been touched and I must make it clear once more: n must be assigned another value, solutions that assign 20 to n by some tricks won't do it (like n=20L). Also I prefer to see the 3rd solution that does not change spaces.
LAST EDIT3: I've edited the last questions, please read!
The challenge is to solve both parts of the puzzle. The first one to do it wins.
I hope it's all clear, if not please post any questions and I'll edit as quickly as possible. Cheers. emphasized text
I assume changing one character includes changing any spaces to non-space characters? If so, I think I have found all 3 solutions for part 1. – mellamokb – 2012-10-01T20:17:49.017
oh..sorry..I had in mind to deny that explicitely but I forgot. I'll edit now. Thx for asking. – Bogdan Alexandru – 2012-10-01T20:35:35.570
Oh good. Because I can't find any answer for part 3.2.2 for my current 3 solutions... I guess that means I need to look for one more :) – mellamokb – 2012-10-01T20:36:26.723
yes :) good luck on that – Bogdan Alexandru – 2012-10-01T20:37:21.277
I am not real strong on C, so I'm attacking this from a Java/C# background. Does one of the three clever answers use a C-specific "hack" that I will have trouble finding? – mellamokb – 2012-10-01T20:40:40.387
I can't really give up on any clue for the third solution since I think the first two are easier to see. – Bogdan Alexandru – 2012-10-01T20:54:12.387
anyway, keep those 3 solutions that allow spaces to be changed in mind. if eventually nobody comes up with the good solution I might allow the spaces to be converted in order to give a starting point to competition here :) – Bogdan Alexandru – 2012-10-01T20:59:34.457
Feel free to create a new challenge, but please stop continuously changing the criteria. Spend some time analyzing your own questions before posting them. – ardnew – 2012-10-02T20:17:16.777
1@ardnew: I don't believe the OP has once changed the original intent of the question. I agree there are better ways to fix the question than plumping a bunch of Edit's at the end... but it's still at the core the same question, with some things clarified. – mellamokb – 2012-10-02T21:32:23.480
@mellamokb I'm sure the intent hasn't changed, but unfortunately the specifications have. The fundamental task was to output 20
+
symbols under certain restrictions. This was the one objective that drove all subsequent tasks. That requirement has apparently been tossed out the window (see: the comments to @mob 's submission, new task 3.2.1.5, andLAST EDIT1
). Without that, the "correctness" of a submission is now left to the (clearly indeterminate) opinion of the author. -1 – ardnew – 2012-10-02T23:44:04.013