In my blog post yesterday, I shared this puzzle:
Add or modify exactly one operator in the following code such that it prints exactly 6 dots.
int i;
for (i = 0; i < 6; i--)
printf(".");
Let me first list all the possible solutions I know.
-
for (i = 0; i < 6; i++) -
for (i = 0; i < 6; ++i) -
for (i = 0; -i < 6; i--) -
for (i = 0; i + 6; i--) for (i = 0; i ^= 6; i--)
The last solution in the list is not quite obvious and needs a little analysis to understand why it works. To generalize the problem, let us use n instead of 6. So, the loop becomes:
int i;
for (i = 0; i ^= n; i--)
printf(".");
If we use XOR to represent bitwise exclusive OR, first i is set to (n XOR i)
before we enter the loop. Since, the initial value of i is 0, this
amounts to setting i = n before we enter the loop.
Thereafter, every iteration prints a dot and sets i = n XOR (i - 1). If we try to represent two such consecutive iterations as one operation, this composite operation prints two dots and sets i = n XOR ((n XOR (i - 1)) − 1) where i on the RHS is the value of i before the pair of iterations and i on the LHS is the value of i after the pair of iterations complete. … (A)
Before we proceed further, note that
- k XOR 1 = k − 1 for an odd integer k. … (1)
- k XOR 1 = k + 1 for an even integer k. … (2)
- a XOR b is an odd integer if a and b have different parities. … (3)
I'm not presenting the proof of these results since they are very trivial. We'll use these results in the discussion below.
If n is odd, i is odd initially because i is set to n before we enter the loop. We'll show that i always remains odd and never changes for every pair of iterations.
i = n XOR ((n XOR (i − 1)) − 1) … from (A)
= n XOR ((n XOR (i − 1)) XOR 1) … from (1) and (3)
= (n XOR n) XOR ((i − 1) XOR 1) … from associativity of XOR
= 0 XOR ((i − 1) + 1) … from (2) and (3)
= i
Note that i begins as i = n. Since, i is set to n again after every two iterations, the loop never terminates.
If n is even, i is even initially because i is set to n before we enter the loop. We'll show that i always remains even and decrements by 2 for every pair of iterations.
i = n XOR ((n XOR (i − 1)) − 1) … from (A)
= n XOR ((n XOR (i − 1)) XOR 1) … from (1) and (3)
= (n XOR n) XOR ((i − 1) XOR 1) … from associativity of XOR
= 0 XOR ((i − 1) − 1) … from (1) and (3)
= i − 2
Since i begins as i = n and decrements by 2 for every two iterations, the loop terminates after n iterations thereby printing n dots.





No comments