Advertisement
richarduie

fizzBuzzVariations.html

Oct 17th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 7.72 KB | None | 0 0
  1. <html>
  2.  
  3. <head>
  4.     <script>
  5.         // A bunch of JavaScript spins on algorithms to implement the
  6.         // basic idea of FizzBuzz
  7.  
  8.         // All versions of FizzBuzz*() do the following...
  9.         //    for each {i} from 1 to {last}, create an element in
  10.         //    an Array of Strings each of which reports:
  11.         //       1) "Fizz", if {i} evenly divisible by {fizzNum}
  12.         //       2) "Buzz", if {i} evenly divisible by {buzzNum}
  13.         //       3) "FizzBuzz", if {i} evenly divisible by both
  14.         //           {fizzNum} and {buzzNum}
  15.         //       4) {i} itself, if not evenly divisible by  
  16.         //            either {fizzNum} or {buzzNum}
  17.         //    string value at index j is for integer {j + 1}
  18.  
  19.         function FizzBuzz1( fizzNum, buzzNum, last ) {
  20.             var fizz, buzz, int;
  21.             var rpt = new Array();
  22.             // for each integer from 1 to {last}, inclusive,...
  23.             for (var i = 1; i <= last; i++) {
  24.                 // set {fizz} to "Fizz", if {i} divisible by {fizzNum} -
  25.                 // otherwise, set to empty string
  26.                 fizz = (0 == i%fizzNum) ? "Fizz":"";
  27.                 // set {buzz} to "Buzz", if {i} divisible by {buzzNum} -
  28.                 // otherwise, set to empty string
  29.                 buzz = (0 == i%buzzNum) ? "Buzz":"";
  30.                 // set {int} to {i}, if {i} divisible by neither {fizzNum}
  31.                 // nor {buzzNum}, i.e., {fizz} and {buzz} both empty -
  32.                 // otherwise, set to empty string
  33.                 int = ( "" == fizz + buzz ) ? i:"";
  34.                 // concatenate all parts and add to tail of accumulator
  35.                 rpt.push( fizz + buzz + int );
  36.             }
  37.             return rpt;
  38.         };
  39.  
  40.         function FizzBuzz2( fizzNum, buzzNum, last ) {
  41.             var msg;
  42.             var rpt = new Array();
  43.             // for each integer from 1 to {last}, inclusive,...
  44.             for (var i = 1; i <= last; i++) {
  45.                 // initialize current message to empty
  46.                 msg = "";
  47.                 // if {i} divisible by {fizzNum}, add "Fizz" to {msg}
  48.                 if (0 == i%fizzNum) msg += "Fizz";
  49.                 // if {i} divisible by {buzzNum}, add "Buzz" to {msg}
  50.                 if (0 == i%buzzNum) msg += "Buzz";
  51.                 // if {msg} empty, assign {i} msg
  52.                 if ("" == msg) msg = i;
  53.                 // add to tail of accumulator
  54.                 rpt.push( msg );
  55.             }
  56.             return rpt;
  57.         };
  58.  
  59.         function FizzBuzz3( fizzNum, buzzNum, last, accum ) {
  60.             // if first call, allocate accum(ulator)
  61.             if ("undefined" == typeof accum) accum = new Array();
  62.             // if done, return accum(ulator), i.e., stop at 0
  63.             if (0 == last) return accum;
  64.             // implicit {else}...
  65.             // add message for current {last} to head of {accum}
  66.             accum.unshift(
  67.                 // if {last} divisible by {fizzNum}, add "Fizz" to {accum}
  68.                 ((0 == last%fizzNum) ? "Fizz":"") +
  69.                 // if {last} divisible by {buzzNum}, add "Buzz" to {accum}
  70.                 ((0 == last%buzzNum) ? "Buzz":"") +
  71.                 // if {last} divisible by neither {fizzNum} nor {buzzNum},
  72.                 // add {last} to {accum}
  73.                 (((0 != last%fizzNum) && (0 != last%buzzNum) ) ? last:"")
  74.             );
  75.             // recurse for next lower integer
  76.             return FizzBuzz3( fizzNum, buzzNum, last - 1, accum);
  77.         };
  78.  
  79.         function FizzBuzz4( fizzNum, buzzNum, last ) {
  80.             var msgs = ["Fizz", "Buzz", "FizzBuzz", -1];
  81.             var msgIdx;
  82.             var rpt = new Array();
  83.             // for each integer from 1 to {last}, inclusive,...
  84.             for (var i = 1; i <= last; i++) {
  85.                 // update for current {i}
  86.                 msgs[3] = i;
  87.                 // initialize message index out of bounds
  88.                 msgIdx = -1;
  89.                 // if {i} divisible by {fizzNum}, increment index by 1
  90.                 if (0 == i%fizzNum) msgIdx++;
  91.                 // if {i} divisible by {buzzNum}, increment index by 2
  92.                 if (0 == i%buzzNum) msgIdx += 2;
  93.                 // if not yet reset from initial value, set to 3
  94.                 if (-1 == msgIdx) msgIdx = 3;
  95.                 // add message by index in msgs to tail of accumulator
  96.                 rpt.push( msgs[ msgIdx ]);
  97.             }
  98.             return rpt;
  99.         };
  100.  
  101.         function FizzBuzz5( fizzNum, buzzNum, last ) {
  102.             var msgs = ["Fizz", "Buzz", "FizzBuzz"];
  103.             var msgIdx;
  104.             var rpt = new Array();
  105.             // for each integer from 1 to {last}, inclusive,...
  106.             for (var i = 1; i <= last; i++) {
  107.                 msgIdx = ((0 == i%fizzNum) ? 1:0) + ((0 == i%buzzNum) ? 2:0) - 1;
  108.                 // add message to tail of accumulator
  109.                 rpt.push( (-1 == msgIdx) ? i:msgs[ msgIdx ] );
  110.             }
  111.             return rpt;
  112.         };
  113.  
  114.         function FizzBuzz6( fizzNum, buzzNum, last ) {
  115.             var msgs = "FizzBuzz";
  116.             // indexes in {msgs + i} for starting and stopping substring()
  117.             var start, stop;
  118.             var rpt = [];
  119.             // for each integer from 1 to {last}, inclusive,...
  120.             for (var i = 1; i <= last; i++) {
  121.                 // substring starting index for string (msgs + i)
  122.                 start = (0 == i%fizzNum) ? 0 : (( 0 == i%buzzNum) ? 4:8);
  123.                 // substring stopping index for string (msgs + i)
  124.                 stop = (0 == i%fizzNum) ? (( 0 == i%buzzNum) ? 8:4) :
  125.                     (( 0 == i%buzzNum) ? 8 : 8 + ("" + i).length);
  126.                 // add message to tail of accumulator
  127.                 rpt.push((msgs + i).substring( start, stop ));
  128.             }
  129.             return rpt;
  130.         };
  131.  
  132.         function FizzBuzz7( fizzNum, buzzNum, last, accum ) {
  133.             // if first call, allocate accum(ulator)
  134.             if ("undefined" == typeof accum) accum = [];
  135.             // if done, return accum(ulator), i.e., stop at 0
  136.             if (0 == last) return accum;
  137.             // implicit else...
  138.             var isFizz = 0 == last%fizzNum; // is divisible by {fizzNum}
  139.             var isBuzz = 0 == last%buzzNum; // is divisible by {buzzNum}
  140.             // add to head of accumulator
  141.             accum.unshift(
  142.                 ("FizzBuzz" + last).substring(
  143.                     // divisible by {fizzNum} ==> 0
  144.                     // not divisible by {fizzNum} AND
  145.                     //       divisible by {buzzNum}  ==> 4
  146.                     //   not divisible by {buzzNum}  ==> 8
  147.                     isFizz ? 0 : (isBuzz ? 4:8),
  148.                     // divisible by {fizzNum} AND
  149.                     //       divisible by {buzzNum}  ==> 8
  150.                     //   not divisible by {buzzNum}  ==> 4
  151.                     // not divisible by {fizzNum} AND
  152.                     //   not divisible by {buzzNum}  ==> 8 + ("" + last).length
  153.                     isFizz ? (isBuzz ? 8:4) :
  154.                         (isBuzz ? 8 : 8 + ("" + last).length)
  155.                 )
  156.             );
  157.             // recurse for next lower integer
  158.             return FizzBuzz7( fizzNum, buzzNum, last - 1, accum);
  159.         };
  160.  
  161.         function FizzBuzz8( fizzNum, buzzNum, last ) {
  162.             var fizz, buzz, int;
  163.             // initialize report for concatenation
  164.             var rpt = new Array();
  165.             // for each integer, decrementing from {last} to 1, inclusive,...
  166.             for (var i = last; 0 < i; i--) {
  167.                 // set {fizz} to "Fizz", if {i} divisible by {fizzNum} -
  168.                 // otherwise, set to empty string
  169.                 fizz = (0 == i%fizzNum) ? "Fizz":"";
  170.                 // set {buzz} to "Buzz", if {i} divisible by {buzzNum} -
  171.                 // otherwise, set to empty string
  172.                 buzz = (0 == i%buzzNum) ? "Buzz":"";
  173.                 // set {int} to {i}, if {i} divisible by neither {fizzNum}
  174.                 // nor {buzzNum}, i.e., {fizz} and {buzz} both empty -
  175.                 // otherwise, set to empty string
  176.                 int = ( "" == fizz + buzz ) ? i:"";
  177.                 // concatenate all parts and add to head of accumulator
  178.                 rpt.unshift( fizz + buzz + int );
  179.             }
  180.             return rpt;
  181.         };
  182.  
  183.         // count number of functions that have "FizzBuzz" in the name
  184.         function getFbCnt() {
  185.             var fbCnt = 0;
  186.             for (var f in window) {
  187.                 if (
  188.                     window.hasOwnProperty( f ) &&
  189.                     "function" === typeof window[ f ] &&
  190.                     -1 != f.toString().indexOf( "FizzBuzz")
  191.                 ) fbCnt++;
  192.             }
  193.             return fbCnt;
  194.         };
  195.  
  196.         // format array of elements in {rpt} as string of values delimited
  197.         // by comma-space pairs and add report header
  198.         function format( fbName, rpt ) {
  199.             return fbName + ":<br />" +             // header
  200.                 rpt.join().replace( /,/g, ", ") // values
  201.         };
  202.  
  203.         // add string {content} as new paragraph to body (also add new
  204.         // new horizontal rule)
  205.         function write( content ) {
  206.             document.getElementsByTagName( "BODY" )[ 0 ].innerHTML +=
  207.                 "<p>" + content + "</p><hr />";
  208.         };
  209.  
  210.         window.onload = function() {
  211.             var rpt, content, fbName;
  212.             var fbCnt = getFbCnt();
  213.             for (var i = 1; i <= fbCnt; i++) {
  214.                 fbName = "FizzBuzz" + i;
  215.                 rpt = eval( fbName + "(  3, 5, 100 )" );
  216.                 content = format( fbName, rpt);
  217.                 write( content);
  218.             }
  219.         };
  220.     </script>
  221. </head>
  222.  
  223. <body></body>
  224.  
  225. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement