-4

I have been struggling to make this work all day... Something does not seem right with the output like you would expect.

The output that I have now:

1
FIZZ
BUZZ
7
FIZZ
11
13...

It is supposed to look like this:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz...

It seems to be skipping some.

Here is the code: (JavaScript)

var VARIABLES = global;

global.VARIABLES = global;

VARIABLES.CONDITION_TRUE = function(func) {
    return func;
}

VARIABLES.CONDITION_FALSE = CONDITION_TRUE;

VARIABLES.COMPARATOR = function(condition, if_true, if_false) {
    return (condition ?
        FUNCTION_CALL(if_true) : FUNCTION_CALL(if_false));
}

VARIABLES.FUNCTION_CALL = function(func, params) {
    return func.apply(null, params);
}

VARIABLES.MEMBER_FUNCTION_CALL = function(object, name, params) {
    return object[name].apply(object, params);
}

VARIABLES.ARITHMETIC = function(a, b, what) {
    switch(what) {
        case 'plus':
            return a + b;
        case 'minus':
            return a - b;
        case 'divide':
            return a / b;
        case 'multiply':
            return a / b;
        case 'mod':
            return a % b;
        default:
            return a;
    }
}

VARIABLES.ARRAY_MAKE = function(params) {
    return arguments;
}

VARIABLES.OBJECT_LITERAL = function(a) {
    return a;
}

var FUNCTION_DECLARATOR = function(func_name, func_params, func) {
    VARIABLES[func_name] = new Function(func_params, 
        MEMBER_FUNCTION_CALL(func.toString(), 'slice', ARRAY_MAKE(
            ARITHMETIC(
                MEMBER_FUNCTION_CALL(func.toString(), 'indexOf', ARRAY_MAKE('{')),
                1,
                'plus'
            ),
            MEMBER_FUNCTION_CALL(func.toString(), 'lastIndexOf', ARRAY_MAKE('}'))
        )));

    return VARIABLES[func_name];
}

FUNCTION_DECLARATOR('CHECK_RAND', ['RAND'], function() {
    COMPARATOR(RAND > OBJECT_LITERAL(0.5), CONDITION_TRUE(function() {
        FUNCTION_CALL(console.log, ARRAY_MAKE('YES'));
    }),
    CONDITION_FALSE(function() {
        FUNCTION_CALL(console.log, ARRAY_MAKE('NO'));
    }));
});

FUNCTION_CALL(VARIABLES.CHECK_RAND, ARRAY_MAKE(
    FUNCTION_CALL(Math.random,  null)
));

FUNCTION_DECLARATOR('FIZZ_OR_BUZZ', ['NUM'], function() {
    COMPARATOR(ARITHMETIC(NUM, OBJECT_LITERAL(3), 'mod') == OBJECT_LITERAL(0), CONDITION_TRUE(function() {
        FUNCTION_CALL(console.log, ARRAY_MAKE('FIZZ'));
    }),
    CONDITION_FALSE(function() {
        COMPARATOR(ARITHMETIC(NUM, OBJECT_LITERAL(5), 'mod') == OBJECT_LITERAL(0), CONDITION_TRUE(function() {
            FUNCTION_CALL(console.log, ARRAY_MAKE('BUZZ'));
        }),
        CONDITION_FALSE(function() {
            FUNCTION_CALL(console.log, ARRAY_MAKE(NUM));
        }));
    }));
});

FUNCTION_DECLARATOR('TRY_FIZZBUZZ', ['NUM'], function() {
    FUNCTION_CALL(VARIABLES.FIZZ_OR_BUZZ, ARRAY_MAKE(NUM));
    COMPARATOR(NUM > OBJECT_LITERAL(100), CONDITION_TRUE(function() {
        FUNCTION_CALL(console.log, ARRAY_MAKE('DONE'));
    }),
    CONDITION_FALSE(function() {
        FUNCTION_CALL(VARIABLES.TRY_FIZZBUZZ, ARRAY_MAKE(NUM + OBJECT_LITERAL(2))); 
    }));
});


FUNCTION_CALL(VARIABLES.TRY_FIZZBUZZ, ARRAY_MAKE(OBJECT_LITERAL(1)));

This is where I have been tinkering:

FUNCTION_DECLARATOR('FIZZ_OR_BUZZ', ['NUM'], function() {
    COMPARATOR(ARITHMETIC(NUM, OBJECT_LITERAL(3), 'mod') == OBJECT_LITERAL(0), CONDITION_TRUE(function() {
        FUNCTION_CALL(console.log, ARRAY_MAKE('FIZZ'));
    }),
    CONDITION_FALSE(function() {
        COMPARATOR(ARITHMETIC(NUM, OBJECT_LITERAL(5), 'mod') == OBJECT_LITERAL(0), CONDITION_TRUE(function() {
            FUNCTION_CALL(console.log, ARRAY_MAKE('BUZZ'));
        }),
        CONDITION_FALSE(function() {
            FUNCTION_CALL(console.log, ARRAY_MAKE(NUM));
        }));
    }));
});

I implemented the program following this guide: http://c2.com/cgi/wiki?FizzBuzzTest

And I am also adhering to strict programming guidelines.

Thanks!

André Peña
  • 163
  • 3

1 Answers1

0
FUNCTION_CALL(VARIABLES.TRY_FIZZBUZZ, ARRAY_MAKE(NUM + OBJECT_LITERAL(2))); 

change the 2 to 1...