Nandakumar Edamana
Share on:
@ R t f

ആദ്യം അറിയേണ്ടത് 'ഫിസ്‍ബസ്'


സോഫ്റ്റ്‍വെയര്‍ ഡെവലപ്മെന്റിന് ആളെയെടുക്കുന്ന അഭിമുഖങ്ങളില്‍ പലപ്പോഴുമുണ്ടാവാറുള്ള ഒരു ചോദ്യമാണ് 'ഫിസ്‍ബസ്' (FizzBuzz). പ്രവൃത്തിപരിചയമില്ലെങ്കിലും കംപ്യൂട്ടര്‍ സയന്‍സില്‍ ഒരു ബിരുദവുമായെത്തുന്ന ഭൂരിഭാഗം പേര്‍ക്കും ഇതിനുത്തരം നല്കാനാവുന്നില്ല എന്നാണ് പൊതുവേയുള്ള പരാതി. ഇത് സത്യമാണെന്ന് തോന്നിയിട്ടുണ്ട്.

ബിരുദധാരികളെ കുഴക്കുന്ന ചോദ്യം എന്നൊക്കെ കേള്‍ക്കുമ്പോള്‍ ഗുരുതരമായ ചോദ്യം തന്നെ എന്നു തോന്നാം. എന്നാല്‍ ഫിസ്‍ബസ് എന്താണെന്നറിഞ്ഞാല്‍ ചോദ്യമല്ല, ഇതിനുത്തരം തരാനാകാത്ത അവസ്ഥയാണ് ഗുരുതരം എന്ന് ബോദ്ധ്യമാകും. അത്ര ലളിതമാണ് കാര്യം.

എന്താണ് ഫിസ്‍ബസ്?

ഹരണം (Division) പഠിക്കുന്നതിന്റെ ഭാഗമായി കുട്ടികളെക്കൊണ്ട് ചെയ്യിക്കുന്ന ഒരു കളിയാണ് ഫിസ്‍ബസ്. പങ്കെടുക്കുന്നവര്‍ വട്ടത്തിലിരിക്കുന്നു. ഏതെങ്കിലുമാരു കുട്ടിയില്‍നിന്നു തുടങ്ങി ഒന്നുമുതല്‍ മേലോട്ടെണ്ണുന്നു. എണ്ണേണ്ട സംഖ്യ മൂന്നിന്റെ ഗുണിതമാണെങ്കില്‍ സംഖ്യയ്ക്ക് പകരം 'ഫിസ്' എന്നും അഞ്ചിന്റെ ഗുണിതമാണെങ്കില്‍ 'ബസ്' എന്നും പറയണം. ഒരേസമയം മൂന്നിന്റെയും അഞ്ചിന്റെയും ഗുണിതമാണെങ്കില്‍ 'ഫിസ്‍ബസ്' എന്നാണ് പറയേണ്ടത്. അതായത്, ഒന്നാമന്‍ 'ഒന്ന്' എന്നും രണ്ടാമന്‍ 'രണ്ട്' എന്നും പറയുമ്പോള്‍ മൂന്നാമന്‍ പറയേണ്ടത് 'ഫിസ്' എന്നാണ്. തുടര്‍ന്ന് 'നാല്, ബസ്, ഫിസ്, ഏഴ്, എട്ട്, ഫിസ്, ബസ്, പതിനൊന്ന്, ...' എന്നിങ്ങനെ പോകും. പതിനഞ്ചിന് പകരം 'ഫിസ്‍ബസ്' ആയിരിക്കും. തെറ്റിക്കുകയോ വൈകിക്കുകയോ ചെയ്യുന്നവര്‍ പുറത്താകും.

ഫിസ്‍ബസ്സും പ്രോഗ്രാമിങ്ങും

ഫിസ്ബസ്സിന് സമാനമായ ഒരു പ്രോഗ്രാം എഴുതുകയെന്നതാണ് ഉദ്യോഗാര്‍ത്ഥി ചെയ്യാനുള്ളത്. പ്രോഗ്രാമിങ്ങിലെ അടിസ്ഥാനപരമായ ആശയങ്ങളില്‍പ്പെട്ടതാണ് ലൂപ്പിങ്ങും ബ്രാഞ്ചിങ്ങും. ഒരു കൂട്ടം നിര്‍ദേശങ്ങള്‍ ആവര്‍ത്തിക്കുന്നതാണ് ലൂപ്പിങ് (ഉദാ: for, while). നിബന്ധനകള്‍ക്കു വിധേയമായി ഏതു കൂട്ടം നിര്‍ദേശങ്ങള്‍ പ്രവര്‍ത്തിപ്പിക്കണമെന്ന് തീരുമാനിക്കുന്നതാണ് ബ്രാഞ്ചിങ് (ഉദാ: if). ഇതു രണ്ടും ഫിസ്‍ബസ്സില്‍ വരുന്നുണ്ട്. അതാണ് ഇത്തരമൊരു ചോദ്യം കൊടുക്കാന്‍ കാരണം. ഫിസ്‍ബസ്സ് ചെയ്യാനറിയില്ലെങ്കില്‍ പ്രോഗ്രാമിങ്ങിന്റെ അടിസ്ഥാനപാഠങ്ങള്‍ തന്നെ അറിയില്ലെന്നുകരുതാം.

എങ്ങനെ ചെയ്യണം?

ഒരു കളിയായ ഫിസ്‍ബസ്സിനെ പ്രോഗ്രാമാക്കി മാറ്റുക എന്നതുകൊണ്ട് എന്താണുദ്ദേശിക്കുന്നത് എന്ന കാര്യത്തിലാണ് ആദ്യം വ്യക്തത വേണ്ടത്. മിക്കപ്പോഴും വേണ്ടത് ഒരു ഗെയിം ഉണ്ടാക്കുകയല്ല. ഫിസ്‍ബസ് ശ്രേണി സ്ക്രീനില്‍ വെറുതേ പ്രിന്റ് ചെയ്യുകയേ വേണ്ടൂ. അതായത്, ലൂപ്പിങ്ങിന്റെയും ബ്രാഞ്ചിങ്ങിന്റെയും സഹായത്തോടെ 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, ... എന്നിങ്ങനെ എഴുതിക്കാണിച്ചാല്‍ കാര്യം കഴിഞ്ഞു.

ഈ പ്രോഗ്രാം നമുക്ക് 'സി'യില്‍ പടിപടിയായി ചെയ്തുനോക്കാം. ആദ്യം ഒന്നുമുതല്‍ നൂറുവരെ പ്രിന്റ് ചെയ്യാനുള്ള ഒരു പ്രോഗ്രാമെഴുതാം:

#include <stdio.h>

int main()
{
  for(int i = 1; i <= 100; i++) {
    printf("%d\n", i);
  }
  
  return 0;
}

i എന്ന ചരത്തിന്റെ (Variable) മൂല്യം ഒന്നുമുതല്‍ നൂറുവരെ ആക്കുക എന്നും ഓരോ തവണയും (Iteration) അതിന്റെ നിലവിലെ മൂല്യം സ്ക്രീനിലെത്തിക്കുക എന്നുമാണ് ഈ കോഡിലെ ഫോര്‍ ലൂപ്പ് പറയുന്നത്. ഇനി ഇത് ഫിസ്‍ബസ് ആക്കിമാറ്റുന്നതെങ്ങനെയാണ്?

ഫോര്‍ ലൂപ്പിനകത്തെ നിബന്ധനകളൊന്നുമില്ലാത്ത പ്രിന്റ് സ്റ്റേറ്റ്മെന്റ് മാറ്റി ഒരു ബ്രാഞ്ചിങ് വച്ചുകൊടുക്കുകയാണ് വേണ്ടത്. മൂന്നിന്റെ ഗുണിതമാണോ അഞ്ചിന്റെ ഗുണിതമാണോ എന്നൊക്കെ പരിശോധിച്ച് വ്യത്യസ്തരീതിയില്‍ പ്രിന്റുചെയ്യുന്നത് ഇവിടെയാണ്. i മൂന്നിന്റെ ഗുണിതമാണോ എന്നറിയാന്‍ അതിനെ മൂന്നുകൊണ്ടു ഹരിച്ച് ശിഷ്ടം (Remainder) പൂജ്യമാണോ എന്ന് നോക്കിയാല്‍ മതി. സിയില്‍ ഇത് i % 3 == 0 എന്നാണെഴുതുക (പരിശോധനയായതിനാല്‍ രണ്ട് '=' ചിഹ്നം ഉണ്ട്). ഇതാ ഫോര്‍ ലൂപ്പിനകത്തു വയ്ക്കേണ്ട ഇഫ് ഭാഗം:

if(i % 3 == 0 && i % 5 == 0)
  printf("FizzBuzz\n");
else if(i % 3 == 0)
  printf("Fizz\n");
else if(i % 5 == 0)
  printf("Buzz\n"); 
else
  printf("%d\n", i);

ഇത്രയേയുള്ളൂ കാര്യം!

വ്യത്യസ്തരീതികളില്‍

ഇപ്പോള്‍ക്കണ്ട രീതിയില്‍ ഫിസ്‍ബസ് എഴുതാന്‍ ഒരുപാടുപേര്‍ക്ക് കഴിവുണ്ടാകും. അക്കൂട്ടത്തില്‍പ്പെട്ടയാളാണെങ്കില്‍ പക്ഷേ അവിടെ നില്‍ക്കരുത്; വേറെയെങ്ങനെയെല്ലാം ഇതു ചെയ്യാം എന്നാലോചിക്കണം. ഉദാഹരണത്തിന്, ലൂപ്പിങ്ങിന് പകരം റിക്കേര്‍ഷന്‍ (Recursion) ഉപയോഗിച്ച് ഇതെങ്ങനെ ചെയ്യാം? ഒരു ഫങ്ഷന്‍ അതിനെത്തന്നെ വിളിക്കുന്നതാണ് റിക്കേര്‍ഷന്‍. ഫങ്ഷണല്‍ പ്രോഗ്രാമിങ് ശൈലിയില്‍ ഇതുപയോഗിച്ചാണ് ലൂപ്പിങ് ചെയ്യുന്നതുതന്നെ.

ഇംപറേറ്റീവ് ശൈലിയില്‍പ്പെട്ടതാണെങ്കിലും സിയിലും റിക്കേര്‍ഷന്‍ ഉപയോഗിക്കാം. ഇതാ റിക്കേര്‍ഷന്‍ ഉപയോഗിച്ചുകൊണ്ട് സിയിലെഴുതിയ ഫിസ്‍ബസ്:

#include <stdio.h>

void fizzbuzz(int i, int max)
{
  if(i > max)
    return;

  if(i % 3 == 0 && i % 5 == 0)
    printf("FizzBuzz\n");
  else if(i % 3 == 0)
    printf("Fizz\n");
  else if(i % 5 == 0)
    printf("Buzz\n"); 
  else
    printf("%d\n", i);
  
  fizzbuzz(i + 1, max);
}

int main()
{
  fizzbuzz(1, 100);
  
  return 0;
}

ഇതെല്ലാം ചെയ്യാന്‍ നന്നായി അറിയാവുന്ന ഒരാളാണ് നിങ്ങളെങ്കില്‍ അടുത്തതായി നോക്കാവുന്ന ഒരു കാര്യം ഹാസ്കലില്‍ എങ്ങനെ ഫിസ്‍ബസ് ചെയ്യാമെന്നതാണ്. സി, ജാവ, പൈത്തണ്‍ പോലുള്ള ഭാഷകളില്‍നിന്ന് വളരെ വ്യത്യസ്തമായ ഒരനുഭവമായിരിക്കുമത്. ഒരു ഉദാഹരണത്തിനായി wiki.haskell.org/Fizzbuzz സന്ദര്‍ശിക്കാം.


Click here to read more like this. Click here to send a comment or query.