Monday, April 18, 2011

Microsoft(tm) Calculator Challenge

The Microsoft Calculator Challenge

Here is challenge for those of you with some time on your hands (it has happened to me) and illustrates an interesting testing technique.

Background

I have been a nemesis to the calculator people at Microsoft.  One time in the late 90's, I had some time on my hands (See?  I told you.) while I was working, and I was supposed to be testing but the system under test was not available (probly never happened to you) and I was looking for something to test.

My desktop at work was a PC running Windows NT and there it was: Windows Calculator.

So I began trying things.  It was definitely broken.  Mostly precision issue matters.  For a complete list, see my Ph.D. dissertation, "Appendix A - Calculator Anomalies."

Microsoft "fixed" most of these problems by adding "infinite" precision.  You can try this with the following string (without quotes) pasted into the scientific view (ALT-2) of MS Calculator: "1x9999s".  You can click on "Continue" as many times as you want. 

So I faced that challenge myself, since what I considered a really stupid fix made me somewhat unhappy with Microsoft.  I had developed a random test case generator and it generated a very long string that I could paste into calculator as above and got a catastrophic failure.  I spent some time reducing that test case and found that the following string (again, without quotes) would cause that same symptom:

"(((((((((((((((0=)))))))))))))))"

During the test string reduction, I also discovered the following string that produced an interesting result:

"(0=)(2+2=)"

The problems with these test cases persisted in subsequent versions of Windows including 2000, XP, and Vista.  If you have one of those operating systems, try those test cases.

However, if you have Windows 7, as I now have, these cases no longer "fail."  Microsoft has once again "fixed" the problem by terminating the operation once the "=" sign is entered.  Thus:

"(((((((((((((((0="

Is a complete and valid calculator operation.

The Challenge

I am incensed!  So you know what I did?  I removed the "=" from my random test case generator and generated another long string, and guess what?  It still fails catastrophically in Windows 7.  (I haven't tried it with other Windows versions, but I'll bet it fails.)

The original test case is  17,475 characters long.  As before, I have reduced this case to a case that is only 376 characters long as follows:

(1+(1+(1/(1/((1+((1+1)+1))+(1+1/((1+(1+(1+(1+(1+(1+(1+(1+(1+((1/(1+(1/(1/((1+(1+(1/((1+(1/(1)+(1/(1+(1+(((1))/1))/1))))/1))))))/1)))+(1+(1+(1+(1/(1+(1)/1))/1))+1)/1)/1)/1))+1))+1)/1)/1+(1/1)))))/1))/1)/1+(1+(1+((1/(1+((1/(1/(1/(1+(1/(1/(1+(1+((1+1)+1)/1)+(1+(1/(1+(1/(1+(1+1+1)+1)/1))/1)+1)))+1/(1/(1)/(1/((1)/1)/1)/1)+1)))/1)/1)/1)))/1)/1)+(1/(1/(1+((1+(1)/1)/1))))/1)/1)/1)/1

So the challenge is this:  What is the minimum length string that will cause this failure?

An interesting note: If you remove that last "/1" from the test case, it will not fail.

Hint:  I save the string in MS Notepad, make a change reducing the length, copy it, and paste it into calculator and if it fails I save it under a new name, if not, I restore the previously failed version.  The reduced case you see above is TC18.txt.  Be sure there are no line breaks in the string if you copy it from here.

I am also interested in intermediate results, different results, different symptoms, and failing results with a different OS or application.

1 comment:

  1. So I gave up waiting to see if someone would solve this. So I have found:

    TC92: "+1*(((((((((((((((((((((((1+((1))))))))))))))))))))))))))-"

    Improve on that!

    ReplyDelete