为什么我的fizzbuzz程序无法正常工作?

时间:2015-07-03 08:07:08

标签: javascript fizzbuzz

我一直在努力使这项工作一整天......有些事情似乎与你期望的输出一样。

我现在的输出:

1
FIZZ
BUZZ
7
FIZZ
11
13...

应该看起来像这样:

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

似乎正在跳过一些。

以下是代码:(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)));

这个是我一直在修改的地方:

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));
        }));
    }));
});

我按照本指南实施了该计划:http://c2.com/cgi/wiki?FizzBuzzTest

我也遵守严格的编程指南。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

将2改为1 ......