The Google Code Jam Qualification Round took place over the last weekend. This is the third time they have organized

this contest themselves – earlier iterations were hosted by TopCoder. This is my fourth GCJ, including my first one in 2006

that was hosted by TopCoder where I did not even get past the qual round. In the past two years I got eliminated in Round-2.

It is very likely that the same thing will happen again this year.

I could not wake up early enough to start at the beginning of the round, and was mostly away from the computer

most of the day. But this was a 24 hours round, and the problems were quite easy, so I managed to solve all

three in the end.

There is an official contest analysis already posted. I am posting my own

analysis here to explain my own train of thought and to basically act as sort of post-contest

review to organize my ideas.

The first problem asked for figuring out whether the lightbulb at the end of a series of ‘snappers’

would be on after K slaps.

Initially all Snappers are off, so we can see them as a list of 0’s:

[0,0,0,0,...,0,0]

At the first snap, only the leftmost one is turned on (all other have no power).

[0,0,0,0,...,0,1]

At the next snap, the second one is turned on while the first one is turned off.

[0,0,0,0,...,1,0]

At the third snap, the first one is again turned on, all other remain as they were.

[0,0,0,0,...,1,1]

We can see that for the n-th snap, the list looks exactly like the binary representation of n.

0 000

1 001

2 010

3 011

4 100

5 101

6 110

7 111

Ok, so we got a potential solution. We need to prove it before we can really be sure.

We can see that the binary representation is valid for 0 claps.

Say we have n snaps, and the binary representation is valid for that. Now to convert the list for n

to that for n+1 claps, we have to flip every snapper that has power. We start at the leftmost bit and flip it,

because it always has power. If the left most bit was a zero we stop there. If the left left most bit was a 1

(before flipping), we also flip the next bit – because it had power. We repeat this for every bit until we have

flipped a bit that was originally a 0.

Notice that this is exactly the same process that is used for binary addition by one:

1110100011111 + 1 -------------- 1110100100000

Thus if for any n the binary representation gives us the state of the snappers, the binary representation of

n+1 will give us the state of the snappers after n+1 snaps. Since 0 gives a valid binary state representation, so will

1, and thus also 2,which also makes it valid for 3 and so on.

So the binary representation of K gives us the the state of the snappers after K snaps. To see if the bulb has power

after K snaps, we just need to check whether the lower N bits of K are all set (i.e. all N snappers are on).

You can do this any way you want. During the contest, what I did was to simply count the on bits in K%(2^).

For the bulb to be on all N bits must be set.

Another way is to add 1 to K and then check if K%(2^N) is 0. This works because, if all the lower N

bits of K are 1, adding 1 to it will make them all 0’s.

My contest code was in Basic for the small (meant to run in Spaghetti – my own interpreter) and Python for the large.

But I’m posting code in JavaScript(Rhino) which I wrote after the contest here.

#! /usr/bin/rhino // import some useful Java packages importPackage(java.io); importPackage(java.lang); // Use Java's Reader classes and System.in for input var reader=BufferedReader(InputStreamReader(System['in'])); // T=number of cases var T=parseInt(reader.readLine()); for (cas=1;cas<=T;cas++){ //Each case consists of 2 integers: N and K var data=reader.readLine().split("\\s+"); var N=parseInt(data[0]), K=parseInt(data[1]); // (K+1)%(1< k%(1< all ones => all on snappers if ((K+1)&(1<<N)) print("Case #"+cas+": OFF"); else print("Case #"+cas+": ON"); }

(More to come shortly)