July 5, 2010

FooBuzz canonical answers

Most tasks have multiple solutions. Our life experience and aesthetic inclination forms partial map from `all solution space to personalized one.

By comparing `personal solution with `canonical, for a given problem, we can analyze what is our essence.

Many interview problem designed just for that purpose.

Problem One - `FooBuzz'.

You asked to enumerate numbers fro 1 to 100. It it is multiple of 3 then print `Foo. If multiple of 5 then print `Buzz. If multiple of both print `FooBuzz else print number.

Solution show the balance of mathematical awareness versus following programming standard.

Canonical solution for different type of languages (I skip most and ignore non-mainstream).

`C
int main ()
{
  
  for (int i = 0; i < 100; ++i) {
    bool flag = false;

    if (i % 3 == 0) {
      printf("Foo");
      flag = true;      
    }

    if (i % 5 == 0) {
      printf("Buzz");      
      flag = true;      
    }
    
    if (flag) {
      printf("\n");      
    } else {      
      printf("%d\n", i);      
    }    
  }
}

`Python
for i in range (1, 100):
    s = ""
    if i % 3 == 0: s+="Foo"
    if i % 5 == 0: s+="Buzz"
    if s == "": s += str(i)
    print s

`Scala
def FooBuzz {
    for (i <- 1 until 100) {
      val s = { if(i % 3 == 0) "Foo" else "" } + 
              { if(i % 5 == 0) "Buzz" else "" }
      println ( if(s.isEmpty)  i.toString else s )
    }
  } 

There is no extensive study of deviations for this solution only observations gathered from limited sources.

On math side main problem is failure to recognize instance of Monoids {nat, %} and {string, +} which naturally additive and don't need special treatment in code.

On coding side variety language specific problems. Only one was common -  putting conditional of multiple being equal 0 but not just `i % 3.


Our efficiency as designer proportional to degree of flexibility we can take without damaging our brain. This and similar test show us our limits.

No comments:

Post a Comment