You’re not quite sure how you ended up in this situation.
You, a theater major and Shakespeare enthusiast, are currently stuck in a whiteboard programming interview.
What’s the catch? You have no programming experience, and you’ve never attended a programming class in your life.
The interviewer rattles off his first question.
“Let’s start with Fizzbuzz. Write a program that prints the numbers from 1 to 100. If it’s a multiple of 3, print ‘Fizz’. If it’s a multiple of 5, print ‘Buzz’. If it’s a multiple of both 3 and 5, print ‘FizzBuzz'”.
You furiously furrow your brows, frantically thinking of a way to pass this coding test. You look at the position’s job description, but you don’t recognize any of the programming languages in the description.
“What programming languages am I allowed to use?”, you ask.
“Oh, feel free to use any language you want.”
Suddenly, your eyes light up.
“Any language you say?”
Like any good theater student, you are well-versed in Shakespearean language, and so you confidently walk up to the whiteboard to begin drafting your solution.
“I’ll be using the Shakespeare Programming Language. First, we’ll need a dramatic title for our play. Let’s call it ‘The Elucidation of Foul Multiples'”.
And like a play, no program is complete without its supporting actors. Let’s add in our cast of actors from Romeo and Juliet, with an added bonus of Prince Henry, because why not.
The Elucidation of Foul Multiples. Romeo, the hopeless romantic. Mercutio, the grave man. Prince Henry, the noble. Ophelia, the drowned.
And just like how a computer program has code and functions, a play has acts and scenes.
Let’s introduce our first scene and act, so we can start cracking at this Fizzbuzz problem.
Act I: The Revelation Of Wretched Multiples. Scene I: Romeo The Sweet Talker. [Enter Prince Henry and Romeo] Romeo: You are as rich as the sum of a handsome happy honest horse and a lovely fellow. Thou art the square of thyself. [Exit Prince Henry] [Enter Ophelia] Romeo: You are the sum of a beautiful blossoming daughter and the moon. [Exit Ophelia] [Enter Mercutio] Romeo: You plum.
To start off our beautiful play, we need to setup the drama. To do this, we have Romeo run around complimenting people with alliterations.
“I’m not sure I follow. How does writing out this play help you calculate Fizzbuzz?“, the interviewer asks.
Well you see, at any given time, there can only be two people on stage. Whoever is on the stage with Romeo will be affected by Romeo’s compliments.
When Romeo compliments an actor, each of Romeo’s nouns will count for “1”, and each adjective counts as a multiplier of 2, forming powers of 2.
So when Romeo tells Prince Henry through that he’s as rich as the “sum of a handsome happy honest horse and a lovely fellow”, the first part evaluates to 8 (3 adjectives, 1 noun = 2^3) and the second part just evaluates to 2 (1 adjective, 1 noun). This sets Prince Henry to 10.
Then, we say that Prince Henry is the “square of thyself”, where “thyself” is a reflexive noun referring to Prince Henry himself. This means Prince Henry will square his own value, setting him to 10^2 = 100.
We can then use Prince Henry as a comparator to check when our FizzBuzz program reaches 100.
We do the same with Ophelia to set her to 5, but only because obtaining multiples of 5 is inconvenient when everything is in powers of 2, so she’s more of a supporting actor in this play.
Lastly, Mercutio is the counter that goes from 1 to 100, so by calling him a “plum”, he will be initialized to 1, since all nouns are equal to 1.
And now, for the climax of the drama!
Scene II: A Pox Upon Both Houses. Mercutio: Is the remainder of the quotient between myself and the difference between Ophelia and a warm wind as good as nothing? Romeo: If so, let us proceed to scene V. Scene III: What's In A Name. Mercutio: Is the remainder of the quotient between myself and Ophelia as good as nothing? Romeo: If so, let us proceed to scene VI. Scene IV: You Shall Find Me A Grave Man. Romeo: Open your heart! Mercutio: Let us proceed to scene VII.
Here, we do our checks for whether Mercutio is a multiple of 3, 5, or neither. If he’s a multiple of 3 or 5, we will move over to scenes V and onwards, but if neither of those conditions are true, Romeo will compel Mercutio to open his heart. “Open your heart” is a code keyword in the Shakespeare language for “print your stored numerical value”.
And now for the play’s resolution!
Scene V: I Do Not Bite My Thumb At You. Mercutio: Thou art the sum of a warm lamp and Ophelia. You are the product of thyself and the product of Ophelia and a brave squirrel. Speak your mind! You are the sum of yourself and the sum of a rich father and a mother. Speak your mind! Thou art the sum of the sum of the square of a cute cunning squirrel and a plum and thyself. Speak your mind! Speak your mind! Is the remainder of the quotient between myself and Ophelia as good as nothing? Romeo: If not, let us proceed to scene VII. Scene VI: Wherefore Art Thou Romeo. Mercutio: Thou art the sum of a fair fine angel and a gentle lovely flower. You are the sum of a fair daughter and the square of thyself! Speak your mind! You are as charming as the sum of yourself and the square of a beautiful lovely lamp. Thou art the sum of thyself and the sum of a rich purse and a plum. Speak your mind! Thou art the sum of thyself and Ophelia. Speak your mind! Speak your mind! Scene VII: Good Night, Good Night, Parting Is Such Sweet Sorrow. Romeo: You are as noble as the sum of yourself and a Lord. Mercutio: You are the product of Ophelia and a warm wind. Speak your mind! Mercutio: Am I better than Prince Henry? Romeo: If not, let us return to Scene II. [Exeunt]
In order for us to print an ASCII character, we need one of the actors to set their value to the ASCII code for that character. Then, we trigger the printing of that ASCII character by having an actor say “Speak your mind!”.
In scenes V and VI, Mercutio and Romeo are in the scene, and Mercutio is setting Romeo’s values to the ASCII codes “70”, “73”, “90”, “90” for “FIZZ”, and “66”, “85”, “90”, “90” for “BUZZ” in scenes V and VI respectively.
In Scene V, which is when “FIZZ” is printed, there’s a possibility that the number isn’t also a multiple of 5, in which case we skip the “BUZZ” case via the “If (not/so), let us proceed to scene X” statement. This forces all of the actors on stage to switch to a different scene, without exiting or entering any new actors (ie; it’s a GOTO statement).
Lastly, by the time we get to scene VII, we increment Mercutio by one (by adding him to a noun, which counts for 1). If Mercutio’s value isn’t greater (better) than Prince Henry’s (100), then we loop back to Scene II, where we go through the process all over again until Mercutio’s value is over 100.
And of course, we will need new lines/line feeds for each new iteration, so we set Romeo to the product of Ophelia (5) and a warm wind (2) in order to get him to print out a new line character (ASCII code #10).
Impressed by the brilliance of your own play, you finally add the finishing [Exeunt] to your Shakespeare program to tell all of the actors to get off the stage, and just in time too — since the whiteboard’s run out of space.
The interviewer looks at you with a bewildered expression, no doubt impressed by your incredible Shakespearean prowess.
“So, did I get the job?”
Author’s note: If you want the source code, you can find it available here.