Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <html>
- <head>
- <script>
- // A bunch of JavaScript spins on algorithms to implement the
- // basic idea of FizzBuzz
- // All versions of FizzBuzz*() do the following...
- // for each {i} from 1 to {last}, create an element in
- // an Array of Strings each of which reports:
- // 1) "Fizz", if {i} evenly divisible by {fizzNum}
- // 2) "Buzz", if {i} evenly divisible by {buzzNum}
- // 3) "FizzBuzz", if {i} evenly divisible by both
- // {fizzNum} and {buzzNum}
- // 4) {i} itself, if not evenly divisible by
- // either {fizzNum} or {buzzNum}
- // string value at index j is for integer {j + 1}
- function FizzBuzz1( fizzNum, buzzNum, last ) {
- var fizz, buzz, int;
- var rpt = new Array();
- // for each integer from 1 to {last}, inclusive,...
- for (var i = 1; i <= last; i++) {
- // set {fizz} to "Fizz", if {i} divisible by {fizzNum} -
- // otherwise, set to empty string
- fizz = (0 == i%fizzNum) ? "Fizz":"";
- // set {buzz} to "Buzz", if {i} divisible by {buzzNum} -
- // otherwise, set to empty string
- buzz = (0 == i%buzzNum) ? "Buzz":"";
- // set {int} to {i}, if {i} divisible by neither {fizzNum}
- // nor {buzzNum}, i.e., {fizz} and {buzz} both empty -
- // otherwise, set to empty string
- int = ( "" == fizz + buzz ) ? i:"";
- // concatenate all parts and add to tail of accumulator
- rpt.push( fizz + buzz + int );
- }
- return rpt;
- };
- function FizzBuzz2( fizzNum, buzzNum, last ) {
- var msg;
- var rpt = new Array();
- // for each integer from 1 to {last}, inclusive,...
- for (var i = 1; i <= last; i++) {
- // initialize current message to empty
- msg = "";
- // if {i} divisible by {fizzNum}, add "Fizz" to {msg}
- if (0 == i%fizzNum) msg += "Fizz";
- // if {i} divisible by {buzzNum}, add "Buzz" to {msg}
- if (0 == i%buzzNum) msg += "Buzz";
- // if {msg} empty, assign {i} msg
- if ("" == msg) msg = i;
- // add to tail of accumulator
- rpt.push( msg );
- }
- return rpt;
- };
- function FizzBuzz3( fizzNum, buzzNum, last, accum ) {
- // if first call, allocate accum(ulator)
- if ("undefined" == typeof accum) accum = new Array();
- // if done, return accum(ulator), i.e., stop at 0
- if (0 == last) return accum;
- // implicit {else}...
- // add message for current {last} to head of {accum}
- accum.unshift(
- // if {last} divisible by {fizzNum}, add "Fizz" to {accum}
- ((0 == last%fizzNum) ? "Fizz":"") +
- // if {last} divisible by {buzzNum}, add "Buzz" to {accum}
- ((0 == last%buzzNum) ? "Buzz":"") +
- // if {last} divisible by neither {fizzNum} nor {buzzNum},
- // add {last} to {accum}
- (((0 != last%fizzNum) && (0 != last%buzzNum) ) ? last:"")
- );
- // recurse for next lower integer
- return FizzBuzz3( fizzNum, buzzNum, last - 1, accum);
- };
- function FizzBuzz4( fizzNum, buzzNum, last ) {
- var msgs = ["Fizz", "Buzz", "FizzBuzz", -1];
- var msgIdx;
- var rpt = new Array();
- // for each integer from 1 to {last}, inclusive,...
- for (var i = 1; i <= last; i++) {
- // update for current {i}
- msgs[3] = i;
- // initialize message index out of bounds
- msgIdx = -1;
- // if {i} divisible by {fizzNum}, increment index by 1
- if (0 == i%fizzNum) msgIdx++;
- // if {i} divisible by {buzzNum}, increment index by 2
- if (0 == i%buzzNum) msgIdx += 2;
- // if not yet reset from initial value, set to 3
- if (-1 == msgIdx) msgIdx = 3;
- // add message by index in msgs to tail of accumulator
- rpt.push( msgs[ msgIdx ]);
- }
- return rpt;
- };
- function FizzBuzz5( fizzNum, buzzNum, last ) {
- var msgs = ["Fizz", "Buzz", "FizzBuzz"];
- var msgIdx;
- var rpt = new Array();
- // for each integer from 1 to {last}, inclusive,...
- for (var i = 1; i <= last; i++) {
- msgIdx = ((0 == i%fizzNum) ? 1:0) + ((0 == i%buzzNum) ? 2:0) - 1;
- // add message to tail of accumulator
- rpt.push( (-1 == msgIdx) ? i:msgs[ msgIdx ] );
- }
- return rpt;
- };
- function FizzBuzz6( fizzNum, buzzNum, last ) {
- var msgs = "FizzBuzz";
- // indexes in {msgs + i} for starting and stopping substring()
- var start, stop;
- var rpt = [];
- // for each integer from 1 to {last}, inclusive,...
- for (var i = 1; i <= last; i++) {
- // substring starting index for string (msgs + i)
- start = (0 == i%fizzNum) ? 0 : (( 0 == i%buzzNum) ? 4:8);
- // substring stopping index for string (msgs + i)
- stop = (0 == i%fizzNum) ? (( 0 == i%buzzNum) ? 8:4) :
- (( 0 == i%buzzNum) ? 8 : 8 + ("" + i).length);
- // add message to tail of accumulator
- rpt.push((msgs + i).substring( start, stop ));
- }
- return rpt;
- };
- function FizzBuzz7( fizzNum, buzzNum, last, accum ) {
- // if first call, allocate accum(ulator)
- if ("undefined" == typeof accum) accum = [];
- // if done, return accum(ulator), i.e., stop at 0
- if (0 == last) return accum;
- // implicit else...
- var isFizz = 0 == last%fizzNum; // is divisible by {fizzNum}
- var isBuzz = 0 == last%buzzNum; // is divisible by {buzzNum}
- // add to head of accumulator
- accum.unshift(
- ("FizzBuzz" + last).substring(
- // divisible by {fizzNum} ==> 0
- // not divisible by {fizzNum} AND
- // divisible by {buzzNum} ==> 4
- // not divisible by {buzzNum} ==> 8
- isFizz ? 0 : (isBuzz ? 4:8),
- // divisible by {fizzNum} AND
- // divisible by {buzzNum} ==> 8
- // not divisible by {buzzNum} ==> 4
- // not divisible by {fizzNum} AND
- // not divisible by {buzzNum} ==> 8 + ("" + last).length
- isFizz ? (isBuzz ? 8:4) :
- (isBuzz ? 8 : 8 + ("" + last).length)
- )
- );
- // recurse for next lower integer
- return FizzBuzz7( fizzNum, buzzNum, last - 1, accum);
- };
- function FizzBuzz8( fizzNum, buzzNum, last ) {
- var fizz, buzz, int;
- // initialize report for concatenation
- var rpt = new Array();
- // for each integer, decrementing from {last} to 1, inclusive,...
- for (var i = last; 0 < i; i--) {
- // set {fizz} to "Fizz", if {i} divisible by {fizzNum} -
- // otherwise, set to empty string
- fizz = (0 == i%fizzNum) ? "Fizz":"";
- // set {buzz} to "Buzz", if {i} divisible by {buzzNum} -
- // otherwise, set to empty string
- buzz = (0 == i%buzzNum) ? "Buzz":"";
- // set {int} to {i}, if {i} divisible by neither {fizzNum}
- // nor {buzzNum}, i.e., {fizz} and {buzz} both empty -
- // otherwise, set to empty string
- int = ( "" == fizz + buzz ) ? i:"";
- // concatenate all parts and add to head of accumulator
- rpt.unshift( fizz + buzz + int );
- }
- return rpt;
- };
- // count number of functions that have "FizzBuzz" in the name
- function getFbCnt() {
- var fbCnt = 0;
- for (var f in window) {
- if (
- window.hasOwnProperty( f ) &&
- "function" === typeof window[ f ] &&
- -1 != f.toString().indexOf( "FizzBuzz")
- ) fbCnt++;
- }
- return fbCnt;
- };
- // format array of elements in {rpt} as string of values delimited
- // by comma-space pairs and add report header
- function format( fbName, rpt ) {
- return fbName + ":<br />" + // header
- rpt.join().replace( /,/g, ", ") // values
- };
- // add string {content} as new paragraph to body (also add new
- // new horizontal rule)
- function write( content ) {
- document.getElementsByTagName( "BODY" )[ 0 ].innerHTML +=
- "<p>" + content + "</p><hr />";
- };
- window.onload = function() {
- var rpt, content, fbName;
- var fbCnt = getFbCnt();
- for (var i = 1; i <= fbCnt; i++) {
- fbName = "FizzBuzz" + i;
- rpt = eval( fbName + "( 3, 5, 100 )" );
- content = format( fbName, rpt);
- write( content);
- }
- };
- </script>
- </head>
- <body></body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement